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

Artifact c950b131584a40121092d735804472f567beefbc:


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: 69 6e 74 20 69 54 6f 70 3b 20 20 20 20 20 20 20  int iTop;       
4710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4720: 20 76 65 72 79 20 62 65 67 69 6e 6e 69 6e 67 20   very beginning 
4730: 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
4740: 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  p */.  int iCont
4750: 69 6e 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  inue;           
4760: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
4770: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
4780: 65 78 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ext record */.  
4790: 69 6e 74 20 69 42 72 65 61 6b 3b 20 20 20 20 20  int iBreak;     
47a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
47b0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
47c0: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
47d0: 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b  */.  int nLevel;
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
47f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73 74  * Number of nest
4800: 65 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  ed 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 6f 72 20  1  /* x=EXPR or 
4dc0: 78 20 49 4e 20 28 2e 2e 2e 29 20 6f 72 20 78 20  x IN (...) or x 
4dd0: 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69  IS NULL */.#defi
4de0: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
4df0: 52 41 4e 47 45 20 30 78 30 30 30 30 30 30 30 32  RANGE 0x00000002
4e00: 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e 64 2f    /* x<EXPR and/
4e10: 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23 64 65  or x>EXPR */.#de
4e20: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
4e30: 4e 5f 49 4e 20 20 20 20 30 78 30 30 30 30 30 30  N_IN    0x000000
4e40: 30 34 20 20 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e  04  /* x IN (...
4e50: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  ) */.#define WHE
4e60: 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20  RE_COLUMN_NULL  
4e70: 30 78 30 30 30 30 30 30 30 38 20 20 2f 2a 20 78  0x00000008  /* x
4e80: 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66   IS NULL */.#def
4e90: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  ine WHERE_CONSTR
4ea0: 41 49 4e 54 20 20 20 30 78 30 30 30 30 30 30 30  AINT   0x0000000
4eb0: 66 20 20 2f 2a 20 41 6e 79 20 6f 66 20 74 68 65  f  /* Any of the
4ec0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 78 78   WHERE_COLUMN_xx
4ed0: 78 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66  x values */.#def
4ee0: 69 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ine WHERE_TOP_LI
4ef0: 4d 49 54 20 20 20 20 30 78 30 30 30 30 30 30 31  MIT    0x0000001
4f00: 30 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20  0  /* x<EXPR or 
4f10: 78 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69  x<=EXPR constrai
4f20: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  nt */.#define WH
4f30: 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20  ERE_BTM_LIMIT   
4f40: 20 30 78 30 30 30 30 30 30 32 30 20 20 2f 2a 20   0x00000020  /* 
4f50: 78 3e 45 58 50 52 20 6f 72 20 78 3e 3d 45 58 50  x>EXPR or x>=EXP
4f60: 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  R constraint */.
4f70: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42 4f  #define WHERE_BO
4f80: 54 48 5f 4c 49 4d 49 54 20 20 20 30 78 30 30 30  TH_LIMIT   0x000
4f90: 30 30 30 33 30 20 20 2f 2a 20 42 6f 74 68 20 78  00030  /* Both x
4fa0: 3e 45 58 50 52 20 61 6e 64 20 78 3c 45 58 50 52  >EXPR and x<EXPR
4fb0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
4fc0: 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20 20 20 30  E_IDX_ONLY     0
4fd0: 78 30 30 30 30 30 30 34 30 20 20 2f 2a 20 55 73  x00000040  /* Us
4fe0: 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2d 20 6f  e index only - o
4ff0: 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65  mit table */.#de
5000: 66 69 6e 65 20 57 48 45 52 45 5f 49 50 4b 20 20  fine WHERE_IPK  
5010: 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30 31          0x000001
5020: 30 30 20 20 2f 2a 20 78 20 69 73 20 74 68 65 20  00  /* x is the 
5030: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
5040: 4b 45 59 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  KEY */.#define W
5050: 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20 20  HERE_INDEXED    
5060: 20 20 30 78 30 30 30 30 30 32 30 30 20 20 2f 2a    0x00000200  /*
5070: 20 57 68 65 72 65 4c 6f 6f 70 2e 75 2e 62 74 72   WhereLoop.u.btr
5080: 65 65 2e 70 49 6e 64 65 78 20 69 73 20 76 61 6c  ee.pIndex is val
5090: 69 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  id */.#define WH
50a0: 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
50b0: 20 30 78 30 30 30 30 30 34 30 30 20 20 2f 2a 20   0x00000400  /* 
50c0: 57 68 65 72 65 4c 6f 6f 70 2e 75 2e 76 74 61 62  WhereLoop.u.vtab
50d0: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65   is valid */.#de
50e0: 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42  fine WHERE_IN_AB
50f0: 4c 45 20 20 20 20 20 20 30 78 30 30 30 30 30 38  LE      0x000008
5100: 30 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73  00  /* Able to s
5110: 75 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65  upport an IN ope
5120: 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65  rator */.#define
5130: 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 20 20   WHERE_ONEROW   
5140: 20 20 20 20 30 78 30 30 30 30 31 30 30 30 20 20      0x00001000  
5150: 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f  /* Selects no mo
5160: 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20  re than one row 
5170: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5180: 5f 4d 55 4c 54 49 5f 4f 52 20 20 20 20 20 30 78  _MULTI_OR     0x
5190: 30 30 30 30 32 30 30 30 20 20 2f 2a 20 4f 52 20  00002000  /* OR 
51a0: 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69  using multiple i
51b0: 6e 64 69 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e  ndices */.#defin
51c0: 65 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  e WHERE_TEMP_IND
51d0: 45 58 20 20 20 30 78 30 30 30 30 34 30 30 30 20  EX   0x00004000 
51e0: 20 2f 2a 20 55 73 65 73 20 61 6e 20 65 70 68 65   /* Uses an ephe
51f0: 6d 65 72 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a  meral index */..
5200: 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 57 68  ./* Convert a Wh
5210: 65 72 65 43 6f 73 74 20 76 61 6c 75 65 20 28 31  ereCost value (1
5220: 30 20 74 69 6d 65 73 20 6c 6f 67 32 28 58 29 29  0 times log2(X))
5230: 20 69 6e 74 6f 20 69 74 73 20 69 6e 74 65 67 65   into its intege
5240: 72 20 76 61 6c 75 65 20 58 2e 0a 2a 2a 20 41 20  r value X..** A 
5250: 72 6f 75 67 68 20 61 70 70 72 6f 78 69 6d 61 74  rough approximat
5260: 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 54 68  ion is used.  Th
5270: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
5280: 20 69 73 20 6e 6f 74 20 65 78 61 63 74 2e 0a 2a   is not exact..*
5290: 2f 0a 73 74 61 74 69 63 20 75 36 34 20 77 68 65  /.static u64 whe
52a0: 72 65 43 6f 73 74 54 6f 49 6e 74 28 57 68 65 72  reCostToInt(Wher
52b0: 65 43 6f 73 74 20 78 29 7b 0a 20 20 75 36 34 20  eCost x){.  u64 
52c0: 6e 3b 0a 20 20 69 66 28 20 78 3c 31 30 20 29 20  n;.  if( x<10 ) 
52d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 6e 20 3d 20  return 1;.  n = 
52e0: 78 25 31 30 3b 0a 20 20 78 20 2f 3d 20 31 30 3b  x%10;.  x /= 10;
52f0: 0a 20 20 69 66 28 20 6e 3e 3d 35 20 29 20 6e 20  .  if( n>=5 ) n 
5300: 2d 3d 20 32 3b 0a 20 20 65 6c 73 65 20 69 66 28  -= 2;.  else if(
5310: 20 6e 3e 3d 31 20 29 20 6e 20 2d 3d 20 31 3b 0a   n>=1 ) n -= 1;.
5320: 20 20 69 66 28 20 78 3e 3d 33 20 29 20 72 65 74    if( x>=3 ) ret
5330: 75 72 6e 20 28 6e 2b 38 29 3c 3c 28 78 2d 33 29  urn (n+8)<<(x-3)
5340: 3b 0a 20 20 72 65 74 75 72 6e 20 28 6e 2b 38 29  ;.  return (n+8)
5350: 3e 3e 28 33 2d 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >>(3-x);.}../*.*
5360: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73 74  * Return the est
5370: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
5380: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72 6f   output rows fro
5390: 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  m a WHERE clause
53a0: 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 57  .*/.u64 sqlite3W
53b0: 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
53c0: 6e 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nt(WhereInfo *pW
53d0: 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20  Info){.  return 
53e0: 77 68 65 72 65 43 6f 73 74 54 6f 49 6e 74 28 70  whereCostToInt(p
53f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
5400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
5420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
5430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
5440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
5450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
5460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
5470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
5480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
5490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
54a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
54b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
54c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
54d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
54e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
54f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
5500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
5510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
5520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
5530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
5540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
5550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
5560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
5570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
5580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
5590: 3e 62 4f 42 53 61 74 21 3d 30 3b 0a 7d 0a 0a 2f  >bOBSat!=0;.}../
55a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
55b0: 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20  VDBE address or 
55c0: 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
55d0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e   in order to con
55e0: 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61  tinue.** immedia
55f0: 74 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e 65  tely with the ne
5600: 78 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45 52  xt row of a WHER
5610: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  E clause..*/.int
5620: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
5630: 74 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72 65  tinueLabel(Where
5640: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
5650: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
5660: 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  iContinue;.}../*
5670: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
5680: 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c  DBE address or l
5690: 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
56a0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61  in order to brea
56b0: 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48  k.** out of a WH
56c0: 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ERE loop..*/.int
56d0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
56e0: 61 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  akLabel(WhereInf
56f0: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
5700: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72  turn pWInfo->iBr
5710: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eak;.}../*.** Re
5720: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20  turn TRUE if an 
5730: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
5740: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f   statement can o
5750: 70 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20  perate directly 
5760: 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73  on.** the rowids
5770: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57   returned by a W
5780: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65  HERE clause.  Re
5790: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f  turn FALSE if do
57a0: 69 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45  ing an.** UPDATE
57b0: 20 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74   or DELETE might
57c0: 20 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65   change subseque
57d0: 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  nt WHERE clause 
57e0: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 69 6e 74 20  results..*/.int 
57f0: 73 71 6c 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e  sqlite3WhereOkOn
5800: 65 50 61 73 73 28 57 68 65 72 65 49 6e 66 6f 20  ePass(WhereInfo 
5810: 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75  *pWInfo){.  retu
5820: 72 6e 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  rn pWInfo->okOne
5830: 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Pass;.}../*.** I
5840: 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61  nitialize a prea
5850: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c  llocated WhereCl
5860: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ause structure..
5870: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
5880: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a  hereClauseInit(.
5890: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
58a0: 57 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  WC,        /* Th
58b0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f  e WhereClause to
58c0: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
58d0: 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
58e0: 70 57 49 6e 66 6f 20 20 20 20 20 20 20 20 2f 2a  pWInfo        /*
58f0: 20 54 68 65 20 57 48 45 52 45 20 70 72 6f 63 65   The WHERE proce
5900: 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ssing context */
5910: 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 57 49 6e 66  .){.  pWC->pWInf
5920: 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 70 57  o = pWInfo;.  pW
5930: 43 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a 20  C->pOuter = 0;. 
5940: 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b   pWC->nTerm = 0;
5950: 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20  .  pWC->nSlot = 
5960: 41 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e 61  ArraySize(pWC->a
5970: 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e  Static);.  pWC->
5980: 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63  a = pWC->aStatic
5990: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
59a0: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
59b0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
59c0: 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43  auseClear(WhereC
59d0: 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  lause*);../*.** 
59e0: 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d  Deallocate all m
59f0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
5a00: 20 77 69 74 68 20 61 20 57 68 65 72 65 4f 72 49   with a WhereOrI
5a10: 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  nfo object..*/.s
5a20: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
5a30: 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  OrInfoDelete(sql
5a40: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f  ite3 *db, WhereO
5a50: 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65  rInfo *p){.  whe
5a60: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
5a70: 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->wc);.  sqlite3
5a80: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
5a90: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
5aa0: 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  te all memory as
5ab0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
5ac0: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a  WhereAndInfo obj
5ad0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
5ae0: 6f 69 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f  oid whereAndInfo
5af0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
5b00: 64 62 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f  db, WhereAndInfo
5b10: 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61   *p){.  whereCla
5b20: 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29  useClear(&p->wc)
5b30: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
5b40: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
5b50: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
5b60: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
5b70: 63 74 75 72 65 2e 20 20 54 68 65 20 57 68 65 72  cture.  The Wher
5b80: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
5b90: 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e  e.** itself is n
5ba0: 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69 73 20  ot freed.  This 
5bb0: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 69  routine is the i
5bc0: 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72 65 43  nverse of whereC
5bd0: 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a  lauseInit()..*/.
5be0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
5bf0: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65  eClauseClear(Whe
5c00: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a  reClause *pWC){.
5c10: 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
5c20: 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74  Term *a;.  sqlit
5c30: 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57  e3 *db = pWC->pW
5c40: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
5c50: 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  ;.  for(i=pWC->n
5c60: 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61  Term-1, a=pWC->a
5c70: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b  ; i>=0; i--, a++
5c80: 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74  ){.    if( a->wt
5c90: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e  Flags & TERM_DYN
5ca0: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71  AMIC ){.      sq
5cb0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5cc0: 64 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20  db, a->pExpr);. 
5cd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e     }.    if( a->
5ce0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
5cf0: 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77  RINFO ){.      w
5d00: 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65  hereOrInfoDelete
5d10: 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66  (db, a->u.pOrInf
5d20: 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  o);.    }else if
5d30: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
5d40: 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20  ERM_ANDINFO ){. 
5d50: 20 20 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66       whereAndInf
5d60: 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75  oDelete(db, a->u
5d70: 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20  .pAndInfo);.    
5d80: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d  }.  }.  if( pWC-
5d90: 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63  >a!=pWC->aStatic
5da0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
5db0: 62 46 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61  bFree(db, pWC->a
5dc0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5dd0: 41 64 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  Add a single new
5de0: 20 57 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79   WhereTerm entry
5df0: 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61   to the WhereCla
5e00: 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a  use object pWC..
5e10: 2a 2a 20 54 68 65 20 6e 65 77 20 57 68 65 72 65  ** The new Where
5e20: 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63  Term object is c
5e30: 6f 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20  onstructed from 
5e40: 45 78 70 72 20 70 20 61 6e 64 20 77 69 74 68 20  Expr p and with 
5e50: 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20  wtFlags..** The 
5e60: 69 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b  index in pWC->a[
5e70: 5d 20 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65  ] of the new Whe
5e80: 72 65 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e  reTerm is return
5e90: 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  ed on success..*
5ea0: 2a 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20  * 0 is returned 
5eb0: 69 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65  if the new Where
5ec0: 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  Term could not b
5ed0: 65 20 61 64 64 65 64 20 64 75 65 20 74 6f 20 61  e added due to a
5ee0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63   memory.** alloc
5ef0: 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68  ation error.  Th
5f00: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
5f10: 69 6f 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c  ion failure will
5f20: 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a   be recorded in.
5f30: 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  ** the db->mallo
5f40: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20  cFailed flag so 
5f50: 74 68 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65  that higher-leve
5f60: 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20  l functions can 
5f70: 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a  detect it..**.**
5f80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
5f90: 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ll increase the 
5fa0: 73 69 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d  size of the pWC-
5fb0: 3e 61 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65  >a[] array as ne
5fc0: 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  cessary..**.** I
5fd0: 66 20 74 68 65 20 77 74 46 6c 61 67 73 20 61 72  f the wtFlags ar
5fe0: 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20  gument includes 
5ff0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68  TERM_DYNAMIC, th
6000: 65 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  en responsibilit
6010: 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67  y.** for freeing
6020: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6030: 70 20 69 73 20 61 73 73 75 6d 65 64 20 62 79 20  p is assumed by 
6040: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
6050: 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54  object pWC..** T
6060: 68 69 73 20 69 73 20 74 72 75 65 20 65 76 65 6e  his is true even
6070: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
6080: 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61   fails to alloca
6090: 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 54 65  te a new WhereTe
60a0: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  rm..**.** WARNIN
60b0: 47 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  G:  This routine
60c0: 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74   might reallocat
60d0: 65 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  e the space used
60e0: 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65   to store.** Whe
60f0: 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f  reTerms.  All po
6100: 69 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65 54  inters to WhereT
6110: 65 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69  erms should be i
6120: 6e 76 61 6c 69 64 61 74 65 64 20 61 66 74 65 72  nvalidated after
6130: 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  .** calling this
6140: 20 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20   routine.  Such 
6150: 70 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20  pointers may be 
6160: 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  reinitialized by
6170: 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20   referencing.** 
6180: 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72  the pWC->a[] arr
6190: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
61a0: 74 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  t whereClauseIns
61b0: 65 72 74 28 57 68 65 72 65 43 6c 61 75 73 65 20  ert(WhereClause 
61c0: 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75  *pWC, Expr *p, u
61d0: 38 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68  8 wtFlags){.  Wh
61e0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
61f0: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73    int idx;.  tes
6200: 74 63 61 73 65 28 20 77 74 46 6c 61 67 73 20 26  tcase( wtFlags &
6210: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
6220: 20 20 2f 2a 20 45 56 3a 20 52 2d 30 30 32 31 31    /* EV: R-00211
6230: 2d 31 35 31 30 30 20 2a 2f 0a 20 20 69 66 28 20  -15100 */.  if( 
6240: 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d  pWC->nTerm>=pWC-
6250: 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68  >nSlot ){.    Wh
6260: 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20  ereTerm *pOld = 
6270: 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69  pWC->a;.    sqli
6280: 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70  te3 *db = pWC->p
6290: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
62a0: 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  b;.    pWC->a = 
62b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
62c0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57  aw(db, sizeof(pW
62d0: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53  C->a[0])*pWC->nS
62e0: 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  lot*2 );.    if(
62f0: 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20   pWC->a==0 ){.  
6300: 20 20 20 20 69 66 28 20 77 74 46 6c 61 67 73 20      if( wtFlags 
6310: 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29  & TERM_DYNAMIC )
6320: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6330: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6340: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6350: 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b    pWC->a = pOld;
6360: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
6370: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
6380: 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20  y(pWC->a, pOld, 
6390: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
63a0: 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20  )*pWC->nTerm);. 
63b0: 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43     if( pOld!=pWC
63c0: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
63d0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
63e0: 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20  (db, pOld);.    
63f0: 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74  }.    pWC->nSlot
6400: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6410: 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e  ocSize(db, pWC->
6420: 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  a)/sizeof(pWC->a
6430: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72  [0]);.  }.  pTer
6440: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20  m = &pWC->a[idx 
6450: 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b  = pWC->nTerm++];
6460: 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  .  pTerm->pExpr 
6470: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
6480: 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20 70  pCollate(p);.  p
6490: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20  Term->wtFlags = 
64a0: 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d  wtFlags;.  pTerm
64b0: 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70  ->pWC = pWC;.  p
64c0: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
64d0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78  -1;.  return idx
64e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
64f0: 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69  routine identifi
6500: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
6510: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
6520: 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65  lause where.** e
6530: 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f  ach subexpressio
6540: 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
6550: 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74  y the AND operat
6560: 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  or or some other
6570: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65  .** operator spe
6580: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70  cified in the op
6590: 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65   parameter.  The
65a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
65b0: 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c  ucture.** is fil
65c0: 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72  led with pointer
65d0: 73 20 74 6f 20 73 75 62 65 78 70 72 65 73 73 69  s to subexpressi
65e0: 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ons.  For exampl
65f0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52  e:.**.**    WHER
6600: 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e  E  a=='hello' AN
6610: 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29  D coalesce(b,11)
6620: 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64  <10 AND (c+12!=d
6630: 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20   OR c==22).**   
6640: 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
6650: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
6660: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
6670: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
6680: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73 6c  **            sl
6690: 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20  ot[0]           
66a0: 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20   slot[1]        
66b0: 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a         slot[2].*
66c0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
66d0: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
66e0: 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74  n pExpr is unalt
66f0: 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20  ered.  All this 
6700: 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20  routine.** does 
6710: 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65  is make slot[] e
6720: 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20  ntries point to 
6730: 73 75 62 73 74 72 75 63 74 75 72 65 20 77 69 74  substructure wit
6740: 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a  hin pExpr..**.**
6750: 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   In the previous
6760: 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e   sentence and in
6770: 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73   the diagram, "s
6780: 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f  lot[]" refers to
6790: 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61  .** the WhereCla
67a0: 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20  use.a[] array.  
67b0: 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79  The slot[] array
67c0: 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64   grows as needed
67d0: 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61   to contain.** a
67e0: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
67f0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f  WHERE clause..*/
6800: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
6810: 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61  reSplit(WhereCla
6820: 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
6830: 70 45 78 70 72 2c 20 75 38 20 6f 70 29 7b 0a 20  pExpr, u8 op){. 
6840: 20 70 57 43 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20   pWC->op = op;. 
6850: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
6860: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
6870: 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20  xpr->op!=op ){. 
6880: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
6890: 73 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c  sert(pWC, pExpr,
68a0: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
68b0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
68c0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
68d0: 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70  op);.    whereSp
68e0: 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e  lit(pWC, pExpr->
68f0: 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d  pRight, op);.  }
6900: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
6910: 6c 69 7a 65 20 61 20 57 68 65 72 65 4d 61 73 6b  lize a WhereMask
6920: 53 65 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 23 64  Set object.*/.#d
6930: 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65  efine initMaskSe
6940: 74 28 50 29 20 20 28 50 29 2d 3e 6e 3d 30 0a 0a  t(P)  (P)->n=0..
6950: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6960: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
6970: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
6980: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
6990: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
69a0: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
69b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
69c0: 73 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65  sk getMask(Where
69d0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
69e0: 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b  t, int iCursor){
69f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
6a00: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c  rt( pMaskSet->n<
6a10: 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74  =(int)sizeof(Bit
6a20: 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72  mask)*8 );.  for
6a30: 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74  (i=0; i<pMaskSet
6a40: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ->n; i++){.    i
6a50: 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  f( pMaskSet->ix[
6a60: 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  i]==iCursor ){. 
6a70: 20 20 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b       return MASK
6a80: 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20  BIT(i);.    }.  
6a90: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
6aa0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
6ab0: 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72  new mask for cur
6ac0: 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a  sor iCursor..**.
6ad0: 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  ** There is one 
6ae0: 63 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65  cursor per table
6af0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
6b00: 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  use.  The number
6b10: 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e   of.** tables in
6b20: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
6b30: 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61   is limited by a
6b40: 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74   test early in t
6b50: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  he.** sqlite3Whe
6b60: 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e  reBegin() routin
6b70: 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74  e.  So we know t
6b80: 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74  hat the pMaskSet
6b90: 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20  ->ix[].** array 
6ba0: 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66  will never overf
6bb0: 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  low..*/.static v
6bc0: 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57  oid createMask(W
6bd0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
6be0: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
6bf0: 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  or){.  assert( p
6c00: 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72  MaskSet->n < Arr
6c10: 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d  aySize(pMaskSet-
6c20: 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53  >ix) );.  pMaskS
6c30: 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d  et->ix[pMaskSet-
6c40: 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b  >n++] = iCursor;
6c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
6c60: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 20 28 72 65  routine walk (re
6c70: 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78  cursively) an ex
6c80: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
6c90: 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61  d generates.** a
6ca0: 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74   bitmask indicat
6cb0: 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73  ing which tables
6cc0: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61   are used in tha
6cd0: 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  t expression.** 
6ce0: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
6cf0: 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74  Bitmask exprList
6d00: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
6d10: 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69  MaskSet*, ExprLi
6d20: 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  st*);.static Bit
6d30: 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54  mask exprSelectT
6d40: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
6d50: 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a  askSet*, Select*
6d60: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
6d70: 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  k exprTableUsage
6d80: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
6d90: 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70  MaskSet, Expr *p
6da0: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  ){.  Bitmask mas
6db0: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d  k = 0;.  if( p==
6dc0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6dd0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
6de0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b  LUMN ){.    mask
6df0: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
6e00: 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b  Set, p->iTable);
6e10: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b  .    return mask
6e20: 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65  ;.  }.  mask = e
6e30: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
6e40: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68  askSet, p->pRigh
6e50: 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78  t);.  mask |= ex
6e60: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
6e70: 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29  skSet, p->pLeft)
6e80: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
6e90: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
6ea0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
6eb0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65  mask |= exprSele
6ec0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
6ed0: 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c  skSet, p->x.pSel
6ee0: 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ect);.  }else{. 
6ef0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
6f00: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
6f10: 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69  askSet, p->x.pLi
6f20: 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  st);.  }.  retur
6f30: 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63  n mask;.}.static
6f40: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73   Bitmask exprLis
6f50: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
6f60: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
6f70: 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  et, ExprList *pL
6f80: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
6f90: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
6fa0: 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  0;.  if( pList )
6fb0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
6fc0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
6fd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20  ++){.      mask 
6fe0: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
6ff0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
7000: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
7010: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7020: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69  rn mask;.}.stati
7030: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65  c Bitmask exprSe
7040: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57  lectTableUsage(W
7050: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
7060: 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70  skSet, Select *p
7070: 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61  S){.  Bitmask ma
7080: 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  sk = 0;.  while(
7090: 20 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69   pS ){.    SrcLi
70a0: 73 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70  st *pSrc = pS->p
70b0: 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  Src;.    mask |=
70c0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
70d0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
70e0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d  ->pEList);.    m
70f0: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
7100: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
7110: 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  et, pS->pGroupBy
7120: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
7130: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
7140: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
7150: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d  pOrderBy);.    m
7160: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
7170: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
7180: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
7190: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
71a0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
71b0: 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  , pS->pHaving);.
71c0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
71d0: 53 72 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Src!=0) ){.     
71e0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
71f0: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
7200: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
7210: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53     mask |= exprS
7220: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
7230: 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e  pMaskSet, pSrc->
7240: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
7250: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65         mask |= e
7260: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
7270: 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b  askSet, pSrc->a[
7280: 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d  i].pOn);.      }
7290: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20  .    }.    pS = 
72a0: 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  pS->pPrior;.  }.
72b0: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
72c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
72d0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
72e0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65   operator is one
72f0: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
7300: 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c  s that is.** all
7310: 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65  owed for an inde
7320: 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  xable WHERE clau
7330: 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c  se term.  The al
7340: 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20  lowed operators 
7350: 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c  are.** "=", "<",
7360: 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22   ">", "<=", ">="
7370: 2c 20 22 49 4e 22 2c 20 61 6e 64 20 22 49 53 20  , "IN", and "IS 
7380: 4e 55 4c 4c 22 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c  NULL".**.** IMPL
7390: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
73a0: 2d 35 39 39 32 36 2d 32 36 33 39 33 20 54 6f 20  -59926-26393 To 
73b0: 62 65 20 75 73 61 62 6c 65 20 62 79 20 61 6e 20  be usable by an 
73c0: 69 6e 64 65 78 20 61 20 74 65 72 6d 20 6d 75 73  index a term mus
73d0: 74 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f  t be.** of one o
73e0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
73f0: 66 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20  forms: column = 
7400: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d  expression colum
7410: 6e 20 3e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  n > expression.*
7420: 2a 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70 72  * column >= expr
7430: 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20  ession column < 
7440: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d  expression colum
7450: 6e 20 3c 3d 20 65 78 70 72 65 73 73 69 6f 6e 0a  n <= expression.
7460: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3d 20  ** expression = 
7470: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
7480: 6e 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  n > column expre
7490: 73 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a  ssion >= column.
74a0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 20  ** expression < 
74b0: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
74c0: 6e 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75  n <= column colu
74d0: 6d 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72 65 73  mn IN.** (expres
74e0: 73 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c 75 6d  sion-list) colum
74f0: 6e 20 49 4e 20 28 73 75 62 71 75 65 72 79 29 20  n IN (subquery) 
7500: 63 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a  column IS NULL.*
7510: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
7520: 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a  owedOp(int op){.
7530: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e    assert( TK_GT>
7540: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54  TK_EQ && TK_GT<T
7550: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
7560: 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26  ( TK_LT>TK_EQ &&
7570: 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LT<TK_GE );.
7580: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e    assert( TK_LE>
7590: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54  TK_EQ && TK_LE<T
75a0: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
75b0: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34  ( TK_GE==TK_EQ+4
75c0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d   );.  return op=
75d0: 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54  =TK_IN || (op>=T
75e0: 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47  K_EQ && op<=TK_G
75f0: 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  E) || op==TK_ISN
7600: 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77  ULL;.}../*.** Sw
7610: 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f  ap two objects o
7620: 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a  f type TYPE..*/.
7630: 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50  #define SWAP(TYP
7640: 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41  E,A,B) {TYPE t=A
7650: 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a  ; A=B; B=t;}../*
7660: 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f  .** Commute a co
7670: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
7680: 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20  r.  Expressions 
7690: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f  of the form "X o
76a0: 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76  p Y".** are conv
76b0: 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70  erted into "Y op
76c0: 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65   X"..**.** If le
76d0: 66 74 2f 72 69 67 68 74 20 70 72 65 63 65 64 65  ft/right precede
76e0: 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69  nce rules come i
76f0: 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65  nto play when de
7700: 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  termining the.**
7710: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
7720: 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54  nce, then COLLAT
7730: 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  E operators are 
7740: 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73 75  adjusted to ensu
7750: 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  re.** that the c
7760: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
7770: 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67  e does not chang
7780: 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
7790: 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e  .** "Y collate N
77a0: 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f  OCASE op X" beco
77b0: 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62 65 63  mes "X op Y" bec
77c0: 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69  ause any collati
77d0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a  on sequence on.*
77e0: 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  * the left hand 
77f0: 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72  side of a compar
7800: 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  ison overrides a
7810: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
7820: 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68  uence .** attach
7830: 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e  ed to the right.
7840: 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65   For the same re
7850: 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c  ason the EP_Coll
7860: 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e  ate flag.** is n
7870: 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a  ot commuted..*/.
7880: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
7890: 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70  Commute(Parse *p
78a0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
78b0: 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69  pr){.  u16 expRi
78c0: 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52  ght = (pExpr->pR
78d0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
78e0: 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36  _Collate);.  u16
78f0: 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70   expLeft = (pExp
7900: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
7910: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20  & EP_Collate);. 
7920: 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64   assert( allowed
7930: 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26  Op(pExpr->op) &&
7940: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
7950: 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69  N );.  if( expRi
7960: 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a  ght==expLeft ){.
7970: 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20      /* Either X 
7980: 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20  and Y both have 
7990: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
79a0: 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a   or neither do *
79b0: 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67  /.    if( expRig
79c0: 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42  ht ){.      /* B
79d0: 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65  oth X and Y have
79e0: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
79f0: 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58  rs.  Make sure X
7a00: 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20   is always.     
7a10: 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61   ** used by clea
7a20: 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c  ring the EP_Coll
7a30: 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e  ate flag from Y.
7a40: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
7a50: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26  >pRight->flags &
7a60: 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20  = ~EP_Collate;. 
7a70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
7a80: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
7a90: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
7aa0: 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
7ab0: 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e    /* Neither X n
7ac0: 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54  or Y have COLLAT
7ad0: 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74  E operators, but
7ae0: 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66   X has a non-def
7af0: 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ault.      ** co
7b00: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
7b10: 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50  .  So add the EP
7b20: 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20  _Collate marker 
7b30: 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20  on X to cause.  
7b40: 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20      ** it to be 
7b50: 73 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20  searched first. 
7b60: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
7b70: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pLeft->flags |= 
7b80: 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  EP_Collate;.    
7b90: 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70  }.  }.  SWAP(Exp
7ba0: 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r*,pExpr->pRight
7bb0: 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  ,pExpr->pLeft);.
7bc0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e    if( pExpr->op>
7bd0: 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73  =TK_GT ){.    as
7be0: 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
7bf0: 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  GT+2 );.    asse
7c00: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45  rt( TK_GE==TK_LE
7c10: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
7c20: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b  ( TK_GT>TK_EQ );
7c30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
7c40: 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  GT<TK_LE );.    
7c50: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
7c60: 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70  p>=TK_GT && pExp
7c70: 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a  r->op<=TK_GE );.
7c80: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
7c90: 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47  ((pExpr->op-TK_G
7ca0: 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d  T)^2)+TK_GT;.  }
7cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c  .}../*.** Transl
7cc0: 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f  ate from TK_xx o
7cd0: 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78  perator to WO_xx
7ce0: 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61   bitmask..*/.sta
7cf0: 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72  tic u16 operator
7d00: 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20  Mask(int op){.  
7d10: 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28  u16 c;.  assert(
7d20: 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29   allowedOp(op) )
7d30: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  ;.  if( op==TK_I
7d40: 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  N ){.    c = WO_
7d50: 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
7d60: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
7d70: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55  .    c = WO_ISNU
7d80: 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
7d90: 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c   assert( (WO_EQ<
7da0: 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30  <(op-TK_EQ)) < 0
7db0: 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d  x7fff );.    c =
7dc0: 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f   (u16)(WO_EQ<<(o
7dd0: 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20  p-TK_EQ));.  }. 
7de0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
7df0: 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f  ISNULL || c==WO_
7e00: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  ISNULL );.  asse
7e10: 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c  rt( op!=TK_IN ||
7e20: 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61   c==WO_IN );.  a
7e30: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51  ssert( op!=TK_EQ
7e40: 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a   || c==WO_EQ );.
7e50: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
7e60: 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20  _LT || c==WO_LT 
7e70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
7e80: 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LE || c==WO_
7e90: 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LE );.  assert( 
7ea0: 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d  op!=TK_GT || c==
7eb0: 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_GT );.  asser
7ec0: 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  t( op!=TK_GE || 
7ed0: 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65  c==WO_GE );.  re
7ee0: 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
7ef0: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
7f00: 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74  next WhereTerm t
7f10: 68 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f  hat matches acco
7f20: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69  rding to the cri
7f30: 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69  teria.** establi
7f40: 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53  shed when the pS
7f50: 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69  can object was i
7f60: 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68  nitialized by wh
7f70: 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a  ereScanInit()..*
7f80: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
7f90: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
7fa0: 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72  re matching Wher
7fb0: 65 54 65 72 6d 73 2e 0a 2a 2f 0a 57 68 65 72 65  eTerms..*/.Where
7fc0: 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e  Term *whereScanN
7fd0: 65 78 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70  ext(WhereScan *p
7fe0: 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75  Scan){.  int iCu
7ff0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
8000: 20 54 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74   The cursor on t
8010: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65  he LHS of the te
8020: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rm */.  int iCol
8030: 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  umn;         /* 
8040: 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  The column on th
8050: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72  e LHS of the ter
8060: 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a  m.  -1 for IPK *
8070: 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20  /.  Expr *pX;   
8080: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
8090: 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20  xpression being 
80a0: 74 65 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72  tested */.  Wher
80b0: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
80c0: 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f   /* Shorthand fo
80d0: 72 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a  r pScan->pWC */.
80e0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
80f0: 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65  rm;    /* The te
8100: 72 6d 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  rm being tested 
8110: 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63  */.  int k = pSc
8120: 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65  an->k;    /* Whe
8130: 72 65 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e  re to start scan
8140: 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c 65  ning */..  while
8150: 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c  ( pScan->iEquiv<
8160: 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29  =pScan->nEquiv )
8170: 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53 63  {.    iCur = pSc
8180: 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e  an->aEquiv[pScan
8190: 2d 3e 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20 20  ->iEquiv-2];.   
81a0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61 6e   iColumn = pScan
81b0: 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e  ->aEquiv[pScan->
81c0: 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 77  iEquiv-1];.    w
81d0: 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63  hile( (pWC = pSc
81e0: 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20  an->pWC)!=0 ){. 
81f0: 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70       for(pTerm=p
8200: 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e  WC->a+k; k<pWC->
8210: 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72  nTerm; k++, pTer
8220: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
8230: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
8240: 73 6f 72 3d 3d 69 43 75 72 20 26 26 20 70 54 65  sor==iCur && pTe
8250: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
8260: 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
8270: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
8280: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8290: 4f 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20  O_EQUIV)!=0.    
82a0: 20 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d         && pScan-
82b0: 3e 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a  >nEquiv<ArraySiz
82c0: 65 28 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29  e(pScan->aEquiv)
82d0: 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
82e0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
82f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20  .            pX 
8300: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
8310: 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e  pCollate(pTerm->
8320: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
8330: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
8340: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43  rt( pX->op==TK_C
8350: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
8360: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
8370: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a  pScan->nEquiv; j
8380: 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +=2){.          
8390: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61      if( pScan->a
83a0: 45 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54  Equiv[j]==pX->iT
83b0: 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
83c0: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45      && pScan->aE
83d0: 71 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69  quiv[j+1]==pX->i
83e0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
8400: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
8410: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
8420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8430: 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69   j==pScan->nEqui
8440: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  v ){.           
8450: 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76     pScan->aEquiv
8460: 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  [j] = pX->iTable
8470: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8480: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b  pScan->aEquiv[j+
8490: 31 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e  1] = pX->iColumn
84a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
84b0: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d  pScan->nEquiv +=
84c0: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   2;.            
84d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
84e0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
84f0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8500: 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d  pScan->opMask)!=
8510: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8520: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61   /* Verify the a
8530: 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c  ffinity and coll
8540: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d  ating sequence m
8550: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
8560: 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a      if( pScan->z
8570: 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65  CollName && (pTe
8580: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
8590: 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b  WO_ISNULL)==0 ){
85a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43  .              C
85b0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72               Par
85d0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
85e0: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
85f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8600: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
8610: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
8620: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
8630: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
8640: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20   pScan->idxaff) 
8650: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8660: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8670: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8680: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
8690: 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t(pX->pLeft);.  
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
86b0: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
86c0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
86d0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8700: 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c            pX->pL
8710: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
8720: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8730: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
8740: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
8750: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
8760: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8770: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
8780: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63  Coll->zName, pSc
8790: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29  an->zCollName) )
87a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
87b0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
87c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
87d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
87e0: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
87f0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
8800: 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 20 20 20  _EQ)!=0.        
8810: 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54       && (pX = pT
8820: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
8830: 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ht)->op==TK_COLU
8840: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  MN.             
8850: 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pX->iTable==p
8860: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a  Scan->aEquiv[0].
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
8880: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63  pX->iColumn==pSc
8890: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20  an->aEquiv[1].  
88a0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
88b0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
88c0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
88d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
88e0: 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20  Scan->k = k+1;. 
88f0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
8900: 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  n pTerm;.       
8910: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
8920: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63       }.      pSc
8930: 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d  an->pWC = pScan-
8940: 3e 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20  >pWC->pOuter;.  
8950: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d      k = 0;.    }
8960: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  .    pScan->pWC 
8970: 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43  = pScan->pOrigWC
8980: 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20  ;.    k = 0;.   
8990: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b   pScan->iEquiv +
89a0: 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 2;.  }.  retur
89b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
89c0: 69 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45  itialize a WHERE
89d0: 20 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20   clause scanner 
89e0: 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20  object.  Return 
89f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8a00: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e  .** first match.
8a10: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
8a20: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61   there are no ma
8a30: 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tches..**.** The
8a40: 20 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65   scanner will be
8a50: 20 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57   searching the W
8a60: 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e  HERE clause pWC.
8a70: 20 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a    It will look.*
8a80: 2a 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74  * for terms of t
8a90: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
8aa0: 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20  <expr>" where X 
8ab0: 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d  is column iColum
8ac0: 6e 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43  n of table.** iC
8ad0: 75 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75  ur.  The <op> mu
8ae0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  st be one of the
8af0: 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72   operators descr
8b00: 69 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a  ibed by opMask..
8b10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61  **.** If the sea
8b20: 72 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64  rch is for X and
8b30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
8b40: 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73  e contains terms
8b50: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
8b60: 58 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f  X=Y then this ro
8b70: 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f  utine might also
8b80: 20 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66   return terms of
8b90: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20   the form.** "Y 
8ba0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54  <op> <expr>".  T
8bb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  he number of lev
8bc0: 65 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76  els of transitiv
8bd0: 69 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a  ity is limited,.
8be0: 2a 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68  ** but is enough
8bf0: 20 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20   to handle most 
8c00: 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69  commonly occurri
8c10: 6e 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ng SQL statement
8c20: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73  s..**.** If X is
8c30: 20 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52   not the INTEGER
8c40: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65   PRIMARY KEY the
8c50: 6e 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70  n X must be comp
8c60: 61 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69  atible with.** i
8c70: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 57 68  ndex pIdx..*/.Wh
8c80: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
8c90: 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53  anInit(.  WhereS
8ca0: 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20  can *pScan,     
8cb0: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63    /* The WhereSc
8cc0: 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  an object being 
8cd0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
8ce0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
8cf0: 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C,       /* The 
8d00: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
8d10: 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
8d20: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
8d30: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
8d40: 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  r to scan for */
8d50: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
8d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
8d70: 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72  lumn to scan for
8d80: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b   */.  u32 opMask
8d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
8da0: 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20   Operator(s) to 
8db0: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e  scan for */.  In
8dc0: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
8dd0: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
8de0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
8df0: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29   this index */.)
8e00: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a  {.  int j;..  /*
8e10: 20 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30   memset(pScan, 0
8e20: 2c 20 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29  , sizeof(*pScan)
8e30: 29 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70  ); */.  pScan->p
8e40: 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20  OrigWC = pWC;.  
8e50: 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43  pScan->pWC = pWC
8e60: 3b 0a 20 20 69 66 28 20 70 49 64 78 20 26 26 20  ;.  if( pIdx && 
8e70: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
8e80: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
8e90: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
8ea0: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
8eb0: 66 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28  finity;.    for(
8ec0: 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c  j=0; pIdx->aiCol
8ed0: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
8ee0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
8ef0: 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e   NEVER(j>=pIdx->
8f00: 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72  nColumn) ) retur
8f10: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
8f20: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
8f30: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  = pIdx->azColl[j
8f40: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
8f50: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
8f60: 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43  0;.    pScan->zC
8f70: 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ollName = 0;.  }
8f80: 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b  .  pScan->opMask
8f90: 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63   = opMask;.  pSc
8fa0: 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63  an->k = 0;.  pSc
8fb0: 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20  an->aEquiv[0] = 
8fc0: 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61  iCur;.  pScan->a
8fd0: 45 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75  Equiv[1] = iColu
8fe0: 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71  mn;.  pScan->nEq
8ff0: 75 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e  uiv = 2;.  pScan
9000: 2d 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->iEquiv = 2;.  
9010: 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e  return whereScan
9020: 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a  Next(pScan);.}..
9030: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
9040: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
9050: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
9060: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
9070: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
9080: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
9090: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
90a0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
90b0: 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20  e iCur and <op> 
90c0: 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65  is one of.** the
90d0: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
90e0: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
90f0: 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  by the op parame
9100: 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ter..** Return a
9110: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
9120: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
9130: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
9140: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74  .** The term ret
9150: 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59  urned might by Y
9160: 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65  =<expr> if there
9170: 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73   is another cons
9180: 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  traint in.** the
9190: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
91a0: 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61  at specifies tha
91b0: 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68  t X=Y.  Any such
91c0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c   constraints wil
91d0: 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69  l be.** identifi
91e0: 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55  ed by the WO_EQU
91f0: 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54  IV bit in the pT
9200: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66  erm->eOperator f
9210: 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45  ield.  The.** aE
9220: 71 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c  quiv[] array hol
9230: 64 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73  ds X and all its
9240: 20 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69   equivalents, wi
9250: 74 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69  th each SQL vari
9260: 61 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75  able.** taking u
9270: 70 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61  p two slots in a
9280: 45 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69  Equiv[].  The fi
9290: 72 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20  rst slot is for 
92a0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
92b0: 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63  r.** and the sec
92c0: 6f 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63  ond is for the c
92d0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54  olumn number.  T
92e0: 68 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74  here are 22 slot
92f0: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a  s in aEquiv[].**
9300: 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77   so that means w
9310: 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58  e can look for X
9320: 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f   plus up to 10 o
9330: 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ther equivalent 
9340: 76 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65  values..** Hence
9350: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20   a search for X 
9360: 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70  will return <exp
9370: 72 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41  r> if X=A1 and A
9380: 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a  1=A2 and A2=A3.*
9390: 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39  * and ... and A9
93a0: 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78  =A10 and A10=<ex
93b0: 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pr>..**.** If th
93c0: 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65  ere are multiple
93d0: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
93e0: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
93f0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
9400: 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74  expr>".** then t
9410: 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77  ry for the one w
9420: 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63  ith no dependenc
9430: 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20  ies on <expr> - 
9440: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77  in other words w
9450: 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69  here.** <expr> i
9460: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  s a constant exp
9470: 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20  ression of some 
9480: 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75  kind.  Only retu
9490: 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a  rn entries of.**
94a0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
94b0: 3e 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20  > Y" where Y is 
94c0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74  a column in anot
94d0: 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20  her table if no 
94e0: 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20  terms of.** the 
94f0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f  form "X <op> <co
9500: 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74  nst-expr>" exist
9510: 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20  .   If no terms 
9520: 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
9530: 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72  RHS.** exist, tr
9540: 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65  y to return a te
9550: 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  rm that does not
9560: 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a   use WO_EQUIV..*
9570: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
9580: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
9590: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
95a0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
95b0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
95c0: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
95d0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
95e0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
95f0: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
9600: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
9610: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
9620: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
9630: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
9640: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
9650: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
9660: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
9670: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20   */.  u32 op,   
9680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
9690: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
96a0: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
96b0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
96c0: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
96d0: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
96e0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
96f0: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
9700: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
9710: 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74  ereTerm *pResult
9720: 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72   = 0;.  WhereTer
9730: 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61  m *p;.  WhereSca
9740: 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77  n scan;..  p = w
9750: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
9760: 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69  an, pWC, iCur, i
9770: 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78  Column, op, pIdx
9780: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
9790: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
97a0: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
97b0: 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ady)==0 ){.     
97c0: 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69   if( p->prereqRi
97d0: 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f  ght==0 && (p->eO
97e0: 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d  perator&WO_EQ)!=
97f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
9800: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
9810: 20 20 20 20 20 69 66 28 20 70 52 65 73 75 6c 74       if( pResult
9820: 3d 3d 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20  ==0 ) pResult = 
9830: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  p;.    }.    p =
9840: 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
9850: 73 63 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  scan);.  }.  ret
9860: 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a  urn pResult;.}..
9870: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
9880: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
9890: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
98a0: 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43  SrcList*, WhereC
98b0: 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  lause*, int);../
98c0: 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e  *.** Call exprAn
98d0: 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72  alyze on all ter
98e0: 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  ms in a WHERE cl
98f0: 61 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  ause.  .*/.stati
9900: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
9910: 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74  zeAll(.  SrcList
9920: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
9930: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
9940: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
9950: 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20  lause *pWC      
9960: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
9970: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61  clause to be ana
9980: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lyzed */.){.  in
9990: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  t i;.  for(i=pWC
99a0: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
99b0: 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41   i--){.    exprA
99c0: 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c  nalyze(pTabList,
99d0: 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a   pWC, i);.  }.}.
99e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
99f0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
9a00: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65  ZATION./*.** Che
9a10: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
9a20: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
9a30: 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47  n is a LIKE or G
9a40: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61  LOB operator tha
9a50: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69  t.** can be opti
9a60: 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71  mized using ineq
9a70: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
9a80: 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ts.  Return TRUE
9a90: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20   if it is.** so 
9aa0: 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
9ab0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
9ac0: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
9ad0: 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69  r to be optimizi
9ae0: 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73  ble, the RHS mus
9af0: 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a  t be a string.**
9b00: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f   literal that do
9b10: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
9b20: 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a  h a wildcard.  .
9b30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
9b40: 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61  LikeOrGlob(.  Pa
9b50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9b60: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
9b70: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
9b80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9b90: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
9ba0: 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65   Test this expre
9bb0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ssion */.  Expr 
9bc0: 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20  **ppPrefix,  /* 
9bd0: 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54  Pointer to TK_ST
9be0: 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  RING expression 
9bf0: 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65  with pattern pre
9c00: 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  fix */.  int *pi
9c10: 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72  sComplete, /* Tr
9c20: 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77  ue if the only w
9c30: 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20  ildcard is % in 
9c40: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
9c50: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f  er */.  int *pno
9c60: 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75  Case      /* Tru
9c70: 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69  e if uppercase i
9c80: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
9c90: 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a  lowercase */.){.
9ca0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
9cb0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
9cc0: 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66  String on RHS of
9cd0: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
9ce0: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
9cf0: 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f  , *pLeft;      /
9d00: 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74  * Right and left
9d10: 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70   size of LIKE op
9d20: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72  erator */.  Expr
9d30: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
9d40: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
9d50: 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68  f operands to th
9d60: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
9d70: 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20  */.  int c;     
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72  /* One character
9da0: 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74   in z[] */.  int
9db0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
9dc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9dd0: 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72  r of non-wildcar
9de0: 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74  d prefix charact
9df0: 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63  ers */.  char wc
9e00: 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [3];            
9e10: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
9e20: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
9e30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9e40: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
9e50: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9e60: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  n */.  sqlite3_v
9e70: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a  alue *pVal = 0;.
9e80: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ea0: 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74  Opcode of pRight
9eb0: 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69   */..  if( !sqli
9ec0: 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f  te3IsLikeFunctio
9ed0: 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f  n(db, pExpr, pno
9ee0: 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20  Case, wc) ){.   
9ef0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
9f00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43  ifdef SQLITE_EBC
9f10: 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61  DIC.  if( *pnoCa
9f20: 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  se ) return 0;.#
9f30: 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20  endif.  pList = 
9f40: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
9f50: 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d    pLeft = pList-
9f60: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[1].pExpr;.  i
9f70: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b  f( pLeft->op!=TK
9f80: 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73  _COLUMN .   || s
9f90: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
9fa0: 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54  ty(pLeft)!=SQLIT
9fb0: 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c  E_AFF_TEXT .   |
9fc0: 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66  | IsVirtual(pLef
9fd0: 74 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20  t->pTab).  ){.  
9fe0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36    /* IMP: R-0206
9ff0: 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74  5-49465 The left
a000: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
a010: 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  e LIKE or GLOB o
a020: 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20  perator must.   
a030: 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20   ** be the name 
a040: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
a050: 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61  lumn with TEXT a
a060: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
a070: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a080: 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69  assert( pLeft->i
a090: 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20  Column!=(-1) ); 
a0a0: 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e  /* Because IPK n
a0b0: 65 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58  ever has AFF_TEX
a0c0: 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d  T */..  pRight =
a0d0: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
a0e0: 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68  pr;.  op = pRigh
a0f0: 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  t->op;.  if( op=
a100: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
a110: 20 20 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d      op = pRight-
a120: 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >op2;.  }.  if( 
a130: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
a140: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65  ){.    Vdbe *pRe
a150: 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65  prepare = pParse
a160: 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20  ->pReprepare;.  
a170: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69    int iCol = pRi
a180: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ght->iColumn;.  
a190: 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
a1a0: 56 64 62 65 47 65 74 56 61 6c 75 65 28 70 52 65  VdbeGetValue(pRe
a1b0: 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53  prepare, iCol, S
a1c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b  QLITE_AFF_NONE);
a1d0: 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26  .    if( pVal &&
a1e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
a1f0: 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54  ype(pVal)==SQLIT
a200: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
a210: 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  z = (char *)sqli
a220: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
a230: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
a240: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
a250: 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
a260: 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  dbe, iCol);.    
a270: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
a280: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
a290: 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  || pRight->op==T
a2a0: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
a2b0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
a2c0: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a  _STRING ){.    z
a2d0: 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f   = pRight->u.zTo
a2e0: 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ken;.  }.  if( z
a2f0: 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   ){.    cnt = 0;
a300: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
a310: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
a320: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
a330: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
a340: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
a350: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
a360: 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a  =0 && 255!=(u8)z
a370: 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20  [cnt-1] ){.     
a380: 20 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a   Expr *pPrefix;.
a390: 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65        *pisComple
a3a0: 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26  te = c==wc[0] &&
a3b0: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
a3c0: 20 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71      pPrefix = sq
a3d0: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
a3e0: 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20  _STRING, z);.   
a3f0: 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29     if( pPrefix )
a400: 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b   pPrefix->u.zTok
a410: 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20  en[cnt] = 0;.   
a420: 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70     *ppPrefix = p
a430: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66  Prefix;.      if
a440: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
a450: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  E ){.        Vdb
a460: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a470: 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Vdbe;.        sq
a480: 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
a490: 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69  ask(v, pRight->i
a4a0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
a4b0: 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74   if( *pisComplet
a4c0: 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a  e && pRight->u.z
a4d0: 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  Token[1] ){.    
a4e0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
a4f0: 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  rhs of the LIKE 
a500: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
a510: 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68  variable, and th
a520: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20  e current.      
a530: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
a540: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61  the variable mea
a550: 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ns there is no n
a560: 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  eed to invoke th
a570: 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20  e LIKE.         
a580: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68   ** function, th
a590: 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c  en no OP_Variabl
a5a0: 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  e will be added 
a5b0: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
a5c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
a5d0: 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d  s causes problem
a5e0: 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  s for the sqlite
a5f0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
a600: 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20  _name().        
a610: 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72    ** API. To wor
a620: 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64  karound them, ad
a630: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72  d a dummy OP_Var
a640: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20  iable here..    
a650: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
a660: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
a670: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a680: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
a690: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a6a0: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
a6b0: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20  pRight, r1);.   
a6c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a6d0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71  beChangeP3(v, sq
a6e0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
a6f0: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20  Addr(v)-1, 0);. 
a700: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a710: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
a720: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
a730: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
a750: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
a760: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
a770: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74  ree(pVal);.  ret
a780: 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65  urn (z!=0);.}.#e
a790: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
a7a0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
a7b0: 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64  ATION */...#ifnd
a7c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
a7d0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
a7e0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
a7f0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
a800: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
a810: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
a820: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
a830: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
a840: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
a850: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
a860: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
a870: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
a880: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
a890: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
a8a0: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
a8b0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
a8c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
a8d0: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
a8e0: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
a8f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a900: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
a910: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
a920: 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22  u.zToken,"match"
a930: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
a940: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
a950: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
a960: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  st;.  if( pList-
a970: 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20  >nExpr!=2 ){.   
a980: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a990: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d   if( pList->a[1]
a9a0: 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b  .pExpr->op != TK
a9b0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
a9c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
a9d0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
a9e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
a9f0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
aa00: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
aa10: 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  Base expression 
aa20: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
aa30: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
aa40: 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69  ause of.** a joi
aa50: 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  n, then transfer
aa60: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
aa70: 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74   markings over t
aa80: 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74  o derived..*/.st
aa90: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66  atic void transf
aaa0: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45  erJoinMarkings(E
aab0: 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45  xpr *pDerived, E
aac0: 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70  xpr *pBase){.  p
aad0: 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c  Derived->flags |
aae0: 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26  = pBase->flags &
aaf0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20   EP_FromJoin;.  
ab00: 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74  pDerived->iRight
ab10: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73  JoinTable = pBas
ab20: 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
ab30: 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  le;.}..#if !defi
ab40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ab50: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
ab60: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
ab70: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
ab80: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
ab90: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
aba0: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
abb0: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
abc0: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
abd0: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
abe0: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
abf0: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
ac00: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
ac10: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
ac40: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
ac50: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
ac60: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
ac70: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
ac80: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
ac90: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
aca0: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
acb0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
acc0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
acd0: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
ace0: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
acf0: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
ad00: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
ad10: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
ad20: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
ad30: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
ad40: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
ad50: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
ad60: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
ad70: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
ad80: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
ad90: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
ada0: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
adb0: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
adc0: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
add0: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
ade0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
adf0: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
ae00: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
ae10: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
ae20: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
ae30: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
ae40: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
ae50: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
ae60: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
ae70: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
ae80: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
ae90: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
aea0: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
aeb0: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
aec0: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
aed0: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
aee0: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
aef0: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
af00: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
af10: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
af20: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
af30: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
af40: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
af50: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
af60: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
af70: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
af80: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
af90: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
afa0: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
afb0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
afc0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
afd0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
afe0: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
aff0: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
b000: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
b010: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
b020: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
b030: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
b040: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
b050: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
b060: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
b070: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
b080: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
b090: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
b0a0: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
b0b0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
b0c0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
b0d0: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
b0e0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
b0f0: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
b100: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
b110: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
b120: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
b130: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
b140: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
b150: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
b160: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
b170: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
b180: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
b190: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
b1a0: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
b1b0: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
b1c0: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
b1d0: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
b1e0: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
b1f0: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
b200: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
b210: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
b220: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
b230: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
b240: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
b250: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
b260: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
b270: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
b280: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
b290: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
b2a0: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
b2b0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
b2c0: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
b2d0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
b2e0: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
b2f0: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
b300: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
b310: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
b320: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
b330: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
b340: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
b350: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
b360: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
b370: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
b380: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
b390: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
b3a0: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
b3b0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
b3c0: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
b3d0: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
b3e0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
b3f0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
b400: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
b410: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
b420: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
b430: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
b440: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
b450: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
b460: 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20 62 65  something the be
b470: 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74 69 6e  stIndex() routin
b480: 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65  e will determine
b490: 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  .  This analysis
b4a0: 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61  .** only looks a
b4b0: 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72  t whether subter
b4c0: 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ms appropriate f
b4d0: 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73  or indexing exis
b4e0: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61  t..**.** All exa
b4f0: 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20  mples A through 
b500: 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61 74 69  E above all sati
b510: 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74  sfy case 2.  But
b520: 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c   if a term.** al
b530: 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61  so statisfies ca
b540: 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29  se 1 (such as B)
b550: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
b560: 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c  e optimizer will
b570: 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65  .** always prefe
b580: 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20  r case 1, so in 
b590: 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65  that case we pre
b5a0: 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32  tend that case 2
b5b0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73   is not.** satis
b5c0: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d  fied..**.** It m
b5d0: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
b5e0: 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74   that multiple t
b5f0: 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61  ables are indexa
b600: 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ble.  For exampl
b610: 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20  e,.** (E) above 
b620: 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20  is indexable on 
b630: 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64  tables P, Q, and
b640: 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20   R..**.** Terms 
b650: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
b660: 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74  e 2 are candidat
b670: 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79  es for lookup by
b680: 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61   using.** separa
b690: 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69  te indices to fi
b6a0: 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61  nd rowids for ea
b6b0: 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63  ch subterm and c
b6c0: 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20  omposing.** the 
b6d0: 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77  union of all row
b6e0: 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53  ids using a RowS
b6f0: 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  et object.  This
b700: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
b710: 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65  o "bitmap indice
b720: 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61  s" in other data
b730: 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a  base engines..**
b740: 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a  .** OTHERWISE:.*
b750: 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
b760: 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20  case 1 nor case 
b770: 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65  2 apply, then le
b780: 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f  ave the eOperato
b790: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f  r set to.** zero
b7a0: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20  .  This term is 
b7b0: 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73  not useful for s
b7c0: 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  earch..*/.static
b7d0: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
b7e0: 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69  eOrTerm(.  SrcLi
b7f0: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
b800: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
b810: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
b820: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
b830: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f         /* the co
b840: 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61  mplete WHERE cla
b850: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
b860: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
b870: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
b880: 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65  he OR-term to be
b890: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
b8a0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
b8b0: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
b8c0: 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45  o;        /* WHE
b8d0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
b8e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b8f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
b900: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
b910: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
b920: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
b930: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b940: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
b950: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
b960: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
b970: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
b980: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
b990: 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20  idxTerm];    /* 
b9a0: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
b9b0: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70  nalyzed */.  Exp
b9c0: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
b9d0: 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->pExpr;        
b9e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
b9f0: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  ession of the te
ba00: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rm */.  int i;  
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
ba40: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
ba50: 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20  e *pOrWc;       
ba60: 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54  /* Breakup of pT
ba70: 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  erm into subterm
ba80: 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  s */.  WhereTerm
ba90: 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20   *pOrTerm;      
baa0: 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77   /* A Sub-term w
bab0: 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20  ithin the pOrWc 
bac0: 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f  */.  WhereOrInfo
bad0: 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f   *pOrInfo;     /
bae0: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  * Additional inf
baf0: 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61  ormation associa
bb00: 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a  ted with pTerm *
bb10: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67  /.  Bitmask chng
bb20: 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a  ToIN;         /*
bb30: 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   Tables that mig
bb40: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ht satisfy case 
bb50: 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  1 */.  Bitmask i
bb60: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
bb70: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
bb80: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73  are indexable, s
bb90: 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32  atisfying case 2
bba0: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42   */..  /*.  ** B
bbb0: 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75  reak the OR clau
bbc0: 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61  se into its sepa
bbd0: 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20  rate subterms.  
bbe0: 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65  The subterms are
bbf0: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
bc00: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
bc10: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
bc20: 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68  ng within the Wh
bc30: 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f  ereOrInfo.  ** o
bc40: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74  bject that is at
bc50: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72  tached to the or
bc60: 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65  iginal OR clause
bc70: 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73   term..  */.  as
bc80: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
bc90: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59  Flags & (TERM_DY
bca0: 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46  NAMIC|TERM_ORINF
bcb0: 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29  O|TERM_ANDINFO))
bcc0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
bcd0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
bce0: 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e  R );.  pTerm->u.
bcf0: 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66  pOrInfo = pOrInf
bd00: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
bd10: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
bd20: 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20  of(*pOrInfo));. 
bd30: 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20   if( pOrInfo==0 
bd40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72  ) return;.  pTer
bd50: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
bd60: 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72  RM_ORINFO;.  pOr
bd70: 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77  Wc = &pOrInfo->w
bd80: 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  c;.  whereClause
bd90: 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e  Init(pOrWc, pWIn
bda0: 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  fo);.  whereSpli
bdb0: 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20  t(pOrWc, pExpr, 
bdc0: 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e  TK_OR);.  exprAn
bdd0: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
bde0: 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d  OrWc);.  if( db-
bdf0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
be00: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
be10: 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d  ( pOrWc->nTerm>=
be20: 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 );..  /*.  ** 
be30: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20  Compute the set 
be40: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d  of tables that m
be50: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
be60: 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a  es 1 or 2..  */.
be70: 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28    indexable = ~(
be80: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e  Bitmask)0;.  chn
be90: 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73  gToIN = ~(Bitmas
bea0: 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72  k)0;.  for(i=pOr
beb0: 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72  Wc->nTerm-1, pOr
bec0: 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69  Term=pOrWc->a; i
bed0: 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65  >=0 && indexable
bee0: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
bef0: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54  ){.    if( (pOrT
bf00: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
bf10: 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29   WO_SINGLE)==0 )
bf20: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64  {.      WhereAnd
bf30: 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a  Info *pAndInfo;.
bf40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
bf50: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
bf60: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
bf70: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
bf80: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
bf90: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
bfa0: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
bfb0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
bfc0: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
bfd0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
bfe0: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
bff0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
c000: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
c010: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
c020: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
c030: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
c040: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
c050: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
c060: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
c070: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
c080: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c090: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
c0a0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
c0b0: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
c0c0: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
c0d0: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
c0e0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
c0f0: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
c100: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20   pWC->pWInfo);. 
c110: 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69         whereSpli
c120: 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72  t(pAndWC, pOrTer
c130: 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44  m->pExpr, TK_AND
c140: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
c150: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
c160: 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20  pAndWC);.       
c170: 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20   pAndWC->pOuter 
c180: 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74  = pWC;.        t
c190: 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c  estcase( db->mal
c1a0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
c1b0: 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
c1c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
c1d0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
c1e0: 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43   pAndTerm=pAndWC
c1f0: 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e  ->a; j<pAndWC->n
c200: 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54  Term; j++, pAndT
c210: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
c220: 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64      assert( pAnd
c230: 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
c240: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
c250: 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72  llowedOp(pAndTer
c260: 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b  m->pExpr->op) ){
c270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
c280: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
c290: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
c2a0: 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  AndTerm->leftCur
c2b0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sor);.          
c2c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
c2d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c2e0: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
c2f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
c300: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
c310: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
c320: 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20  COPIED ){.      
c330: 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  /* Skip this ter
c340: 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72  m for now.  We r
c350: 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20 77  evisit it when w
c360: 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20  e process the.  
c370: 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
c380: 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41  ding TERM_VIRTUA
c390: 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65  L term */.    }e
c3a0: 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
c3b0: 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20  sk b;.      b = 
c3c0: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
c3d0: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  >sMaskSet, pOrTe
c3e0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  rm->leftCursor);
c3f0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
c400: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
c410: 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20  RM_VIRTUAL ){.  
c420: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
c430: 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63  *pOther = &pOrWc
c440: 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61  ->a[pOrTerm->iPa
c450: 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62  rent];.        b
c460: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
c470: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
c480: 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f  Other->leftCurso
c490: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
c4a0: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
c4b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 72  ;.      if( (pOr
c4c0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c4d0: 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20  & WO_EQ)==0 ){. 
c4e0: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
c4f0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
c500: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
c510: 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  IN &= b;.      }
c520: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
c530: 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  .  ** Record the
c540: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
c550: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
c560: 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67   2.  The set mig
c570: 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79  ht be.  ** empty
c580: 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f  ..  */.  pOrInfo
c590: 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e  ->indexable = in
c5a0: 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d  dexable;.  pTerm
c5b0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e  ->eOperator = in
c5c0: 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a  dexable==0 ? 0 :
c5d0: 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20   WO_OR;..  /*.  
c5e0: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64  ** chngToIN hold
c5f0: 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65  s a set of table
c600: 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73  s that *might* s
c610: 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20  atisfy case 1.  
c620: 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65  But.  ** we have
c630: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69   to do some addi
c640: 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20  tional checking 
c650: 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31  to see if case 1
c660: 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20   really.  ** is 
c670: 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a  satisfied..  **.
c680: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69    ** chngToIN wi
c690: 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30  ll hold either 0
c6a0: 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20  , 1, or 2 bits. 
c6b0: 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20   The 0-bit case 
c6c0: 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
c6d0: 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73  there is no poss
c6e0: 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73  ibility of trans
c6f0: 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63  forming the OR c
c700: 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20  lause into an.  
c710: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62  ** IN operator b
c720: 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f  ecause one or mo
c730: 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
c740: 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  OR clause contai
c750: 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67  n.  ** something
c760: 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f   other than == o
c770: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  n a column in th
c780: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
c790: 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20   The 1-bit.  ** 
c7a0: 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20  case means that 
c7b0: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
c7c0: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f  e OR clause is o
c7d0: 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20  f the form.  ** 
c7e0: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78  "table.column=ex
c7f0: 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  pr" for some sin
c800: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
c810: 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20  one bit that is 
c820: 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f  set.  ** will co
c830: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
c840: 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57  common table.  W
c850: 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
c860: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20  check to make.  
c870: 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65  ** sure the same
c880: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
c890: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54  on all terms.  T
c8a0: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73  he 2-bit case is
c8b0: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61   when.  ** the a
c8c0: 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20  ll terms are of 
c8d0: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31  the form "table1
c8e0: 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63  .column=table2.c
c8f0: 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a  olumn".  It.  **
c900: 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62   might be possib
c910: 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e  le to form an IN
c920: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65   operator with e
c930: 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c  ither table1.col
c940: 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c  umn.  ** or tabl
c950: 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  e2.column as the
c960: 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69   LHS if either i
c970: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72  s common to ever
c980: 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74  y term of.  ** t
c990: 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20  he OR clause..  
c9a0: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
c9b0: 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  t terms of the f
c9c0: 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d  orm "table.colum
c9d0: 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32  n1=table.column2
c9e0: 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  " (the.  ** same
c9f0: 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73   table on both s
ca00: 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20  izes of the ==) 
ca10: 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
ca20: 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
ca30: 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  chngToIN ){.    
ca40: 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  int okToChngToIN
ca50: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
ca60: 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73  e if the convers
ca70: 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c  ion to IN is val
ca80: 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  id */.    int iC
ca90: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20  olumn = -1;     
caa0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e      /* Column in
cab0: 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e  dex on lhs of IN
cac0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
cad0: 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d   int iCursor = -
cae0: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  1;         /* Ta
caf0: 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f  ble cursor commo
cb00: 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a  n to all terms *
cb10: 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b  /.    int j = 0;
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb30: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
cb40: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  */..    /* Searc
cb50: 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e  h for a table an
cb60: 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70  d column that ap
cb70: 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64  pears on one sid
cb80: 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  e or the.    ** 
cb90: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20  other of the == 
cba0: 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72  operator in ever
cbb0: 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74  y subterm.  That
cbc0: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
cbd0: 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65  n.    ** will be
cbe0: 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75   recorded in iCu
cbf0: 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e  rsor and iColumn
cc00: 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e  .  There might n
cc10: 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a  ot be any.    **
cc20: 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20   such table and 
cc30: 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54  column.  Set okT
cc40: 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20  oChngToIN if an 
cc50: 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c  appropriate tabl
cc60: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c  e.    ** and col
cc70: 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74  umn is found but
cc80: 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54   leave okToChngT
cc90: 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  oIN false if not
cca0: 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20   found..    */. 
ccb0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20     for(j=0; j<2 
ccc0: 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  && !okToChngToIN
ccd0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f  ; j++){.      pO
cce0: 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61  rTerm = pOrWc->a
ccf0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ;.      for(i=pO
cd00: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e  rWc->nTerm-1; i>
cd10: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
cd20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
cd30: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
cd40: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
cd50: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  );.        pOrTe
cd60: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
cd70: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
cd80: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
cd90: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
cda0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
cdb0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
cdc0: 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20   2-bit case and 
cdd0: 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65  we are on the se
cde0: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61  cond iteration a
cdf0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
ce00: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
ce10: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69  from the first i
ce20: 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b  teration.  So sk
ce30: 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f  ip this term. */
ce40: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
ce50: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
ce60: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
ce70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ce80: 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26   if( (chngToIN &
ce90: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
cea0: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  ->sMaskSet, pOrT
ceb0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
cec0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
ced0: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d    /* This term m
cee0: 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f  ust be of the fo
cef0: 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68  rm t1.a==t2.b wh
cf00: 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65  ere t2 is in the
cf10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68  .          ** ch
cf20: 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74  ngToIN set but t
cf30: 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20  1 is not.  This 
cf40: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74  term will be eit
cf50: 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20  her preceeded.  
cf60: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f          ** or fo
cf70: 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65  llwed by an inve
cf80: 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d  rted copy (t2.b=
cf90: 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68  =t1.a).  Skip th
cfa0: 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20  is term .       
cfb0: 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74     ** and use it
cfc0: 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a  s inversion. */.
cfd0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
cfe0: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
cff0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
d000: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ED );.          
d010: 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72  testcase( pOrTer
d020: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
d030: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
d040: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d050: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
d060: 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54  & (TERM_COPIED|T
d070: 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a  ERM_VIRTUAL) );.
d080: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
d090: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
d0a0: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
d0b0: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
d0c0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69  olumn;.        i
d0d0: 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d  Cursor = pOrTerm
d0e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ->leftCursor;.  
d0f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d100: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
d110: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
d120: 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61   No candidate ta
d130: 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66  ble+column was f
d140: 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20  ound.  This can 
d150: 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20  only occur.     
d160: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63     ** on the sec
d170: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ond iteration */
d180: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d190: 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   j==1 );.       
d1a0: 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72   assert( IsPower
d1b0: 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20  OfTwo(chngToIN) 
d1c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
d1d0: 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74  t( chngToIN==get
d1e0: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
d1f0: 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29  askSet, iCursor)
d200: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
d210: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d220: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20   testcase( j==1 
d230: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  );..      /* We 
d240: 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e  have found a can
d250: 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64  didate table and
d260: 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20   column.  Check 
d270: 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20  to see if that. 
d280: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e       ** table an
d290: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d  d column is comm
d2a0: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
d2b0: 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73   in the OR claus
d2c0: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43  e */.      okToC
d2d0: 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  hngToIN = 1;.   
d2e0: 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26     for(; i>=0 &&
d2f0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69   okToChngToIN; i
d300: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
d310: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d320: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
d330: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
d340: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
d350: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
d360: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
d370: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
d380: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
d390: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
d3a0: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
d3b0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43  u.leftColumn!=iC
d3c0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
d3d0: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
d3e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
d3f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
d400: 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69  t affLeft, affRi
d410: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  ght;.          /
d420: 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68  * If the right-h
d430: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f  and side is also
d440: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
d450: 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20  the affinities. 
d460: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62           ** of b
d470: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
d480: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
d490: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
d4a0: 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  pe.          ** 
d4b0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
d4c0: 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  required on the 
d4d0: 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20  right.  (Ticket 
d4e0: 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20  #2249).         
d4f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66   */.          af
d500: 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  fRight = sqlite3
d510: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
d520: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
d530: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
d540: 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  affLeft = sqlite
d550: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
d560: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
d570: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
d580: 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20  if( affRight!=0 
d590: 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66  && affRight!=aff
d5a0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
d5b0: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
d5c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
d5d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d5e0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
d5f0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
d600: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
d610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d620: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
d630: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b  t this point, ok
d640: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72  ToChngToIN is tr
d650: 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70  ue if original p
d660: 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20  Term satisfies. 
d670: 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49     ** case 1.  I
d680: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e  n that case, con
d690: 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72  struct a new vir
d6a0: 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69  tual term that i
d6b0: 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20  s .    ** pTerm 
d6c0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
d6d0: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n IN operator.. 
d6e0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a     **.    ** EV:
d6f0: 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20   R-00211-15100. 
d700: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b     */.    if( ok
d710: 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ToChngToIN ){.  
d720: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20      Expr *pDup; 
d730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
d740: 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63  transient duplic
d750: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ate expression *
d760: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
d770: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f   *pList = 0;   /
d780: 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65  * The RHS of the
d790: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
d7a0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
d7b0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
d7c0: 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
d7d0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
d7e0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20      Expr *pNew; 
d7f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d800: 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70  e complete IN op
d810: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
d820: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
d830: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
d840: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  OrWc->a; i>=0; i
d850: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
d860: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
d870: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
d880: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
d890: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
d8a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
d8b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
d8c0: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
d8d0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
d8e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
d8f0: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20  ursor );.       
d900: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
d910: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
d920: 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  iColumn );.     
d930: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
d940: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
d950: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
d960: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
d970: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
d980: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
d990: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
d9a0: 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  List, pDup);.   
d9b0: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72       pLeft = pOr
d9c0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
d9d0: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ft;.      }.    
d9e0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
d9f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70  =0 );.      pDup
da00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
da10: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
da20: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
da30: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
da40: 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  e, TK_IN, pDup, 
da50: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
da60: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
da70: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
da80: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
da90: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
daa0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
dab0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
dac0: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
dad0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
dae0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
daf0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
db00: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
db10: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
db20: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
db30: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
db40: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
db50: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
db60: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  w==0 );.        
db70: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
db80: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
db90: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
dba0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
dbb0: 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61  ;.        pWC->a
dbc0: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
dbd0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
dbe0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
dbf0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
dc00: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
dc10: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
dc20: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
dc30: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72      }.      pTer
dc40: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
dc50: 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65  O_NOOP;  /* case
dc60: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
dc70: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
dc80: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
dc90: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
dca0: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
dcb0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
dcc0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  */../*.** The in
dcd0: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
dce0: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
dcf0: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
dd00: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
dd10: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
dd20: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
dd30: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
dd40: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
dd50: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
dd60: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
dd70: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
dd80: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
dd90: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
dda0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
ddb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ddc0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
ddd0: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
dde0: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
ddf0: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
de00: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
de10: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
de20: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
de30: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
de40: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
de50: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
de60: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
de70: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
de80: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
de90: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
dea0: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
deb0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
dec0: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
ded0: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
dee0: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
def0: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
df00: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
df10: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
df20: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
df30: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
df40: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
df50: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
df60: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
df70: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
df80: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
df90: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
dfa0: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
dfb0: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
dfc0: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
dfd0: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
dfe0: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
dff0: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
e000: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
e010: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
e020: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
e030: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
e040: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
e050: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
e060: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
e070: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
e080: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
e090: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
e0a0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
e0b0: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
e0c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
e0d0: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
e0e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
e0f0: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
e100: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
e110: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
e120: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
e130: 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  o; /* WHERE clau
e140: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  se processing co
e150: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
e160: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
e170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e180: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
e190: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alyzed */.  Wher
e1a0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
e1b0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
e1c0: 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64  Set of table ind
e1d0: 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78  ex masks */.  Ex
e1e0: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e200: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
e210: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
e220: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
e230: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20  reqLeft;        
e240: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
e250: 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45  esites of the pE
e260: 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20  xpr->pLeft */.  
e270: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
e280: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
e290: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
e2a0: 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  s of pExpr */.  
e2b0: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67  Bitmask extraRig
e2c0: 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ht = 0;         
e2d0: 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64   /* Extra depend
e2e0: 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a  encies on LEFT J
e2f0: 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  OIN */.  Expr *p
e300: 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Str1 = 0;       
e310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
e320: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
e330: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
e340: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e360: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
e370: 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63   ends with wildc
e380: 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ard */.  int noC
e390: 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ase = 0;        
e3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b            /* LIK
e3b0: 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69  E/GLOB distingui
e3c0: 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69  shes case */.  i
e3d0: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65  /* Top-level ope
e400: 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f  rator.  pExpr->o
e410: 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  p */.  Parse *pP
e420: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
e430: 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69  Parse;  /* Parsi
e440: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e450: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
e460: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
e470: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
e480: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  nection */..  if
e490: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
e4a0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
e4b0: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
e4c0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
e4d0: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
e4e0: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
e4f0: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
e500: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
e510: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
e520: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
e530: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
e540: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
e550: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
e560: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
e570: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
e580: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
e590: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
e5a0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
e5b0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
e5c0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
e5d0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
e5e0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
e5f0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
e600: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
e610: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
e620: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
e630: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
e640: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
e650: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
e660: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
e670: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
e680: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
e690: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
e6a0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
e6b0: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
e6c0: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
e6d0: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
e6e0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
e6f0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
e700: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
e710: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
e720: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
e730: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
e740: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
e750: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
e760: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
e770: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
e780: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
e790: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
e7a0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
e7b0: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
e7c0: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
e7d0: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
e7e0: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
e7f0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
e800: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
e830: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
e840: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
e850: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
e860: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
e870: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
e880: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
e890: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
e8a0: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
e8b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
e8c0: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
e8d0: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
e8e0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
e8f0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
e900: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
e910: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
e920: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
e930: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
e940: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
e950: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
e960: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
e970: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
e980: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
e990: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28  O_EQUIV;.    if(
e9a0: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
e9b0: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
e9c0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
e9d0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
e9e0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
e9f0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
ea00: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
ea10: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
ea20: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
ea30: 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b  ask(op) & opMask
ea40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ea50: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
ea60: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
ea70: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
ea80: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
ea90: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
eaa0: 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d    u16 eExtraOp =
eab0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78   0;        /* Ex
eac0: 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65  tra bits for pNe
ead0: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  w->eOperator */.
eae0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
eaf0: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
eb00: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
eb10: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
eb20: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
eb30: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
eb40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
eb50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
eb60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
eb70: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
eb80: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
eb90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
eba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
ebb0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
ebc0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
ebd0: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
ebe0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
ebf0: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
ec00: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
ec10: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
ec20: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
ec30: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
ec40: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
ec50: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
ec60: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
ec70: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
ec80: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
ec90: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
eca0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
ecb0: 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IED;.        if(
ecc0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
ecd0: 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  Q.         && !E
ece0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ecf0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
ed00: 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  n).         && O
ed10: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
ed20: 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72  ed(db, SQLITE_Tr
ed30: 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20  ansitive).      
ed40: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
ed50: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
ed60: 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20  |= WO_EQUIV;.   
ed70: 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20         eExtraOp 
ed80: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
ed90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
eda0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
edb0: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
edc0: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
edd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
ede0: 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c  rCommute(pParse,
edf0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c   pDup);.      pL
ee00: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
ee10: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75  rSkipCollate(pDu
ee20: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  p->pLeft);.     
ee30: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
ee40: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
ee50: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
ee60: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
ee70: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
ee80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
ee90: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
eea0: 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65  aRight) != prere
eeb0: 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70  qLeft );.      p
eec0: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
eed0: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20   = prereqLeft | 
eee0: 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20  extraRight;.    
eef0: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
ef00: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
ef10: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
ef20: 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72  ator = (operator
ef30: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b  Mask(pDup->op) +
ef40: 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d   eExtraOp) & opM
ef50: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ask;.    }.  }..
ef60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ef70: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
ef80: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66  MIZATION.  /* If
ef90: 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42   a term is the B
efa0: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
efb0: 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20   create two new 
efc0: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20  virtual terms.  
efd0: 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74  ** that define t
efe0: 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68  he range that th
eff0: 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d  e BETWEEN implem
f000: 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ents.  For examp
f010: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
f020: 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41     a BETWEEN b A
f030: 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  ND c.  **.  ** i
f040: 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  s converted into
f050: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
f060: 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e   (a BETWEEN b AN
f070: 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20  D c) AND (a>=b) 
f080: 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a  AND (a<=c).  **.
f090: 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77    ** The two new
f0a0: 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
f0b0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
f0c0: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
f0d0: 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
f0e0: 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  e new terms are 
f0f0: 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72  "dynamic" and ar
f100: 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  e children of th
f110: 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45  e original BETWE
f120: 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54  EN.  ** term.  T
f130: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69  hat means that i
f140: 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65  f the BETWEEN te
f150: 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65  rm is coded, the
f160: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20   children are.  
f170: 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c  ** skipped.  Or,
f180: 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e   if the children
f190: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
f1a0: 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  y an index, the 
f1b0: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45  original.  ** BE
f1c0: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b  TWEEN term is sk
f1d0: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
f1e0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
f1f0: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20  ==TK_BETWEEN && 
f200: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
f210: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
f220: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
f230: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  x.pList;.    int
f240: 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   i;.    static c
f250: 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20  onst u8 ops[] = 
f260: 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a  {TK_GE, TK_LE};.
f270: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
f280: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
f290: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
f2a0: 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==2 );.    for(i
f2b0: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
f2c0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
f2d0: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
f2e0: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65  dxNew;.      pNe
f2f0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
f300: 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73  Expr(pParse, ops
f310: 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  [i], .          
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
f340: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  p(db, pExpr->pLe
f350: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f370: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f380: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
f390: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30  [i].pExpr, 0), 0
f3a0: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
f3b0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
f3c0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
f3d0: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
f3e0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
f3f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
f400: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
f410: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
f420: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
f430: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
f440: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
f450: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
f460: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
f470: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   idxTerm;.    }.
f480: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
f490: 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 2;.  }.#endi
f4a0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
f4b0: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
f4c0: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64  ATION */..#if !d
f4d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f4e0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
f4f0: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
f500: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
f510: 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79  UERY).  /* Analy
f520: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69  ze a term that i
f530: 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77  s composed of tw
f540: 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72  o or more subter
f550: 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  ms connected by.
f560: 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61    ** an OR opera
f570: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  tor..  */.  else
f580: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
f590: 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73  TK_OR ){.    ass
f5a0: 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  ert( pWC->op==TK
f5b0: 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72  _AND );.    expr
f5c0: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53  AnalyzeOrTerm(pS
f5d0: 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d  rc, pWC, idxTerm
f5e0: 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
f5f0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
f600: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
f610: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
f620: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
f630: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f640: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
f650: 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f  TION.  /* Add co
f660: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64  nstraints to red
f670: 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
f680: 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f  pace on a LIKE o
f690: 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72  r GLOB.  ** oper
f6a0: 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
f6b0: 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f  A like pattern o
f6c0: 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49  f the form "x LI
f6d0: 4b 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68  KE 'abc%'" is ch
f6e0: 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74  anged into const
f6f0: 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a  raints.  **.  **
f700: 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62            x>='ab
f710: 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41  c' AND x<'abd' A
f720: 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27  ND x LIKE 'abc%'
f730: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
f740: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ast character of
f750: 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63   the prefix "abc
f760: 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  " is incremented
f770: 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a   to form the.  *
f780: 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  * termination co
f790: 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20  ndition "abd".. 
f7a0: 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f   */.  if( pWC->o
f7b0: 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26  p==TK_AND .   &&
f7c0: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50   isLikeOrGlob(pP
f7d0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53  arse, pExpr, &pS
f7e0: 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65  tr1, &isComplete
f7f0: 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a  , &noCase).  ){.
f800: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
f810: 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66         /* LHS of
f820: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
f830: 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
f840: 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a  *pStr2;       /*
f850: 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d   Copy of pStr1 -
f860: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
f870: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
f880: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
f890: 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  1;.    Expr *pNe
f8a0: 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20  wExpr2;.    int 
f8b0: 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74  idxNew1;.    int
f8c0: 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f   idxNew2;.    To
f8d0: 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  ken sCollSeqName
f8e0: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f  ;  /* Name of co
f8f0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f900: 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d   */..    pLeft =
f910: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
f920: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
f930: 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33   pStr2 = sqlite3
f940: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72  ExprDup(db, pStr
f950: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 0);.    if( !
f960: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f970: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20   ){.      u8 c, 
f980: 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61  *pC;       /* La
f990: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
f9a0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69  ore the first wi
f9b0: 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20  ldcard */.      
f9c0: 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32  pC = (u8*)&pStr2
f9d0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74  ->u.zToken[sqlit
f9e0: 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32  e3Strlen30(pStr2
f9f0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a  ->u.zToken)-1];.
fa00: 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20        c = *pC;. 
fa10: 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20       if( noCase 
fa20: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
fa30: 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e  e point is to in
fa40: 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74  crement the last
fa50: 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72   character befor
fa60: 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  e the first.    
fa70: 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e      ** wildcard.
fa80: 20 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72    But if we incr
fa90: 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20  ement '@', that 
faa0: 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74  will push it int
fab0: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
fac0: 20 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67   alphabetic rang
fad0: 65 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e  e where case con
fae0: 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65  versions will me
faf0: 73 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20  ss up the .     
fb00: 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79     ** inequality
fb10: 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73  .  To avoid this
fb20: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61  , make sure to a
fb30: 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c  lso run the full
fb40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45  .        ** LIKE
fb50: 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74   on all candidat
fb60: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  e expressions by
fb70: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73   clearing the is
fb80: 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20  Complete flag.  
fb90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
fba0: 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20   if( c=='A'-1 ) 
fbb0: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
fbc0: 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33 33 39    /* EV: R-64339
fbd0: 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20 20 20  -08207 */...    
fbe0: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
fbf0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
fc00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
fc10: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
fc20: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
fc30: 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22  e.z = noCase ? "
fc40: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
fc50: 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71  Y";.    sCollSeq
fc60: 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20  Name.n = 6;.    
fc70: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
fc80: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
fc90: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
fca0: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
fcb0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
fcc0: 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20  K_GE, .         
fcd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
fce0: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
fcf0: 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73  rse,pNewExpr1,&s
fd00: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
fd10: 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20           pStr1, 
fd20: 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20  0);.    idxNew1 
fd30: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
fd40: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
fd50: 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  r1, TERM_VIRTUAL
fd60: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
fd70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
fd80: 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20  xNew1==0 );.    
fd90: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
fda0: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b  , pWC, idxNew1);
fdb0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
fdc0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
fdd0: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
fde0: 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
fdf0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
fe00: 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20  se, TK_LT,.     
fe10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fe20: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
fe30: 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72  (pParse,pNewExpr
fe40: 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29  2,&sCollSeqName)
fe50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74  ,.           pSt
fe60: 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e  r2, 0);.    idxN
fe70: 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew2 = whereClaus
fe80: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
fe90: 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52  wExpr2, TERM_VIR
fea0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
feb0: 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
fec0: 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a  ( idxNew2==0 );.
fed0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
fee0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
fef0: 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
ff00: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
ff10: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
ff20: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
ff30: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
ff40: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
ff50: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
ff60: 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
ff70: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
ff80: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
ff90: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
ffa0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ffb0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
ffc0: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
ffd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ffe0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
fff0: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
10000 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
10010 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
10020 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
10030 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
10040 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
10050 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
10060 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
10070 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
10080 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
10090 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
100a0 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
100b0 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
100c0 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
100d0 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
100e0 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
100f0 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
10100 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
10110 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
10120 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
10130 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
10140 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
10150 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
10160 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
10170 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
10180 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
10190 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
101a0 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
101b0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
101c0 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
101d0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
101e0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
101f0 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65    prereqExpr = e
10200 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
10210 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
10220 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d  .    prereqColum
10230 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  n = exprTableUsa
10240 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65  ge(pMaskSet, pLe
10250 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72  ft);.    if( (pr
10260 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65  ereqExpr & prere
10270 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20  qColumn)==0 ){. 
10280 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
10290 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  xpr;.      pNewE
102a0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
102b0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41  pr(pParse, TK_MA
102c0 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TCH, .          
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78      0, sqlite3Ex
102f0 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
10300 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
10310 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
10320 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
10330 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
10340 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
10350 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
10360 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
10370 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
10380 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
10390 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
103a0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
103b0 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
103c0 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
103d0 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
103e0 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
103f0 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
10400 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
10410 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
10420 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
10430 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
10440 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10450 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
10460 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
10470 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
10480 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
10490 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
104a0 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
104b0 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
104c0 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
104d0 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
104e0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
104f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
10500 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
10510 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
10520 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10530 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 2f 2a 20  ABLE_STAT3.  /* 
10540 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74  When sqlite_stat
10550 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
10560 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e   is available an
10570 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65   operator of the
10580 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53  .  ** form "x IS
10590 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73   NOT NULL" can s
105a0 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c  ometimes be eval
105b0 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63  uated more effic
105c0 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22  iently.  ** as "
105d0 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20  x>NULL" if x is 
105e0 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
105f0 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20  RIMARY KEY.  So 
10600 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a  construct a.  **
10610 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66   virtual term of
10620 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a   that form..  **
10630 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
10640 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  the virtual term
10650 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20   must be tagged 
10660 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e  with TERM_VNULL.
10670 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d    This.  ** TERM
10680 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20  _VNULL tag will 
10690 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74  suppress the not
106a0 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74  -null check at t
106b0 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
106c0 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  * of the loop.  
106d0 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d  Without the TERM
106e0 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65  _VNULL flag, the
106f0 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
10700 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72  at.  ** the star
10710 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69  t of the loop wi
10720 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72  ll prevent any r
10730 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e  esults from bein
10740 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  g returned..  */
10750 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
10760 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20  ==TK_NOTNULL.   
10770 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
10780 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
10790 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
107a0 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  t->iColumn>=0.  
107b0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
107c0 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
107d0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
107e0 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
107f0 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
10800 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
10810 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
10820 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
10830 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10860 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
10870 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10890 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
108a0 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
108b0 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20  0, 0, 0), 0);.. 
108c0 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
108d0 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
108e0 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10900 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f             TERM_
10910 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
10920 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29  AMIC|TERM_VNULL)
10930 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77  ;.    if( idxNew
10940 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   ){.      pNewTe
10950 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
10960 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
10970 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
10980 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  t = 0;.      pNe
10990 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
109a0 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
109b0 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
109c0 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
109d0 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
109e0 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
109f0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
10a00 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  _GT;.      pNewT
10a10 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
10a20 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
10a30 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
10a40 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
10a50 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
10a60 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
10a70 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
10a80 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
10a90 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
10aa0 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
10ab0 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
10ac0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
10ad0 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20  NABLE_STAT */.. 
10ae0 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63   /* Prevent ON c
10af0 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61  lause terms of a
10b00 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20   LEFT JOIN from 
10b10 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72  being used to dr
10b20 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ive.  ** an inde
10b30 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  x for tables to 
10b40 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
10b50 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65  join..  */.  pTe
10b60 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
10b70 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d  |= extraRight;.}
10b80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
10b90 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 70  ction searches p
10ba0 4c 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72 79  List for a entry
10bb0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
10bc0 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
10bd0 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64  .** of index pId
10be0 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68  x..**.** If such
10bf0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
10c00 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64  s found, its ind
10c10 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d  ex in pList->a[]
10c20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
10c30 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f  .** no expressio
10c40 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69  n is found, -1 i
10c50 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
10c60 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
10c70 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20  dexCol(.  Parse 
10c80 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
10ca0 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
10cb0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69  /* Expression li
10ce0 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  st to search */.
10cf0 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20    int iBase,    
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d10 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20    /* Cursor for 
10d20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
10d30 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20   with pIdx */.  
10d40 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63  /* Index to matc
10d70 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20  h column of */. 
10d80 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20   int iCol       
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10da0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e   /* Column of in
10db0 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a  dex to match */.
10dc0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
10dd0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
10de0 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
10df0 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Col];..  for(i=0
10e00 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
10e10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
10e20 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
10e30 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
10e40 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
10e50 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
10e60 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26  TK_COLUMN.     &
10e70 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  & p->iColumn==pI
10e80 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f  dx->aiColumn[iCo
10e90 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54  l].     && p->iT
10ea0 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20  able==iBase.    
10eb0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
10ec0 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
10ed0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
10ee0 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
10ef0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
10f00 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29  f( ALWAYS(pColl)
10f10 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
10f20 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
10f30 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
10f40 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
10f50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10f60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
10f70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10f80 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  true if the DIST
10f90 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d  INCT expression-
10fa0 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
10fb0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
10fc0 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e  t.** is redundan
10fd0 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49  t..**.** A DISTI
10fe0 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75  NCT list is redu
10ff0 6e 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74  ndant if the dat
11000 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73  abase contains s
11010 6f 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  ome subset of.**
11020 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
11030 65 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e  e unique and non
11040 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  -null..*/.static
11050 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
11060 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
11070 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11080 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11090 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
110a0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
110b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
110c0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
110d0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
110e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
110f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
11100 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
11110 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20  stinct       /* 
11120 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  The result set t
11130 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
11140 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20  DISTINCT */.){. 
11150 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
11160 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
11170 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
11190 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20    int iBase;..  
111a0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  /* If there is m
111b0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62  ore than one tab
111c0 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  le or sub-select
111d0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
111e0 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  use of.  ** this
111f0 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
11200 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
11210 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61  ible to show tha
11220 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a  t the DISTINCT .
11230 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72    ** clause is r
11240 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69  edundant. */.  i
11250 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
11260 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
11270 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c  .  iBase = pTabL
11280 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
11290 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62  r;.  pTab = pTab
112a0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
112b0 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
112c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
112d0 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d   is an IPK colum
112e0 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65  n on table iBase
112f0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  , then return . 
11300 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20   ** true. Note: 
11310 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d  The (p->iTable==
11320 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74  iBase) part of t
11330 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20  his test may be 
11340 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a  false if the.  *
11350 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  * current SELECT
11360 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
11370 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f   sub-query..  */
11380 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
11390 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20  istinct->nExpr; 
113a0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
113b0 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
113c0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74  kipCollate(pDist
113d0 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
113e0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
113f0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
11400 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
11410 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
11420 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
11430 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
11440 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
11450 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
11460 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
11470 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
11480 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
11490 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
114a0 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
114b0 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
114c0 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
114d0 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
114e0 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
114f0 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
11500 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
11510 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
11520 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
11530 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
11540 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
11550 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
11560 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
11570 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
11580 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
11590 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
115a0 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
115b0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
115c0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
115d0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
115e0 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
115f0 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
11600 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
11610 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
11620 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f     3. All of tho
11630 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  se index columns
11640 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57   for which the W
11650 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
11660 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63   not.  **      c
11670 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22  ontain a "col=X"
11680 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63   term are subjec
11690 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  t to a NOT NULL 
116a0 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
116b0 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
116c0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
116d0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
116e0 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  ){.    if( pIdx-
116f0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
11700 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
11710 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
11720 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
11730 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
11740 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
11750 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  n[i];.      if( 
11760 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  0==findTerm(pWC,
11770 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28   iBase, iCol, ~(
11780 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
11790 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  , pIdx) ){.     
117a0 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d     int iIdxCol =
117b0 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50   findIndexCol(pP
117c0 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c  arse, pDistinct,
117d0 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29   iBase, pIdx, i)
117e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49  ;.        if( iI
117f0 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d  dxCol<0 || pTab-
11800 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
11810 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c  lumn[i]].notNull
11820 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11830 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11840 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11850 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d      if( i==pIdx-
11860 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
11870 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
11880 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
11890 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
118a0 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ier is redundant
118b0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
118c0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 1;.    }.  }..
118d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
118e0 2a 20 0a 2a 2a 20 54 68 65 20 28 61 6e 20 61 70  * .** The (an ap
118f0 70 72 6f 78 69 6d 61 74 65 29 20 73 75 6d 20 6f  proximate) sum o
11900 66 20 74 77 6f 20 57 68 65 72 65 43 6f 73 74 73  f two WhereCosts
11910 2e 20 20 54 68 69 73 20 63 6f 6d 70 75 74 61 74  .  This computat
11920 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20  ion is.** not a 
11930 73 69 6d 70 6c 65 20 22 2b 22 20 6f 70 65 72 61  simple "+" opera
11940 74 6f 72 20 62 65 63 61 75 73 65 20 57 68 65 72  tor because Wher
11950 65 43 6f 73 74 20 69 73 20 73 74 6f 72 65 64 20  eCost is stored 
11960 61 73 20 61 20 6c 6f 67 61 72 69 74 68 6d 69 63  as a logarithmic
11970 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20 0a 2a  .** value..** .*
11980 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43 6f  /.static WhereCo
11990 73 74 20 77 68 65 72 65 43 6f 73 74 41 64 64 28  st whereCostAdd(
119a0 57 68 65 72 65 43 6f 73 74 20 61 2c 20 57 68 65  WhereCost a, Whe
119b0 72 65 43 6f 73 74 20 62 29 7b 0a 20 20 73 74 61  reCost b){.  sta
119c0 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
119d0 65 64 20 63 68 61 72 20 78 5b 5d 20 3d 20 7b 0a  ed char x[] = {.
119e0 20 20 20 20 20 31 30 2c 20 31 30 2c 20 20 20 20       10, 10,    
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 20 20 20 2f 2a 20 30 2c 31 20 2a 2f 0a 20       /* 0,1 */. 
11a10 20 20 20 20 20 39 2c 20 39 2c 20 20 20 20 20 20       9, 9,      
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 20 20 20 20 2f 2a 20 32 2c 33 20 2a 2f 0a 20 20      /* 2,3 */.  
11a40 20 20 20 20 38 2c 20 38 2c 20 20 20 20 20 20 20      8, 8,       
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a60 20 20 20 2f 2a 20 34 2c 35 20 2a 2f 0a 20 20 20     /* 4,5 */.   
11a70 20 20 20 37 2c 20 37 2c 20 37 2c 20 20 20 20 20     7, 7, 7,     
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a90 20 20 2f 2a 20 36 2c 37 2c 38 20 2a 2f 0a 20 20    /* 6,7,8 */.  
11aa0 20 20 20 20 36 2c 20 36 2c 20 36 2c 20 20 20 20      6, 6, 6,    
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ac0 20 20 20 2f 2a 20 39 2c 31 30 2c 31 31 20 2a 2f     /* 9,10,11 */
11ad0 0a 20 20 20 20 20 20 35 2c 20 35 2c 20 35 2c 20  .      5, 5, 5, 
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11af0 20 20 20 20 20 20 2f 2a 20 31 32 2d 31 34 20 2a        /* 12-14 *
11b00 2f 0a 20 20 20 20 20 20 34 2c 20 34 2c 20 34 2c  /.      4, 4, 4,
11b10 20 34 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   4,             
11b20 20 20 20 20 20 20 20 2f 2a 20 31 35 2d 31 38 20         /* 15-18 
11b30 2a 2f 0a 20 20 20 20 20 20 33 2c 20 33 2c 20 33  */.      3, 3, 3
11b40 2c 20 33 2c 20 33 2c 20 33 2c 20 20 20 20 20 20  , 3, 3, 3,      
11b50 20 20 20 20 20 20 20 20 2f 2a 20 31 39 2d 32 34          /* 19-24
11b60 20 2a 2f 0a 20 20 20 20 20 20 32 2c 20 32 2c 20   */.      2, 2, 
11b70 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 20  2, 2, 2, 2, 2,  
11b80 20 20 20 20 20 20 20 20 20 2f 2a 20 32 35 2d 33           /* 25-3
11b90 31 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 66 28 20  1 */.  };.  if( 
11ba0 61 3e 3d 62 20 29 7b 0a 20 20 20 20 69 66 28 20  a>=b ){.    if( 
11bb0 61 3e 62 2b 34 39 20 29 20 72 65 74 75 72 6e 20  a>b+49 ) return 
11bc0 61 3b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b 33  a;.    if( a>b+3
11bd0 31 20 29 20 72 65 74 75 72 6e 20 61 2b 31 3b 0a  1 ) return a+1;.
11be0 20 20 20 20 72 65 74 75 72 6e 20 61 2b 78 5b 61      return a+x[a
11bf0 2d 62 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -b];.  }else{.  
11c00 20 20 69 66 28 20 62 3e 61 2b 34 39 20 29 20 72    if( b>a+49 ) r
11c10 65 74 75 72 6e 20 62 3b 0a 20 20 20 20 69 66 28  eturn b;.    if(
11c20 20 62 3e 61 2b 33 31 20 29 20 72 65 74 75 72 6e   b>a+31 ) return
11c30 20 62 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   b+1;.    return
11c40 20 62 2b 78 5b 62 2d 61 5d 3b 0a 20 20 7d 0a 7d   b+x[b-a];.  }.}
11c50 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
11c60 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  an integer into 
11c70 61 20 57 68 65 72 65 43 6f 73 74 2e 20 20 49 6e  a WhereCost.  In
11c80 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63 6f   other words, co
11c90 6d 70 75 74 65 20 61 0a 2a 2a 20 67 6f 6f 64 20  mpute a.** good 
11ca0 61 70 70 72 6f 78 69 6d 61 74 61 74 69 6f 6e 20  approximatation 
11cb0 66 6f 72 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a  for 10*log2(x)..
11cc0 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43  */.static WhereC
11cd0 6f 73 74 20 77 68 65 72 65 43 6f 73 74 28 74 52  ost whereCost(tR
11ce0 6f 77 63 6e 74 20 78 29 7b 0a 20 20 73 74 61 74  owcnt x){.  stat
11cf0 69 63 20 57 68 65 72 65 43 6f 73 74 20 61 5b 5d  ic WhereCost a[]
11d00 20 3d 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35 2c   = { 0, 2, 3, 5,
11d10 20 36 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a 20   6, 7, 8, 9 };. 
11d20 20 57 68 65 72 65 43 6f 73 74 20 79 20 3d 20 34   WhereCost y = 4
11d30 30 3b 0a 20 20 69 66 28 20 78 3c 38 20 29 7b 0a  0;.  if( x<8 ){.
11d40 20 20 20 20 69 66 28 20 78 3c 32 20 29 20 72 65      if( x<2 ) re
11d50 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
11d60 65 28 20 78 3c 38 20 29 7b 20 20 79 20 2d 3d 20  e( x<8 ){  y -= 
11d70 31 30 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d 0a 20  10; x <<= 1; }. 
11d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
11d90 65 28 20 78 3e 32 35 35 20 29 7b 20 79 20 2b 3d  e( x>255 ){ y +=
11da0 20 34 30 3b 20 78 20 3e 3e 3d 20 34 3b 20 7d 0a   40; x >>= 4; }.
11db0 20 20 20 20 77 68 69 6c 65 28 20 78 3e 31 35 20      while( x>15 
11dc0 29 7b 20 20 79 20 2b 3d 20 31 30 3b 20 78 20 3e  ){  y += 10; x >
11dd0 3e 3d 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65  >= 1; }.  }.  re
11de0 74 75 72 6e 20 61 5b 78 26 37 5d 20 2b 20 79 20  turn a[x&7] + y 
11df0 2d 20 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  - 10;.}..#ifndef
11e00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
11e10 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
11e20 43 6f 6e 76 65 72 74 20 61 20 64 6f 75 62 6c 65  Convert a double
11e30 20 28 61 73 20 72 65 63 65 69 76 65 64 20 66 72   (as received fr
11e40 6f 6d 20 78 42 65 73 74 49 6e 64 65 78 20 6f 66  om xBestIndex of
11e50 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
11e60 29 0a 2a 2a 20 69 6e 74 6f 20 61 20 57 68 65 72  ).** into a Wher
11e70 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72  eCost.  In other
11e80 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20   words, compute 
11e90 61 6e 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  an approximation
11ea0 20 66 6f 72 0a 2a 2a 20 31 30 2a 6c 6f 67 32 28   for.** 10*log2(
11eb0 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  x)..*/.static Wh
11ec0 65 72 65 43 6f 73 74 20 77 68 65 72 65 43 6f 73  ereCost whereCos
11ed0 74 46 72 6f 6d 44 6f 75 62 6c 65 28 64 6f 75 62  tFromDouble(doub
11ee0 6c 65 20 78 29 7b 0a 20 20 75 36 34 20 61 3b 0a  le x){.  u64 a;.
11ef0 20 20 57 68 65 72 65 43 6f 73 74 20 65 3b 0a 20    WhereCost e;. 
11f00 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
11f10 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
11f20 61 29 3d 3d 38 20 29 3b 0a 20 20 69 66 28 20 78  a)==8 );.  if( x
11f30 3c 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=1 ) return 0;.
11f40 20 20 69 66 28 20 78 3c 3d 32 30 30 30 30 30 30    if( x<=2000000
11f50 30 30 30 20 29 20 72 65 74 75 72 6e 20 77 68 65  000 ) return whe
11f60 72 65 43 6f 73 74 28 28 74 52 6f 77 63 6e 74 29  reCost((tRowcnt)
11f70 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 2c  x);.  memcpy(&a,
11f80 20 26 78 2c 20 38 29 3b 0a 20 20 65 20 3d 20 28   &x, 8);.  e = (
11f90 61 3e 3e 35 32 29 20 2d 20 31 30 32 32 3b 0a 20  a>>52) - 1022;. 
11fa0 20 72 65 74 75 72 6e 20 65 2a 31 30 3b 0a 7d 0a   return e*10;.}.
11fb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11fc0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11fd0 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  LE */../*.** Est
11fe0 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69  imate the logari
11ff0 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
12000 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32   value to base 2
12010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
12020 65 43 6f 73 74 20 65 73 74 4c 6f 67 28 57 68 65  eCost estLog(Whe
12030 72 65 43 6f 73 74 20 4e 29 7b 0a 20 20 57 68 65  reCost N){.  Whe
12040 72 65 43 6f 73 74 20 78 20 3d 20 77 68 65 72 65  reCost x = where
12050 43 6f 73 74 28 4e 29 3b 0a 20 20 72 65 74 75 72  Cost(N);.  retur
12060 6e 20 78 3e 33 33 20 3f 20 78 20 2d 20 33 33 20  n x>33 ? x - 33 
12070 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77  : 0;.}../*.** Tw
12080 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  o routines for p
12090 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74  rinting the cont
120a0 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ent of an sqlite
120b0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20  3_index_info.** 
120c0 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64  structure.  Used
120d0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
120e0 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
120f0 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20    If neither.** 
12100 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53  SQLITE_TEST or S
12110 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20  QLITE_DEBUG are 
12120 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
12130 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ese routines.** 
12140 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23  are no-ops..*/.#
12150 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
12160 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12170 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
12180 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
12190 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64  LED).static void
121a0 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
121b0 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
121c0 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
121d0 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
121e0 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
121f0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
12200 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
12210 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
12220 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12230 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
12240 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
12250 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
12260 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
12270 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
12280 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
12290 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
122a0 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
122b0 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
122c0 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
122d0 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
122e0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
122f0 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
12300 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
12310 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
12320 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
12330 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
12340 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
12350 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
12360 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
12370 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
12380 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
12390 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
123a0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
123b0 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
123c0 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
123d0 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
123e0 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
123f0 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
12400 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
12410 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
12420 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
12430 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12440 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
12450 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
12460 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
12470 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
12480 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
12490 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
124a0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
124b0 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
124c0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
124d0 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
124e0 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
124f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
12500 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
12510 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
12520 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
12530 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
12540 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
12550 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
12560 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
12570 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12580 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
12590 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
125a0 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65  edCost);.}.#else
125b0 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
125c0 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
125d0 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
125e0 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
125f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12600 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
12610 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75  INDEX./*.** Retu
12620 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57  rn TRUE if the W
12630 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
12640 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66   pTerm is of a f
12650 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20  orm where it.** 
12660 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69  could be used wi
12670 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61  th an index to a
12680 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75  ccess pSrc, assu
12690 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69  ming an appropri
126a0 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69  ate.** index exi
126b0 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
126c0 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65  int termCanDrive
126d0 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65  Index(.  WhereTe
126e0 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20  rm *pTerm,      
126f0 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
12700 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
12710 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63  check */.  struc
12720 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
12730 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62  pSrc,     /* Tab
12740 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  le we are trying
12750 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20   to access */.  
12760 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12780 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65  * Tables in oute
12790 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a  r loops of the j
127a0 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  oin */.){.  char
127b0 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72   aff;.  if( pTer
127c0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70  m->leftCursor!=p
127d0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72  Src->iCursor ) r
127e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
127f0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12800 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72   & WO_EQ)==0 ) r
12810 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
12820 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
12830 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ht & notReady)!=
12840 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12850 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  if( pTerm->u.lef
12860 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  tColumn<0 ) retu
12870 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53  rn 0;.  aff = pS
12880 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  rc->pTab->aCol[p
12890 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
128a0 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
128b0 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
128c0 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72  xAffinityOk(pTer
128d0 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29  m->pExpr, aff) )
128e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
128f0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
12900 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12910 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
12920 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  INDEX./*.** Gene
12930 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e  rate code to con
12940 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
12950 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61   object for an a
12960 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a  utomatic index.*
12970 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20  * and to set up 
12980 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f  the WhereLevel o
12990 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20  bject pLevel so 
129a0 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65  that the code ge
129b0 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73  nerator.** makes
129c0 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f   use of the auto
129d0 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a  matic index..*/.
129e0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73  static void cons
129f0 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
12a00 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
12a10 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
12a20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
12a30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
12a40 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
12a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12a60 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
12a70 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
12a80 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
12a90 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
12aa0 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74  se term to get t
12ab0 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f  he next index */
12ac0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
12ad0 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
12ae0 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
12af0 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
12b00 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68  vailable */.  Wh
12b10 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
12b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
12b30 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72  te new index her
12b40 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43  e */.){.  int nC
12b50 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
12b60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12b70 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
12b80 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
12b90 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  dex */.  WhereTe
12ba0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
12bb0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
12bc0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
12bd0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
12be0 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
12bf0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  ;          /* En
12c00 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
12c10 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12c30 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79  * Byte of memory
12c40 20 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64 78   needed for pIdx
12c50 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
12c60 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
12c70 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63    /* Object desc
12c80 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73  ribing the trans
12c90 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
12ca0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12cc0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
12cd0 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
12ce0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
12cf0 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  drInit;         
12d00 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
12d10 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
12d20 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75  zation bypass ju
12d30 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  mp */.  Table *p
12d40 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
12d50 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
12d60 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
12d70 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
12d80 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yinfo;          
12d90 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
12da0 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  on for the index
12db0 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64   */   .  int add
12dc0 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
12dd0 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
12de0 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f  he index fill lo
12df0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  op */.  int regR
12e00 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
12e10 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
12e20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  holding an index
12e30 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
12e40 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
12e50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
12e60 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  mn counter */.  
12e70 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
12e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
12e90 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
12ea0 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20   int mxBitCol;  
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ec0 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69  Maximum column i
12ed0 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  n pSrc->colUsed 
12ee0 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
12ef0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
12f00 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
12f10 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63  quence to on a c
12f20 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
12f30 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
12f40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f         /* The Lo
12f50 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 42  op object */.  B
12f60 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20  itmask idxCols; 
12f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
12f80 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  tmap of columns 
12f90 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e  used for indexin
12fa0 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  g */.  Bitmask e
12fb0 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20  xtraCols;       
12fc0 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
12fd0 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
12fe0 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ns */..  /* Gene
12ff0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
13000 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
13010 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
13020 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
13030 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
13040 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
13050 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
13060 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
13070 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
13080 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
13090 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
130a0 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
130b0 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
130c0 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
130d0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
130e0 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
130f0 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64  added to the ind
13100 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64  ex.  ** and used
13110 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20   to match WHERE 
13120 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
13130 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20  ts */.  nColumn 
13140 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  = 0;.  pTable = 
13150 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57  pSrc->pTab;.  pW
13160 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70  CEnd = &pWC->a[p
13170 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c  WC->nTerm];.  pL
13180 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
13190 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20  Loop;.  idxCols 
131a0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
131b0 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
131c0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
131d0 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
131e0 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
131f0 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
13200 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
13210 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
13220 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
13230 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
13240 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
13250 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
13260 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
13270 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
13280 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
13290 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
132a0 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69  BMS-1 );.      i
132b0 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
132c0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
132d0 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
132e0 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
132f0 62 2c 20 70 4c 6f 6f 70 2c 20 6e 43 6f 6c 75 6d  b, pLoop, nColum
13300 6e 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  n+1) ) return;. 
13310 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
13320 54 65 72 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b 5d 20  Term[nColumn++] 
13330 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
13340 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
13350 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
13360 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
13370 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c  Column>0 );.  pL
13380 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
13390 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
133a0 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4c   = nColumn;.  pL
133b0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
133c0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
133d0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
133e0 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13400 20 20 20 20 20 7c 20 57 48 45 52 45 5f 54 45 4d       | WHERE_TEM
13410 50 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  P_INDEX;..  /* C
13420 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
13430 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
13440 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
13450 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
13460 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
13470 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
13480 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
13490 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
134a0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
134b0 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
134c0 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
134d0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
134e0 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
134f0 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
13500 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
13510 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
13520 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
13530 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
13540 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
13550 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
13560 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
13570 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
13580 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
13590 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
135a0 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
135b0 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
135c0 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
135d0 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
135e0 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
135f0 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
13600 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
13610 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
13620 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e  tCol = (pTable->
13630 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f  nCol >= BMS-1) ?
13640 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d   BMS-1 : pTable-
13650 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73  >nCol;.  testcas
13660 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
13670 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74  =BMS-1 );.  test
13680 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
13690 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66  ol==BMS-2 );.  f
136a0 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
136b0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
136c0 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41  ( extraCols & MA
136d0 53 4b 42 49 54 28 69 29 20 29 20 6e 43 6f 6c 75  SKBIT(i) ) nColu
136e0 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  mn++;.  }.  if( 
136f0 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
13700 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
13710 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d  {.    nColumn +=
13720 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20   pTable->nCol - 
13730 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70  BMS + 1;.  }.  p
13740 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
13750 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
13760 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
13770 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75  Y;..  /* Constru
13780 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
13790 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
137a0 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
137b0 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49  nByte = sizeof(I
137c0 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b  ndex);.  nByte +
137d0 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
137e0 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e  (int);     /* In
137f0 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a  dex.aiColumn */.
13800 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
13810 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  mn*sizeof(char*)
13820 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43  ;   /* Index.azC
13830 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  oll */.  nByte +
13840 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  = nColumn;      
13850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
13860 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
13870 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74  /.  pIdx = sqlit
13880 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
13890 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65  Parse->db, nByte
138a0 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
138b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f   ) return;.  pLo
138c0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
138d0 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  ex = pIdx;.  pId
138e0 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
138f0 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20  r**)&pIdx[1];.  
13900 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
13910 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a   (int*)&pIdx->az
13920 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  Coll[nColumn];. 
13930 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
13940 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e  r = (u8*)&pIdx->
13950 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
13960 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  ];.  pIdx->zName
13970 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
13980 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
13990 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49   = nColumn;.  pI
139a0 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  dx->pTable = pTa
139b0 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  ble;.  n = 0;.  
139c0 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
139d0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
139e0 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
139f0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
13a00 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
13a10 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
13a20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
13a30 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
13a40 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
13a50 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
13a60 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
13a70 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
13a80 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
13a90 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
13aa0 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
13ab0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13ac0 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
13ad0 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
13ae0 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
13af0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
13b00 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
13b10 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  pr;.        idxC
13b20 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
13b30 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
13b40 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d  lumn[n] = pTerm-
13b50 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
13b60 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
13b70 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
13b80 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
13b90 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
13ba0 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
13bb0 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
13bc0 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c  n] = ALWAYS(pCol
13bd0 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  l) ? pColl->zNam
13be0 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  e : "BINARY";.  
13bf0 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
13c00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
13c10 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70  ssert( (u32)n==p
13c20 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
13c30 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61  q );..  /* Add a
13c40 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
13c50 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  s needed to make
13c60 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
13c70 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  ndex into.  ** a
13c80 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
13c90 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
13ca0 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
13cb0 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
13cc0 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
13cd0 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
13ce0 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
13cf0 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
13d00 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
13d10 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
13d20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  }.  }.  if( pSrc
13d30 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
13d40 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
13d50 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69    for(i=BMS-1; i
13d60 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
13d70 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
13d80 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
13d90 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
13da0 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
13db0 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
13dc0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
13dd0 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  t( n==nColumn );
13de0 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
13df0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
13e00 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20  x */.  pKeyinfo 
13e10 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
13e20 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
13e30 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dx);.  assert( p
13e40 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
13e50 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69  0 );.  pLevel->i
13e60 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  IdxCur = pParse-
13e70 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nTab++;.  sqlit
13e80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13e90 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78  OP_OpenAutoindex
13ea0 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
13eb0 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c  r, nColumn+1, 0,
13ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13ed0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
13ee0 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  info, P4_KEYINFO
13ef0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62  _HANDOFF);.  Vdb
13f00 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
13f10 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
13f20 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
13f30 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
13f40 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
13f50 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  ent */.  addrTop
13f60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13f70 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
13f80 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
13f90 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64  ur);.  regRecord
13fa0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
13fb0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
13fc0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
13fd0 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
13fe0 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  pIdx, pLevel->iT
13ff0 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  abCur, regRecord
14000 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
14010 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14020 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65  IdxInsert, pLeve
14030 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52  l->iIdxCur, regR
14040 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
14050 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
14060 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
14070 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65  ESULT);.  sqlite
14080 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14090 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e  P_Next, pLevel->
140a0 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70  iTabCur, addrTop
140b0 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
140c0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
140d0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
140e0 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71  AUTOINDEX);.  sq
140f0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14100 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  e(v, addrTop);. 
14110 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
14120 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
14130 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20  egRecord);.  .  
14140 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
14150 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
14160 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
14170 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
14180 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
14190 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  it);.}.#endif /*
141a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
141b0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
141c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
141d0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
141e0 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
141f0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
14200 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14210 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
14220 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
14230 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
14240 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
14250 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
14260 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
14270 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
14280 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
14290 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
142a0 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
142b0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
142c0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
142d0 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
142e0 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
142f0 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c  Parse,.  WhereCl
14300 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72  ause *pWC,.  str
14310 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
14320 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69   *pSrc,.  ExprLi
14330 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a  st *pOrderBy.){.
14340 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
14350 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63  t nTerm;.  struc
14360 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14370 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
14380 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
14390 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
143a0 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42  erby *pIdxOrderB
143b0 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  y;.  struct sqli
143c0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
143d0 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
143e0 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
143f0 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
14400 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
14410 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
14420 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f  dxInfo;..  /* Co
14430 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
14440 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45  f possible WHERE
14450 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
14460 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20  nts referring.  
14470 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75  ** to this virtu
14480 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  al table */.  fo
14490 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65  r(i=nTerm=0, pTe
144a0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
144b0 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
144c0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
144d0 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
144e0 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
144f0 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
14500 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
14510 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
14520 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
14530 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
14540 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
14550 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
14560 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14570 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14580 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
14590 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
145a0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
145b0 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e  ISNULL) ) contin
145c0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
145d0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
145e0 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
145f0 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b  ue;.    nTerm++;
14600 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
14610 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14620 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
14630 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
14640 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72  urrent .  ** vir
14650 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20  tual table then 
14660 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
14670 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20  or the aOrderBy 
14680 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  part of.  ** the
14690 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
146a0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20  nfo structure.. 
146b0 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   */.  nOrderBy =
146c0 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   0;.  if( pOrder
146d0 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  By ){.    int n 
146e0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
146f0 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
14700 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
14710 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
14720 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
14730 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
14740 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
14750 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
14760 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
14770 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
14780 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29   }.    if( i==n)
14790 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79  {.      nOrderBy
147a0 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
147b0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
147c0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
147d0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  _info structure.
147e0 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20    */.  pIdxInfo 
147f0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
14800 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
14810 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e  , sizeof(*pIdxIn
14820 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo).            
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
14840 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f   (sizeof(*pIdxCo
14850 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55  ns) + sizeof(*pU
14860 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20  sage))*nTerm.   
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
14890 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e  (*pIdxOrderBy)*n
148a0 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28  OrderBy );.  if(
148b0 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
148c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
148d0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74  Msg(pParse, "out
148e0 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
148f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
14900 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
14910 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
14920 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
14930 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14940 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20  e contains.  ** 
14950 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74  many fields that
14960 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63   are declared "c
14970 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74  onst" to prevent
14980 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d   xBestIndex from
14990 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  .  ** changing t
149a0 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f  hem.  We have to
149b0 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63   do some funky c
149c0 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  asting in order 
149d0 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  to.  ** initiali
149e0 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e  ze those fields.
149f0 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  .  */.  pIdxCons
14a00 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
14a10 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14a20 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31  int*)&pIdxInfo[1
14a30 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79  ];.  pIdxOrderBy
14a40 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
14a50 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
14a60 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72  *)&pIdxCons[nTer
14a70 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28  m];.  pUsage = (
14a80 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14a90 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
14aa0 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65  usage*)&pIdxOrde
14ab0 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20  rBy[nOrderBy];. 
14ac0 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
14ad0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->nConstraint =
14ae0 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a   nTerm;.  *(int*
14af0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  )&pIdxInfo->nOrd
14b00 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
14b10 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
14b20 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
14b30 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
14b40 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->aConstraint = 
14b50 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74  pIdxCons;.  *(st
14b60 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14b70 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49  ex_orderby**)&pI
14b80 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  dxInfo->aOrderBy
14b90 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a   = pIdxOrderBy;.
14ba0 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
14bb0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14bc0 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64  int_usage**)&pId
14bd0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
14be0 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20  ntUsage =.      
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73               pUs
14c30 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d  age;..  for(i=j=
14c40 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
14c50 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
14c60 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
14c70 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28    u8 op;.    if(
14c80 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
14c90 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
14ca0 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
14cb0 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
14cc0 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
14cd0 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
14ce0 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
14cf0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
14d00 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
14d10 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
14d20 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
14d30 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
14d40 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
14d50 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
14d60 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
14d70 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
14d80 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
14d90 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
14da0 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
14db0 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
14dc0 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
14dd0 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
14de0 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
14df0 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75  = i;.    op = (u
14e00 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
14e10 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
14e20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
14e30 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
14e40 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
14e50 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
14e60 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
14e70 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
14e80 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
14e90 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
14ea0 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
14eb0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
14ec0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
14ed0 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
14ee0 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
14ef0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
14f00 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
14f10 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
14f20 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
14f30 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
14f40 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
14f50 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
14f60 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
14f70 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
14f80 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
14f90 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
14fa0 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
14fb0 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
14fc0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
14fd0 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
14fe0 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
14ff0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
15000 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
15010 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
15020 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
15030 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
15040 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
15050 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15060 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
15070 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
15080 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
15090 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
150a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
150b0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
150c0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
150d0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
150e0 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
150f0 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
15100 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
15110 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
15120 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
15130 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
15140 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
15150 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
15160 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
15170 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
15180 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
15190 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
151a0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
151b0 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
151c0 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
151d0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
151e0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
151f0 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
15200 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
15210 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
15220 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
15230 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  info object that
15240 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20  .** comes in as 
15250 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74  the 3rd argument
15260 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
15270 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  n..**.** If an e
15280 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
15290 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
152a0 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
152b0 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
152c0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
152d0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
152e0 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
152f0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
15300 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
15310 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
15320 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
15330 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
15340 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
15350 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
15360 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
15370 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
15380 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
15390 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
153a0 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
153b0 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
153c0 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
153d0 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
153e0 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
153f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
15400 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
15410 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
15420 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
15430 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
15440 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
15450 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
15460 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
15470 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
15480 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
15490 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
154a0 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
154b0 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
154c0 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
154d0 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
154e0 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
154f0 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
15500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
15510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
15520 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
15530 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
15540 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
15550 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
15560 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
15570 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15580 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
15590 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
155a0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
155b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
155c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
155d0 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
155e0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
155f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
15600 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
15610 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
15620 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
15630 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
15640 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
15650 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
15660 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
15670 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
15680 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
15690 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
156a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
156b0 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
156c0 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
156d0 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
156e0 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
156f0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
15700 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
15710 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
15720 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
15730 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
15740 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
15750 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15760 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a  NABLE_STAT3./*.*
15770 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
15780 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
15790 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
157a0 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
157b0 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
157c0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
157d0 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
157e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
157f0 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
15800 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
15810 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a 20  ss than pVal.** 
15820 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
15830 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
15840 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 56  rows equal to pV
15850 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  al.**.** Return 
15860 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15870 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
15880 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74  int whereKeyStat
15890 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
158a0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
158b0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
158c0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  nection */.  Ind
158d0 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
158e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
158f0 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f  x to consider do
15900 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73 71 6c  main of */.  sql
15910 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
15920 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ,        /* Valu
15930 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  e to consider */
15940 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15960 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
15970 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
15980 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
15990 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
159a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
159b0 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
159c0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 74 52 6f  here */.){.  tRo
159d0 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64 65 78 53  wcnt n;.  IndexS
159e0 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 3b 0a  ample *aSample;.
159f0 20 20 69 6e 74 20 69 2c 20 65 54 79 70 65 3b 0a    int i, eType;.
15a00 20 20 69 6e 74 20 69 73 45 71 20 3d 20 30 3b 0a    int isEq = 0;.
15a10 20 20 69 36 34 20 76 3b 0a 20 20 64 6f 75 62 6c    i64 v;.  doubl
15a20 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61 73 73 65  e r, rS;..  asse
15a30 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30 20 7c  rt( roundUp==0 |
15a40 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29 3b 0a  | roundUp==1 );.
15a50 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
15a60 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 69  nSample>0 );.  i
15a70 66 28 20 70 56 61 6c 3d 3d 30 20 29 20 72 65 74  f( pVal==0 ) ret
15a80 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
15a90 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 61 69  ;.  n = pIdx->ai
15aa0 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 61 53 61  RowEst[0];.  aSa
15ab0 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61  mple = pIdx->aSa
15ac0 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65 20 3d 20  mple;.  eType = 
15ad0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
15ae0 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28  pe(pVal);..  if(
15af0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49   eType==SQLITE_I
15b00 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 76 20  NTEGER ){.    v 
15b10 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
15b20 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20 20 20  int64(pVal);.   
15b30 20 72 20 3d 20 28 69 36 34 29 76 3b 0a 20 20 20   r = (i64)v;.   
15b40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
15b50 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
15b60 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
15b70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
15b80 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  ITE_NULL ) conti
15b90 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61  nue;.      if( a
15ba0 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e  Sample[i].eType>
15bb0 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62  =SQLITE_TEXT ) b
15bc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
15bd0 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
15be0 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
15bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
15c00 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3e 3d  aSample[i].u.i>=
15c10 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  v ){.          i
15c20 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  sEq = aSample[i]
15c30 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20 20 20 20  .u.i==v;.       
15c40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
15c50 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
15c60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15c70 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
15c80 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20  e==SQLITE_FLOAT 
15c90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
15ca0 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 3d 72  Sample[i].u.r>=r
15cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
15cc0 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  Eq = aSample[i].
15cd0 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20  u.r==r;.        
15ce0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15cf0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15d00 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79  .  }else if( eTy
15d10 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54  pe==SQLITE_FLOAT
15d20 20 29 7b 0a 20 20 20 20 72 20 3d 20 73 71 6c 69   ){.    r = sqli
15d30 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
15d40 28 70 56 61 6c 29 3b 0a 20 20 20 20 66 6f 72 28  (pVal);.    for(
15d50 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61  i=0; i<pIdx->nSa
15d60 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
15d70 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
15d80 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e  .eType==SQLITE_N
15d90 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
15da0 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
15db0 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49  e[i].eType>=SQLI
15dc0 54 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b  TE_TEXT ) break;
15dd0 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
15de0 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
15df0 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  ITE_FLOAT ){.   
15e00 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c       rS = aSampl
15e10 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20 20 20 20  e[i].u.r;.      
15e20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
15e30 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  S = aSample[i].u
15e40 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  .i;.      }.    
15e50 20 20 69 66 28 20 72 53 3e 3d 72 20 29 7b 0a 20    if( rS>=r ){. 
15e60 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 72 53         isEq = rS
15e70 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ==r;.        bre
15e80 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
15e90 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54  }.  }else if( eT
15ea0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ype==SQLITE_NULL
15eb0 20 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20   ){.    i = 0;. 
15ec0 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 30     if( aSample[0
15ed0 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ].eType==SQLITE_
15ee0 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d 20 31 3b  NULL ) isEq = 1;
15ef0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
15f00 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
15f10 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79 70  ITE_TEXT || eTyp
15f20 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
15f30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
15f40 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
15f50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
15f60 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
15f70 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
15f80 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
15f90 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
15fa0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
15fb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15fc0 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e     if( i<pIdx->n
15fd0 53 61 6d 70 6c 65 20 29 7b 20 20 20 20 20 20 0a  Sample ){      .
15fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
15ff0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
16000 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
16010 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 73  Coll;.      cons
16020 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 20 69  t u8 *z;.      i
16030 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
16040 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20  _BLOB ){.       
16050 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a   z = (const u8 *
16060 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
16070 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20 20 20  lob(pVal);.     
16080 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     pColl = db->p
16090 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
160a0 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 2d    assert( pColl-
160b0 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
160c0 38 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  8 );.      }else
160d0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
160e0 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
160f0 53 65 71 28 70 50 61 72 73 65 2c 20 53 51 4c 49  Seq(pParse, SQLI
16100 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70 49 64  TE_UTF8, 0, *pId
16110 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  x->azColl);.    
16120 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
16130 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
16140 20 77 61 73 20 75 6e 61 76 61 69 6c 61 62 6c 65   was unavailable
16150 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65  , we should have
16160 20 66 61 69 6c 65 64 0a 20 20 20 20 20 20 20 20   failed.        
16170 2a 2a 20 6c 6f 6e 67 20 61 67 6f 20 61 6e 64 20  ** long ago and 
16180 6e 65 76 65 72 20 72 65 61 63 68 65 64 20 74 68  never reached th
16190 69 73 20 70 6f 69 6e 74 2e 20 20 42 75 74 20 77  is point.  But w
161a0 65 27 6c 6c 20 63 68 65 63 6b 20 6a 75 73 74 20  e'll check just 
161b0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  to.        ** be
161c0 20 64 6f 75 62 6c 79 20 73 75 72 65 2e 20 2a 2f   doubly sure. */
161d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56  .        if( NEV
161e0 45 52 28 70 43 6f 6c 6c 3d 3d 30 29 20 29 20 72  ER(pColl==0) ) r
161f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16200 4f 52 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20  OR;.        z = 
16210 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69  (const u8 *)sqli
16220 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
16230 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  l, pColl->enc);.
16240 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 20 29          if( !z )
16250 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
16260 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
16270 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16280 20 20 20 61 73 73 65 72 74 28 20 7a 20 26 26 20     assert( z && 
16290 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e  pColl && pColl->
162a0 78 43 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a  xCmp );.      }.
162b0 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
162c0 33 56 61 6c 75 65 42 79 74 65 73 28 70 56 61 6c  3ValueBytes(pVal
162d0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
162e0 20 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3c   .      for(; i<
162f0 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69  pIdx->nSample; i
16300 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
16310 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   c;.        int 
16320 65 53 61 6d 70 6c 65 74 79 70 65 20 3d 20 61 53  eSampletype = aS
16330 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a  ample[i].eType;.
16340 20 20 20 20 20 20 20 20 69 66 28 20 65 53 61 6d          if( eSam
16350 70 6c 65 74 79 70 65 3c 65 54 79 70 65 20 29 20  pletype<eType ) 
16360 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16370 20 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70    if( eSampletyp
16380 65 21 3d 65 54 79 70 65 20 29 20 62 72 65 61 6b  e!=eType ) break
16390 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
163a0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
163b0 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65      if( pColl->e
163c0 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc!=SQLITE_UTF8 
163d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
163e0 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20   nSample;.      
163f0 20 20 20 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c      char *zSampl
16400 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 74  e = sqlite3Utf8t
16410 6f 31 36 28 0a 20 20 20 20 20 20 20 20 20 20 20  o16(.           
16420 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e     db, pColl->en
16430 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  c, aSample[i].u.
16440 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42  z, aSample[i].nB
16450 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20  yte, &nSample.  
16460 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
16470 20 20 20 20 20 69 66 28 20 21 7a 53 61 6d 70 6c       if( !zSampl
16480 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
16490 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
164a0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
164b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
164c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
164d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
164e0 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78      c = pColl->x
164f0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
16500 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70  , nSample, zSamp
16510 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20  le, n, z);.     
16520 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
16530 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b  ee(db, zSample);
16540 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
16550 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
16560 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43            c = pC
16570 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
16580 3e 70 55 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b  >pUser, aSample[
16590 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c  i].nByte, aSampl
165a0 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b  e[i].u.z, n, z);
165b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
165c0 20 20 20 69 66 28 20 63 3e 3d 30 20 29 7b 0a 20     if( c>=0 ){. 
165d0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
165e0 30 20 29 20 69 73 45 71 20 3d 20 31 3b 0a 20 20  0 ) isEq = 1;.  
165f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16600 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16610 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16620 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
16630 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68  aSample[i] is th
16640 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74  e first sample t
16650 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
16660 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61  han.  ** or equa
16670 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69  l to pVal.  Or i
16680 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  f i==pIdx->nSamp
16690 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d  le, then all sam
166a0 70 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20  ples are less.  
166b0 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49  ** than pVal.  I
166c0 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56  f aSample[i]==pV
166d0 61 6c 2c 20 74 68 65 6e 20 69 73 45 71 3d 3d 31  al, then isEq==1
166e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45  ..  */.  if( isE
166f0 71 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  q ){.    assert(
16700 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
16710 20 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d   );.    aStat[0]
16720 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c   = aSample[i].nL
16730 74 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  t;.    aStat[1] 
16740 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45 71  = aSample[i].nEq
16750 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
16760 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69  Rowcnt iLower, i
16770 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20  Upper, iGap;.   
16780 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
16790 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     iLower = 0;. 
167a0 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53       iUpper = aS
167b0 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20 20  ample[0].nLt;.  
167c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
167d0 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d  Upper = i>=pIdx-
167e0 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 20 3a 20 61  >nSample ? n : a
167f0 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20  Sample[i].nLt;. 
16800 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
16810 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20 2b  ample[i-1].nEq +
16820 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 4c   aSample[i-1].nL
16830 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74  t;.    }.    aSt
16840 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 76  at[1] = pIdx->av
16850 67 45 71 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f  gEq;.    if( iLo
16860 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20  wer>=iUpper ){. 
16870 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20       iGap = 0;. 
16880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16890 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20  iGap = iUpper - 
168a0 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20  iLower;.    }.  
168b0 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b    if( roundUp ){
168c0 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69  .      iGap = (i
168d0 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65  Gap*2)/3;.    }e
168e0 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
168f0 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a  = iGap/3;.    }.
16900 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69      aStat[0] = i
16910 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20  Lower + iGap;.  
16920 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16930 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
16940 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
16950 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT3 */../*.** 
16960 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  If expression pE
16970 78 70 72 20 72 65 70 72 65 73 65 6e 74 73 20 61  xpr represents a
16980 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 2c 20   literal value, 
16990 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74  set *pp to point
169a0 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65   to.** an sqlite
169b0 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
169c0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
169d0 20 73 61 6d 65 20 76 61 6c 75 65 2c 20 77 69 74   same value, wit
169e0 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66  h affinity.** af
169f0 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c  f applied to it,
16a00 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
16a10 67 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  g. It is the res
16a20 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
16a30 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  he .** caller to
16a40 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
16a50 61 73 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ase this structu
16a60 72 65 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  re by passing it
16a70 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
16a80 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  alueFree()..**.*
16a90 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
16aa0 20 70 61 72 73 65 20 69 73 20 61 20 72 65 63 6f   parse is a reco
16ab0 6d 70 69 6c 65 20 28 73 71 6c 69 74 65 33 52 65  mpile (sqlite3Re
16ac0 70 72 65 70 61 72 65 28 29 29 20 61 6e 64 20 70  prepare()) and p
16ad0 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51  Expr.** is an SQ
16ae0 4c 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  L variable that 
16af0 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 20  currently has a 
16b00 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62  non-NULL value b
16b10 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63  ound to it,.** c
16b20 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33  reate an sqlite3
16b30 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
16b40 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
16b50 20 76 61 6c 75 65 2c 20 61 67 61 69 6e 20 77 69   value, again wi
16b60 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 61  th.** affinity a
16b70 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74  ff applied to it
16b80 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  , instead..**.**
16b90 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74   If neither of t
16ba0 68 65 20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20  he above apply, 
16bb0 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e  set *pp to NULL.
16bc0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
16bd0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
16be0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
16bf0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
16c00 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66  TE_OK..*/.#ifdef
16c10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
16c20 54 41 54 33 0a 73 74 61 74 69 63 20 69 6e 74 20  TAT3.static int 
16c30 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20  valueFromExpr(. 
16c40 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
16c50 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
16c60 0a 20 20 75 38 20 61 66 66 2c 20 0a 20 20 73 71  .  u8 aff, .  sq
16c70 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70  lite3_value **pp
16c80 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  .){.  if( pExpr-
16c90 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45  >op==TK_VARIABLE
16ca0 0a 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f  .   || (pExpr->o
16cb0 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
16cc0 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b  & pExpr->op2==TK
16cd0 5f 56 41 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a  _VARIABLE).  ){.
16ce0 20 20 20 20 69 6e 74 20 69 56 61 72 20 3d 20 70      int iVar = p
16cf0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
16d00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
16d10 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
16d20 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20  >pVdbe, iVar);. 
16d30 20 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33     *pp = sqlite3
16d40 56 64 62 65 47 65 74 56 61 6c 75 65 28 70 50 61  VdbeGetValue(pPa
16d50 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c  rse->pReprepare,
16d60 20 69 56 61 72 2c 20 61 66 66 29 3b 0a 20 20 20   iVar, aff);.   
16d70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16d80 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
16d90 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d  sqlite3ValueFrom
16da0 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
16db0 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55   pExpr, SQLITE_U
16dc0 54 46 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d  TF8, aff, pp);.}
16dd0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
16de0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16df0 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65  used to estimate
16e00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16e10 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
16e20 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73   visited.** by s
16e30 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78  canning an index
16e40 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20   for a range of 
16e50 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67  values. The rang
16e60 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70  e may have an up
16e70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20  per.** bound, a 
16e80 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20  lower bound, or 
16e90 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20  both. The WHERE 
16ea0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
16eb0 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a  t set the upper.
16ec0 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  ** and lower bou
16ed0 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e  nds are represen
16ee0 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e  ted by pLower an
16ef0 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
16f00 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78  ively. For.** ex
16f10 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20  ample, assuming 
16f20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20  that index p is 
16f30 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20  on t1(a):.**.** 
16f40 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
16f50 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
16f60 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  < ? ....**      
16f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f                |_
16f80 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a  ____|   |_____|.
16f90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16fa0 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16fb0 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77              pLow
16fd0 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a  er    pUpper.**.
16fe0 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
16ff0 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77  the upper or low
17000 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20  er bound is not 
17010 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55  present, then NU
17020 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a  LL is passed in.
17030 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  ** place of the 
17040 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
17050 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54  ereTerm..**.** T
17060 68 65 20 6e 45 71 20 70 61 72 61 6d 65 74 65 72  he nEq parameter
17070 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20 69   is passed the i
17080 6e 64 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65  ndex of the inde
17090 78 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74  x column subject
170a0 20 74 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65   to the.** range
170b0 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c   constraint. Or,
170c0 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74   equivalently, t
170d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75  he number of equ
170e0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
170f0 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62  s.** optimized b
17100 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69  y the proposed i
17110 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65  ndex scan. For e
17120 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
17130 20 69 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f   index p is.** o
17140 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20  n t1(a, b), and 
17150 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73  the SQL query is
17160 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
17170 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
17180 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20  ? AND b > ? AND 
17190 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  b < ? ....**.** 
171a0 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20  then nEq should 
171b0 62 65 20 70 61 73 73 65 64 20 74 68 65 20 76 61  be passed the va
171c0 6c 75 65 20 31 20 28 61 73 20 74 68 65 20 72 61  lue 1 (as the ra
171d0 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63  nge restricted c
171e0 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20  olumn,.** b, is 
171f0 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d  the second left-
17200 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  most column of t
17210 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69  he index). Or, i
17220 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a  f the query is:.
17230 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
17240 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
17250 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
17260 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f  .** then nEq sho
17270 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 30 2e  uld be passed 0.
17280 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
17290 6e 65 64 20 76 61 6c 75 65 20 69 73 20 61 6e 20  ned value is an 
172a0 69 6e 74 65 67 65 72 20 64 69 76 69 73 6f 72 20  integer divisor 
172b0 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 65 73  to reduce the es
172c0 74 69 6d 61 74 65 64 0a 2a 2a 20 73 65 61 72 63  timated.** searc
172d0 68 20 73 70 61 63 65 2e 20 20 41 20 72 65 74 75  h space.  A retu
172e0 72 6e 20 76 61 6c 75 65 20 6f 66 20 31 20 6d 65  rn value of 1 me
172f0 61 6e 73 20 74 68 61 74 20 72 61 6e 67 65 20 63  ans that range c
17300 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a  onstraints are.*
17310 2a 20 6e 6f 20 68 65 6c 70 20 61 74 20 61 6c 6c  * no help at all
17320 2e 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75  .  A return valu
17330 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 72 61 6e  e of 2 means ran
17340 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ge constraints a
17350 72 65 0a 2a 2a 20 65 78 70 65 63 74 65 64 20 74  re.** expected t
17360 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
17370 72 63 68 20 73 70 61 63 65 20 62 79 20 68 61 6c  rch space by hal
17380 66 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  f.  And so forth
17390 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ....**.** In the
173a0 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69   absence of sqli
173b0 74 65 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a 45  te_stat3 ANALYZE
173c0 20 64 61 74 61 2c 20 65 61 63 68 20 72 61 6e 67   data, each rang
173d0 65 20 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20  e inequality.** 
173e0 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
173f0 63 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61  ch space by a fa
17400 63 74 6f 72 20 6f 66 20 34 2e 20 20 48 65 6e 63  ctor of 4.  Henc
17410 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  e a single const
17420 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72  raint (x>?).** r
17430 65 73 75 6c 74 73 20 69 6e 20 61 20 72 65 74 75  esults in a retu
17440 72 6e 20 6f 66 20 34 20 61 6e 64 20 61 20 72 61  rn of 4 and a ra
17450 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  nge constraint (
17460 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 73  x>? AND x<?) res
17470 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74  ults.** in a ret
17480 75 72 6e 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74  urn of 16..*/.st
17490 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61  atic int whereRa
174a0 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ngeScanEst(.  Pa
174b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
174c0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
174d0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
174e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
174f0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
17500 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 63    /* The index c
17510 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 61  ontaining the ra
17520 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c  nge-compared col
17530 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20 20 69 6e  umn; "x" */.  in
17540 74 20 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20  t nEq,          
17550 20 20 20 2f 2a 20 69 6e 64 65 78 20 69 6e 74 6f     /* index into
17560 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74 68   p->aCol[] of th
17570 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64  e range-compared
17580 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65   column */.  Whe
17590 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
175a0 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
175b0 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
175c0 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
175d0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
175e0 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
175f0 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
17600 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
17610 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
17620 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
17630 68 65 72 65 43 6f 73 74 20 2a 70 52 61 6e 67 65  hereCost *pRange
17640 44 69 76 20 2f 2a 20 4f 55 54 3a 20 52 65 64 75  Div /* OUT: Redu
17650 63 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  ce search space 
17660 62 79 20 74 68 69 73 20 64 69 76 69 73 6f 72 20  by this divisor 
17670 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
17680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66   SQLITE_OK;..#if
17690 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
176a0 45 5f 53 54 41 54 33 0a 0a 20 20 69 66 28 20 6e  E_STAT3..  if( n
176b0 45 71 3d 3d 30 20 26 26 20 70 2d 3e 6e 53 61 6d  Eq==0 && p->nSam
176c0 70 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ple ){.    sqlit
176d0 65 33 5f 76 61 6c 75 65 20 2a 70 52 61 6e 67 65  e3_value *pRange
176e0 56 61 6c 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74  Val;.    tRowcnt
176f0 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
17700 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72 20   tRowcnt iUpper 
17710 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  = p->aiRowEst[0]
17720 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b  ;.    tRowcnt a[
17730 32 5d 3b 0a 20 20 20 20 75 38 20 61 66 66 20 3d  2];.    u8 aff =
17740 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c   p->pTable->aCol
17750 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d  [p->aiColumn[0]]
17760 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20  .affinity;..    
17770 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
17780 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
17790 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d  = pLower->pExpr-
177a0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72  >pRight;.      r
177b0 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  c = valueFromExp
177c0 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
177d0 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c   aff, &pRangeVal
177e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
177f0 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61   (pLower->eOpera
17800 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  tor & (WO_GT|WO_
17810 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  GE))!=0 );.     
17820 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17830 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68 65  OK.       && whe
17840 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
17850 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c  e, p, pRangeVal,
17860 20 30 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f   0, a)==SQLITE_O
17870 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  K.      ){.     
17880 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d     iLower = a[0]
17890 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
178a0 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
178b0 20 26 20 57 4f 5f 47 54 29 21 3d 30 20 29 20 69   & WO_GT)!=0 ) i
178c0 4c 6f 77 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20  Lower += a[1];. 
178d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
178e0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52  ite3ValueFree(pR
178f0 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a  angeVal);.    }.
17900 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17910 54 45 5f 4f 4b 20 26 26 20 70 55 70 70 65 72 20  TE_OK && pUpper 
17920 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
17930 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70  Expr = pUpper->p
17940 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
17950 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72      rc = valueFr
17960 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
17970 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52 61 6e  Expr, aff, &pRan
17980 67 65 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73  geVal);.      as
17990 73 65 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65  sert( (pUpper->e
179a0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
179b0 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a  T|WO_LE))!=0 );.
179c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
179d0 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26  LITE_OK.       &
179e0 26 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  & whereKeyStats(
179f0 70 50 61 72 73 65 2c 20 70 2c 20 70 52 61 6e 67  pParse, p, pRang
17a00 65 56 61 6c 2c 20 31 2c 20 61 29 3d 3d 53 51 4c  eVal, 1, a)==SQL
17a10 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a  ITE_OK.      ){.
17a20 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d          iUpper =
17a30 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69   a[0];.        i
17a40 66 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  f( (pUpper->eOpe
17a50 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d  rator & WO_LE)!=
17a60 30 20 29 20 69 55 70 70 65 72 20 2b 3d 20 61 5b  0 ) iUpper += a[
17a70 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1];.      }.    
17a80 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
17a90 65 65 28 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20  ee(pRangeVal);. 
17aa0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
17ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17ac0 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 69 42      WhereCost iB
17ad0 61 73 65 20 3d 20 77 68 65 72 65 43 6f 73 74 28  ase = whereCost(
17ae0 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b  p->aiRowEst[0]);
17af0 0a 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65  .      if( iUppe
17b00 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  r>iLower ){.    
17b10 20 20 20 20 69 42 61 73 65 20 2d 3d 20 77 68 65      iBase -= whe
17b20 72 65 43 6f 73 74 28 69 55 70 70 65 72 20 2d 20  reCost(iUpper - 
17b30 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d  iLower);.      }
17b40 0a 20 20 20 20 20 20 2a 70 52 61 6e 67 65 44 69  .      *pRangeDi
17b50 76 20 3d 20 69 42 61 73 65 3b 0a 20 20 20 20 20  v = iBase;.     
17b60 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
17b70 30 2c 20 28 22 72 61 6e 67 65 20 73 63 61 6e 20  0, ("range scan 
17b80 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20  regions: %u..%u 
17b90 20 64 69 76 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   div=%d\n",.    
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bb0 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72       (u32)iLower
17bc0 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 2a  , (u32)iUpper, *
17bd0 70 52 61 6e 67 65 44 69 76 29 29 3b 0a 20 20 20  pRangeDiv));.   
17be0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17bf0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  _OK;.    }.  }.#
17c00 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
17c10 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b  RAMETER(pParse);
17c20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
17c30 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44  TER(p);.  UNUSED
17c40 5f 50 41 52 41 4d 45 54 45 52 28 6e 45 71 29 3b  _PARAMETER(nEq);
17c50 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
17c60 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
17c70 65 72 20 29 3b 0a 20 20 2a 70 52 61 6e 67 65 44  er );.  *pRangeD
17c80 69 76 20 3d 20 30 3b 0a 20 20 2f 2a 20 54 55 4e  iv = 0;.  /* TUN
17c90 49 4e 47 3a 20 20 45 61 63 68 20 69 6e 65 71 75  ING:  Each inequ
17ca0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
17cb0 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
17cc0 72 63 68 20 73 70 61 63 65 20 34 2d 66 6f 6c 64  rch space 4-fold
17cd0 2e 0a 20 20 2a 2a 20 41 20 42 45 54 57 45 45 4e  ..  ** A BETWEEN
17ce0 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 72 65   operator, there
17cf0 66 6f 72 65 2c 20 72 65 64 75 63 65 73 20 74 68  fore, reduces th
17d00 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 31  e search space 1
17d10 36 2d 66 6f 6c 64 20 2a 2f 0a 20 20 69 66 28 20  6-fold */.  if( 
17d20 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65  pLower && (pLowe
17d30 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  r->wtFlags & TER
17d40 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
17d50 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 2b 3d     *pRangeDiv +=
17d60 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30   20;  assert( 20
17d70 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29 20 29  ==whereCost(4) )
17d80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70  ;.  }.  if( pUpp
17d90 65 72 20 29 7b 0a 20 20 20 20 2a 70 52 61 6e 67  er ){.    *pRang
17da0 65 44 69 76 20 2b 3d 20 32 30 3b 20 20 61 73 73  eDiv += 20;  ass
17db0 65 72 74 28 20 32 30 3d 3d 77 68 65 72 65 43 6f  ert( 20==whereCo
17dc0 73 74 28 34 29 20 29 3b 0a 20 20 7d 0a 20 20 72  st(4) );.  }.  r
17dd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
17de0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17df0 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73  E_STAT3./*.** Es
17e00 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
17e10 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
17e20 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
17e30 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65  based on.** an e
17e40 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
17e50 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77  nt x=VALUE and w
17e60 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20  here that VALUE 
17e70 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65  occurs in.** the
17e80 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e   histogram data.
17e90 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b    This only work
17ea0 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20  s when x is the 
17eb0 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c  left-most.** col
17ec0 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  umn of an index 
17ed0 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33  and sqlite_stat3
17ee0 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
17ef0 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  is available.** 
17f00 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20  for that index. 
17f10 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c   When pExpr==NUL
17f20 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  L that means the
17f30 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a   constraint is.*
17f40 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e  * "x IS NULL" in
17f50 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55  stead of "x=VALU
17f60 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  E"..**.** Write 
17f70 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
17f80 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
17f90 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
17fa0 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
17fb0 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
17fc0 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
17fd0 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
17fe0 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
17ff0 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
18000 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
18010 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
18020 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
18030 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
18040 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
18050 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
18060 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
18070 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
18080 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
18090 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
180a0 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
180b0 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
180c0 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
180d0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
180e0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
180f0 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75  tic int whereEqu
18100 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  alScanEst(.  Par
18110 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
18120 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
18130 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
18140 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
18150 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
18160 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68   /* The index wh
18170 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  ose left-most co
18180 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f  lumn is pTerm */
18190 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
181a0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
181b0 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
181c0 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
181d0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74  onstraint */.  t
181e0 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
181f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
18200 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
18210 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
18220 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
18230 20 2a 70 52 68 73 20 3d 20 30 3b 20 20 2f 2a 20   *pRhs = 0;  /* 
18240 56 41 4c 55 45 20 6f 6e 20 72 69 67 68 74 2d 68  VALUE on right-h
18250 61 6e 64 20 73 69 64 65 20 6f 66 20 70 54 65 72  and side of pTer
18260 6d 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b 20 20  m */.  u8 aff;  
18270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18280 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e   /* Column affin
18290 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ity */.  int rc;
182a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182b0 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
182c0 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
182d0 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b  .  tRowcnt a[2];
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
182f0 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 0a 20  Statistics */.. 
18300 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
18310 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ple!=0 );.  asse
18320 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  rt( p->nSample>0
18330 20 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70   );.  aff = p->p
18340 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
18350 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69  iColumn[0]].affi
18360 6e 69 74 79 3b 0a 20 20 69 66 28 20 70 45 78 70  nity;.  if( pExp
18370 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 61  r ){.    rc = va
18380 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
18390 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  se, pExpr, aff, 
183a0 26 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20  &pRhs);.    if( 
183b0 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45  rc ) goto whereE
183c0 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
183d0 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  el;.  }else{.   
183e0 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 56   pRhs = sqlite3V
183f0 61 6c 75 65 4e 65 77 28 70 50 61 72 73 65 2d 3e  alueNew(pParse->
18400 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  db);.  }.  if( p
18410 52 68 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Rhs==0 ) return 
18420 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
18430 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4b 65 79  .  rc = whereKey
18440 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
18450 20 70 52 68 73 2c 20 30 2c 20 61 29 3b 0a 20 20   pRhs, 0, a);.  
18460 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18470 4b 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52  K ){.    WHERETR
18480 41 43 45 28 30 78 31 30 30 2c 28 22 65 71 75 61  ACE(0x100,("equa
18490 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e  lity scan region
184a0 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61  s: %d\n", (int)a
184b0 5b 31 5d 29 29 3b 0a 20 20 20 20 2a 70 6e 52 6f  [1]));.    *pnRo
184c0 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68  w = a[1];.  }.wh
184d0 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f  ereEqualScanEst_
184e0 63 61 6e 63 65 6c 3a 0a 20 20 73 71 6c 69 74 65  cancel:.  sqlite
184f0 33 56 61 6c 75 65 46 72 65 65 28 70 52 68 73 29  3ValueFree(pRhs)
18500 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18510 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
18520 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
18530 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 23 69 66 64  _STAT3) */..#ifd
18540 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18550 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT3./*.** Est
18560 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
18570 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
18580 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
18590 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e  ased on.** an IN
185a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72   constraint wher
185b0 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  e the right-hand
185c0 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20   side of the IN 
185d0 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61  operator.** is a
185e0 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e   list of values.
185f0 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
18600 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20          WHERE x 
18610 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a  IN (1,2,3,4).**.
18620 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
18630 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
18640 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
18650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18660 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
18670 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
18680 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
18690 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
186a0 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
186b0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
186c0 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
186d0 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
186e0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
186f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
18700 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
18710 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
18720 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
18730 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
18740 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
18750 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
18760 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
18770 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
18780 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
18790 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
187a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
187b0 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
187c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
187d0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
187e0 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
187f0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
18800 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20    Index *p,     
18810 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
18820 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d  dex whose left-m
18830 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54  ost column is pT
18840 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  erm */.  ExprLis
18850 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
18860 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20   The value list 
18870 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78  on the RHS of "x
18880 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e   IN (v1,v2,v3,..
18890 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  .)" */.  tRowcnt
188a0 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a   *pnRow       /*
188b0 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
188c0 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
188d0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
188e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
188f0 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
18900 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
18910 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73  */.  tRowcnt nEs
18920 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
18930 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66  Number of rows f
18940 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  or a single term
18950 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52   */.  tRowcnt nR
18960 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a  owEst = 0;    /*
18970 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66   New estimate of
18980 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
18990 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ows */.  int i; 
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189b0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
189c0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
189d0 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
189e0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
189f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c  QLITE_OK && i<pL
18a00 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
18a10 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e  {.    nEst = p->
18a20 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
18a30 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
18a40 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
18a50 70 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  p, pList->a[i].p
18a60 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20  Expr, &nEst);.  
18a70 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73    nRowEst += nEs
18a80 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  t;.  }.  if( rc=
18a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18aa0 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20    if( nRowEst > 
18ab0 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29  p->aiRowEst[0] )
18ac0 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69   nRowEst = p->ai
18ad0 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a  RowEst[0];.    *
18ae0 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
18af0 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
18b00 30 78 31 30 30 2c 28 22 49 4e 20 72 6f 77 20 65  0x100,("IN row e
18b10 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c  stimate: est=%g\
18b20 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20  n", nRowEst));. 
18b30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18b40 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
18b50 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
18b60 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 2f 2a 0a  E_STAT3) */../*.
18b70 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72  ** Disable a ter
18b80 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
18b90 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20  lause.  Except, 
18ba0 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74  do not disable t
18bb0 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74  he term.** if it
18bc0 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54   controls a LEFT
18bd0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20   OUTER JOIN and 
18be0 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  it did not origi
18bf0 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a  nate in the ON.*
18c00 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  * or USING claus
18c10 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a  e of that join..
18c20 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  **.** Consider t
18c30 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b  he term t2.z='ok
18c40 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ' in the followi
18c50 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a  ng queries:.**.*
18c60 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20  *   (1)  SELECT 
18c70 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
18c80 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
18c90 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27  2.x WHERE t2.z='
18ca0 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45  ok'.**   (2)  SE
18cb0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
18cc0 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
18cd0 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
18ce0 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20  z='ok'.**   (3) 
18cf0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
18d00 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61  1, t2 WHERE t1.a
18d10 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
18d20 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32  ok'.**.** The t2
18d30 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62  .z='ok' is disab
18d40 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32  led in the in (2
18d50 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69  ) because it ori
18d60 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68  ginates.** in th
18d70 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  e ON clause.  Th
18d80 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c  e term is disabl
18d90 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73  ed in (3) becaus
18da0 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  e it is not part
18db0 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  .** of a LEFT OU
18dc0 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31  TER JOIN.  In (1
18dd0 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  ), the term is n
18de0 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a  ot disabled..**.
18df0 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
18e00 4e 2d 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35 38  N-OF: R-24597-58
18e10 36 35 35 20 4e 6f 20 74 65 73 74 73 20 61 72 65  655 No tests are
18e20 20 64 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73 20   done for terms 
18e30 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70  that are.** comp
18e40 6c 65 74 65 6c 79 20 73 61 74 69 73 66 69 65 64  letely satisfied
18e50 20 62 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a   by indices..**.
18e60 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74  ** Disabling a t
18e70 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20  erm causes that 
18e80 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74  term to not be t
18e90 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e  ested in the inn
18ea0 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68  er loop.** of th
18eb0 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69  e join.  Disabli
18ec0 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ng is an optimiz
18ed0 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72  ation.  When ter
18ee0 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  ms are satisfied
18ef0 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20  .** by indices, 
18f00 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20  we disable them 
18f10 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e  to prevent redun
18f20 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68  dant tests in th
18f30 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e  e inner.** loop.
18f40 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74    We would get t
18f50 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c  he correct resul
18f60 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65  ts if nothing we
18f70 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64  re ever disabled
18f80 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d  ,.** but joins m
18f90 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
18fa0 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74  e slower.  The t
18fb0 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62  rick is to disab
18fc0 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73  le as much.** as
18fd0 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20   we can without 
18fe0 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75  disabling too mu
18ff0 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62  ch.  If we disab
19000 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64  led in (1), we'd
19010 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e   get.** the wron
19020 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74  g answer.  See t
19030 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73  icket #813..*/.s
19040 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
19050 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65  leTerm(WhereLeve
19060 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65  l *pLevel, Where
19070 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20  Term *pTerm){.  
19080 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20  if( pTerm.      
19090 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  && (pTerm->wtFla
190a0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
190b0 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c  ==0.      && (pL
190c0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d  evel->iLeftJoin=
190d0 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =0 || ExprHasPro
190e0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
190f0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
19100 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d  ).  ){.    pTerm
19110 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
19120 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28  M_CODED;.    if(
19130 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e   pTerm->iParent>
19140 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
19150 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
19160 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70  &pTerm->pWC->a[p
19170 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
19180 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74        if( (--pOt
19190 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20  her->nChild)==0 
191a0 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
191b0 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
191c0 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Other);.      }.
191d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
191e0 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66  ** Code an OP_Af
191f0 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f  finity opcode to
19200 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d   apply the colum
19210 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
19220 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65  g zAff.** to the
19230 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   n registers sta
19240 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a  rting at base. .
19250 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69  **.** As an opti
19260 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45  mization, SQLITE
19270 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65  _AFF_NONE entrie
19280 73 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d  s (which are no-
19290 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62  ops) at the.** b
192a0 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64  eginning and end
192b0 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e   of zAff are ign
192c0 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e  ored.  If all en
192d0 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72  tries in zAff ar
192e0 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  e.** SQLITE_AFF_
192f0 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f  NONE, then no co
19300 64 65 20 67 65 74 73 20 67 65 6e 65 72 61 74 65  de gets generate
19310 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
19320 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20  utine makes its 
19330 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66  own copy of zAff
19340 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c   so that the cal
19350 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74  ler is free.** t
19360 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66  o modify zAff af
19370 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
19380 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61   returns..*/.sta
19390 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70  tic void codeApp
193a0 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  lyAffinity(Parse
193b0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61   *pParse, int ba
193c0 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20  se, int n, char 
193d0 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a  *zAff){.  Vdbe *
193e0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
193f0 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30  e;.  if( zAff==0
19400 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19410 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
19420 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
19430 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
19440 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20  sert( v!=0 );.. 
19450 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20   /* Adjust base 
19460 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76  and n to skip ov
19470 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  er SQLITE_AFF_NO
19480 4e 45 20 65 6e 74 72 69 65 73 20 61 74 20 74 68  NE entries at th
19490 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
194a0 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20   and end of the 
194b0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e  affinity string.
194c0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e  .  */.  while( n
194d0 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53  >0 && zAff[0]==S
194e0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
194f0 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62  {.    n--;.    b
19500 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b  ase++;.    zAff+
19510 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  +;.  }.  while( 
19520 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d  n>1 && zAff[n-1]
19530 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
19540 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  E ){.    n--;.  
19550 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  }..  /* Code the
19560 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63   OP_Affinity opc
19570 6f 64 65 20 69 66 20 74 68 65 72 65 20 69 73 20  ode if there is 
19580 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f  anything left to
19590 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e   do. */.  if( n>
195a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
195b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
195c0 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c  _Affinity, base,
195d0 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   n);.    sqlite3
195e0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
195f0 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20  -1, zAff, n);.  
19600 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19610 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
19620 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e  (pParse, base, n
19630 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
19640 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
19650 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61  or a single equa
19660 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65  lity term of the
19670 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
19680 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74  An equality.** t
19690 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65  erm can be eithe
196a0 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e  r X=expr or X IN
196b0 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20   (...).   pTerm 
196c0 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  is the term to b
196d0 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a  e .** coded..**.
196e0 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  ** The current v
196f0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  alue for the con
19700 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20  straint is left 
19710 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
19720 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f  ..**.** For a co
19730 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20  nstraint of the 
19740 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65  form X=expr, the
19750 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
19760 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73  valuated and its
19770 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65  .** result is le
19780 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ft on the stack.
19790 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74    For constraint
197a0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  s of the form X 
197b0 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73  IN (...).** this
197c0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
197d0 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
197e0 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  l iterate over a
197f0 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a  ll values of X..
19800 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
19810 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a  deEqualityTerm(.
19820 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
19830 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
19840 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
19850 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
19860 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72  rm,   /* The ter
19870 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
19880 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65  lause to be code
19890 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  d */.  WhereLeve
198a0 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68  l *pLevel, /* Th
198b0 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46  e level of the F
198c0 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72  ROM clause we ar
198d0 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
198e0 20 20 69 6e 74 20 69 45 71 2c 20 20 20 20 20 20    int iEq,      
198f0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
19900 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74  f the equality t
19910 65 72 6d 20 77 69 74 68 69 6e 20 74 68 69 73 20  erm within this 
19920 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62  level */.  int b
19930 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Rev,           /
19940 2a 20 54 72 75 65 20 66 6f 72 20 72 65 76 65 72  * True for rever
19950 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65 72  se-order IN oper
19960 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ations */.  int 
19970 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20 20  iTarget         
19980 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65  /* Attempt to le
19990 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ave results in t
199a0 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
199b0 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20  ){.  Expr *pX = 
199c0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
199d0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
199e0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
199f0 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
19a00 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
19a10 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  r holding result
19a20 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
19a30 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69  iTarget>0 );.  i
19a40 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  f( pX->op==TK_EQ
19a50 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73   ){.    iReg = s
19a60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
19a70 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d  rget(pParse, pX-
19a80 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74  >pRight, iTarget
19a90 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
19aa0 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  X->op==TK_ISNULL
19ab0 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   ){.    iReg = i
19ac0 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69  Target;.    sqli
19ad0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19ae0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65   OP_Null, 0, iRe
19af0 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
19b00 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
19b10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
19b20 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74  t eType;.    int
19b30 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63   iTab;.    struc
19b40 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20  t InLoop *pIn;. 
19b50 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c     WhereLoop *pL
19b60 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
19b70 4c 6f 6f 70 3b 0a 0a 20 20 20 20 69 66 28 20 28  Loop;..    if( (
19b80 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
19b90 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
19ba0 42 4c 45 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  BLE)==0.      &&
19bb0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
19bc0 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20 20 20  pIndex!=0.      
19bd0 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  && pLoop->u.btre
19be0 65 2e 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  e.pIndex->aSortO
19bf0 72 64 65 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b  rder[iEq].    ){
19c00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19c10 20 69 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20   iEq==0 );.     
19c20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76 20   testcase( bRev 
19c30 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20  );.      bRev = 
19c40 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  !bRev;.    }.   
19c50 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d   assert( pX->op=
19c60 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52  =TK_IN );.    iR
19c70 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
19c80 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
19c90 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
19ca0 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20  rse, pX, 0);.   
19cb0 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
19cc0 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
19cd0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
19ce0 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20  e( bRev );.     
19cf0 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20   bRev = !bRev;. 
19d00 20 20 20 7d 0a 20 20 20 20 69 54 61 62 20 3d 20     }.    iTab = 
19d10 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
19d20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19d30 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
19d40 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
19d50 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 61   iTab, 0);.    a
19d60 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
19d70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
19d80 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20  ULTI_OR)==0 );. 
19d90 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
19da0 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42  s |= WHERE_IN_AB
19db0 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  LE;.    if( pLev
19dc0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20  el->u.in.nIn==0 
19dd0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
19de0 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
19df0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19e00 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  v);.    }.    pL
19e10 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b  evel->u.in.nIn++
19e20 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  ;.    pLevel->u.
19e30 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20  in.aInLoop =.   
19e40 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61      sqlite3DbRea
19e50 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
19e60 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  e->db, pLevel->u
19e70 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20  .in.aInLoop,.   
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e90 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
19ea0 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  f(pLevel->u.in.a
19eb0 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65  InLoop[0])*pLeve
19ec0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20  l->u.in.nIn);.  
19ed0 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    pIn = pLevel->
19ee0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20  u.in.aInLoop;.  
19ef0 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20    if( pIn ){.   
19f00 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c     pIn += pLevel
19f10 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a  ->u.in.nIn - 1;.
19f20 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
19f30 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66  = iTab;.      if
19f40 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
19f50 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
19f60 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
19f70 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
19f80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
19f90 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a  d, iTab, iReg);.
19fa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19fb0 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
19fc0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
19fd0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
19fe0 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69  lumn, iTab, 0, i
19ff0 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
1a000 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f      pIn->eEndLoo
1a010 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  pOp = bRev ? OP_
1a020 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a  Prev : OP_Next;.
1a030 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a040 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
1a050 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20  Null, iReg);.   
1a060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
1a070 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d  evel->u.in.nIn =
1a080 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
1a090 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65  .  }.  disableTe
1a0a0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
1a0b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67  );.  return iReg
1a0c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1a0d0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1a0e0 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
1a0f0 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
1a100 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
1a110 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  index..**.** For
1a120 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64   example, consid
1a130 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c  er table t1(a,b,
1a140 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e  c,d,e,f) with in
1a150 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a  dex i1(a,b,c)..*
1a160 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48  * Suppose the WH
1a170 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68  ERE clause is th
1a180 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20  is:  a==5 AND b 
1a190 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63  IN (1,2,3) AND c
1a1a0 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54  >5 AND c<10.** T
1a1b0 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20  he index has as 
1a1c0 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71  many as three eq
1a1d0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1a1e0 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a  ts, but in this.
1a1f0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  ** example, the 
1a200 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20  third "c" value 
1a210 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  is an inequality
1a220 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a  .  So only two .
1a230 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ** constraints a
1a240 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20  re coded.  This 
1a250 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e  routine will gen
1a260 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
1a270 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61  aluate.** a==5 a
1a280 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e  nd b IN (1,2,3).
1a290 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61    The current va
1a2a0 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62  lues for a and b
1a2b0 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a   will be stored.
1a2c0 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76  ** in consecutiv
1a2d0 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  e registers and 
1a2e0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1a2f0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
1a300 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1a310 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
1a320 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20  e above nEq==2. 
1a330 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75   But this subrou
1a340 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
1a350 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e  ny value.** of n
1a360 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20  Eq including 0. 
1a370 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73   If nEq==0, this
1a380 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72   routine is near
1a390 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54  ly a no-op..** T
1a3a0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74  he only thing it
1a3b0 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74   does is allocat
1a3c0 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d  e the pLevel->iM
1a3d0 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  em memory cell a
1a3e0 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68  nd.** compute th
1a3f0 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
1a400 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
1a410 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c  utine always all
1a420 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73 74 20  ocates at least 
1a430 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  one memory cell 
1a440 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74  and returns.** t
1a450 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
1a460 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68   memory cell. Th
1a470 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63  e code that.** c
1a480 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
1a490 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20  e will use that 
1a4a0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73  memory cell to s
1a4b0 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61  tore the termina
1a4c0 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75  tion.** key valu
1a4d0 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
1a4e0 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49  If one or more I
1a4f0 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65  N operators appe
1a500 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  ar, then.** this
1a510 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
1a520 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  es an additional
1a530 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   nEq memory cell
1a540 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a  s for internal.*
1a550 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66  * use..**.** Bef
1a560 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
1a570 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20  pzAff is set to 
1a580 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
1a590 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  r containing a.*
1a5a0 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  * copy of the co
1a5b0 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
1a5c0 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65  ring of the inde
1a5d0 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  x allocated usin
1a5e0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61  g.** sqlite3DbMa
1a5f0 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20  lloc(). Except, 
1a600 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63  entries in the c
1a610 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e  opy of the strin
1a620 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  g associated.** 
1a630 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f  with equality co
1a640 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75  nstraints that u
1a650 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79  se NONE affinity
1a660 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53   are set to.** S
1a670 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
1a680 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20  This is to deal 
1a690 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73  with SQL such as
1a6a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
1a6b0 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
1a6c0 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50  ABLE t1(a TEXT P
1a6d0 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
1a6e0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  **   SELECT ... 
1a6f0 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74  FROM t1 AS t2, t
1a700 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74  1 WHERE t1.a = t
1a710 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  2.b;.**.** In th
1a720 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c  e example above,
1a730 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31   the index on t1
1a740 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66  (a) has TEXT aff
1a750 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65  inity. But since
1a760 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61  .** the right ha
1a770 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65  nd side of the e
1a780 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1a790 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f  nt (t2.b) has NO
1a7a0 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20  NE affinity,.** 
1a7b0 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68  no conversion sh
1a7c0 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65  ould be attempte
1a7d0 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61  d before using a
1a7e0 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70   t2.b value as p
1a7f0 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20  art of.** a key 
1a800 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e  to search the in
1a810 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66  dex. Hence the f
1a820 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65  irst byte in the
1a830 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69   returned affini
1a840 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20  ty.** string in 
1a850 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75  this example wou
1a860 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ld be set to SQL
1a870 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f  ITE_AFF_NONE..*/
1a880 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
1a890 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
1a8a0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1a8b0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
1a8c0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1a8d0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1a8e0 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68  evel,   /* Which
1a8f0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
1a900 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20  the FROM we are 
1a910 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
1a920 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  bRev,           
1a930 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68 65    /* Reverse the
1a940 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70 65   order of IN ope
1a950 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  rators */.  int 
1a960 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20  nExtraReg,      
1a970 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1a980 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74  xtra registers t
1a990 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
1a9a0 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20  char **pzAff    
1a9b0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
1a9c0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66  t to point to af
1a9d0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
1a9e0 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20  .){.  int nEq;  
1a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa00 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
1aa10 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
1aa20 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64  nstraints to cod
1aa30 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
1aa40 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
1aa50 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75       /* The vm u
1aa60 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1aa70 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
1aa80 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1aa90 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
1aaa0 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  x being used for
1aab0 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
1aac0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1aad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1aae0 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72   A single constr
1aaf0 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57  aint term */.  W
1ab00 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ab20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  The WhereLoop ob
1ab30 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ject */.  int j;
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab50 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1ab60 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
1ab70 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
1ab80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
1ab90 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  se register */. 
1aba0 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20   int nReg;      
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1abc0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  * Number of regi
1abd0 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
1abe0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66  e */.  char *zAf
1abf0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1ac00 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
1ac10 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72   string to retur
1ac20 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n */..  /* This 
1ac30 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63  module is only c
1ac40 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70  alled on query p
1ac50 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e  lans that use an
1ac60 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f   index. */.  pLo
1ac70 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
1ac80 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 28  oop;.  assert( (
1ac90 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1aca0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1acb0 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71  BLE)==0 );.  nEq
1acc0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1acd0 65 2e 6e 45 71 3b 0a 20 20 70 49 64 78 20 3d 20  e.nEq;.  pIdx = 
1ace0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
1acf0 49 6e 64 65 78 3b 0a 20 20 61 73 73 65 72 74 28  Index;.  assert(
1ad00 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f   pIdx!=0 );..  /
1ad10 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1ad20 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c   many memory cel
1ad30 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  ls we will need 
1ad40 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68  then allocate th
1ad50 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61  em..  */.  regBa
1ad60 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
1ad70 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20  m + 1;.  nReg = 
1ad80 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1ad90 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a  Eq + nExtraReg;.
1ada0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1adb0 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20  = nReg;..  zAff 
1adc0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
1add0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71  p(pParse->db, sq
1ade0 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
1adf0 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b  tyStr(v, pIdx));
1ae00 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a  .  if( !zAff ){.
1ae10 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
1ae20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
1ae30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c  ;.  }..  /* Eval
1ae40 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  uate the equalit
1ae50 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  y constraints.  
1ae60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  */.  assert( pId
1ae70 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20  x->nColumn>=nEq 
1ae80 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
1ae90 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  nEq; j++){.    i
1aea0 6e 74 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d  nt r1;.    pTerm
1aeb0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1aec0 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [j];.    assert(
1aed0 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
1aee0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1aef0 67 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63  g true for indic
1af00 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e  es with redundan
1af10 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20  t columns. .    
1af20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e  ** Ex: CREATE IN
1af30 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62  DEX i1 ON t1(a,b
1af40 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52  ,a); SELECT * FR
1af50 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 20  OM t1 WHERE a=0 
1af60 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20  AND b=0; */.    
1af70 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72 6d  testcase( (pTerm
1af80 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1af90 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20  _CODED)!=0 );.  
1afa0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1afb0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1afc0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
1afd0 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
1afe0 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 63 6f  2 */.    r1 = co
1aff0 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
1b000 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
1b010 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72  evel, j, bRev, r
1b020 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69  egBase+j);.    i
1b030 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a  f( r1!=regBase+j
1b040 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52   ){.      if( nR
1b050 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  eg==1 ){.       
1b060 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1b070 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1b080 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20  egBase);.       
1b090 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20   regBase = r1;. 
1b0a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b0b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b0c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1b0d0 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a  y, r1, regBase+j
1b0e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1b0f0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1b100 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1b110 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
1b120 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1b130 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1b140 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28  WO_IN );.    if(
1b150 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
1b160 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  or & (WO_ISNULL|
1b170 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20  WO_IN))==0 ){.  
1b180 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
1b190 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
1b1a0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73  >pRight;.      s
1b1b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
1b1c0 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
1b1d0 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70  ht, regBase+j, p
1b1e0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
1b1f0 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20  .      if( zAff 
1b200 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
1b210 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1b220 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41  inity(pRight, zA
1b230 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  ff[j])==SQLITE_A
1b240 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  FF_NONE ){.     
1b250 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53       zAff[j] = S
1b260 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1b270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b280 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1b290 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
1b2a0 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
1b2b0 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20  Aff[j]) ){.     
1b2c0 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53       zAff[j] = S
1b2d0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1b2e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b2f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  }.    }.  }.  *p
1b300 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72  zAff = zAff;.  r
1b310 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d  eturn regBase;.}
1b320 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1b330 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
1b340 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b350 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72   is a helper for
1b360 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e   explainIndexRan
1b370 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a  ge() below.**.**
1b380 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20   pStr holds the 
1b390 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65  text of an expre
1b3a0 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72  ssion that we ar
1b3b0 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e  e building up on
1b3c0 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74  e term.** at a t
1b3d0 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ime.  This routi
1b3e0 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65  ne adds a new te
1b3f0 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  rm to the end of
1b400 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
1b410 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65  .** Terms are se
1b420 70 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73  parated by AND s
1b430 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20  o add the "AND" 
1b440 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20  text for second 
1b450 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  and subsequent.*
1b460 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f  * terms only..*/
1b470 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1b480 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a  lainAppendTerm(.
1b490 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72    StrAccum *pStr
1b4a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1b4b0 20 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73   The text expres
1b4c0 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74  sion being built
1b4d0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   */.  int iTerm,
1b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4f0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1b500 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20  is term.  First 
1b510 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e  is zero */.  con
1b520 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
1b530 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
1b540 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a   of the column *
1b550 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1b560 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  zOp             
1b570 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
1b580 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20  perator */.){.  
1b590 69 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69  if( iTerm ) sqli
1b5a0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1b5b0 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c  d(pStr, " AND ",
1b5c0 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74   5);.  sqlite3St
1b5d0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
1b5e0 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b  r, zColumn, -1);
1b5f0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1b600 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a  umAppend(pStr, z
1b610 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  Op, 1);.  sqlite
1b620 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
1b630 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d  pStr, "?", 1);.}
1b640 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
1b650 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65   pLevel describe
1b660 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f 72  s a strategy for
1b670 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20   scanning table 
1b680 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66  pTab. This .** f
1b690 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1b6a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
1b6b0 74 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f 6e  tring buffer con
1b6c0 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72 69  taining a descri
1b6d0 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ption.** of the 
1b6e0 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65 20  subset of table 
1b6f0 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20  rows scanned by 
1b700 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e 20  the strategy in 
1b710 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a  the form of an.*
1b720 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  * SQL expression
1b730 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77  . Or, if all row
1b740 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e  s are scanned, N
1b750 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
1b760 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1b770 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  le, if the query
1b780 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
1b790 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
1b7a0 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a   a=1 AND b>2;.**
1b7b0 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74  .** is run and t
1b7c0 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
1b7d0 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e   on (a, b), then
1b7e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1b7f0 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69  eturns a.** stri
1b800 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  ng similar to:.*
1b810 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20  *.**   "a=? AND 
1b820 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  b>?".**.** The r
1b830 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20  eturned pointer 
1b840 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79  points to memory
1b850 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
1b860 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
1b870 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  ..** It is the r
1b880 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
1b890 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66   the caller to f
1b8a0 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20 77  ree the buffer w
1b8b0 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20  hen it is.** no 
1b8c0 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
1b8d0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1b8e0 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e  *explainIndexRan
1b8f0 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ge(sqlite3 *db, 
1b900 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1b910 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
1b920 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
1b930 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
1b940 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
1b950 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
1b960 72 65 65 2e 6e 45 71 3b 0a 20 20 69 6e 74 20 69  ree.nEq;.  int i
1b970 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  , j;.  Column *a
1b980 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
1b990 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d  ;.  int *aiColum
1b9a0 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
1b9b0 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d  lumn;.  StrAccum
1b9c0 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71   txt;..  if( nEq
1b9d0 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77  ==0 && (pLoop->w
1b9e0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
1b9f0 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
1ba00 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29  TOP_LIMIT))==0 )
1ba10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1ba20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
1ba30 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20  AccumInit(&txt, 
1ba40 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58  0, 0, SQLITE_MAX
1ba50 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e  _LENGTH);.  txt.
1ba60 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74  db = db;.  sqlit
1ba70 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1ba80 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b  (&txt, " (", 2);
1ba90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45  .  for(i=0; i<nE
1baa0 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70  q; i++){.    exp
1bab0 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
1bac0 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43  txt, i, aCol[aiC
1bad0 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c  olumn[i]].zName,
1bae0 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20   "=");.  }..  j 
1baf0 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f 6f 70  = i;.  if( pLoop
1bb00 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
1bb10 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1bb20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
1bb30 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
1bb40 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
1bb50 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
1bb60 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
1bb70 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
1bb80 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a  , i++, z, ">");.
1bb90 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
1bba0 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54  >wsFlags&WHERE_T
1bbb0 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
1bbc0 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70 49  char *z = (j==pI
1bbd0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
1bbe0 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
1bbf0 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
1bc00 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ame;.    explain
1bc10 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
1bc20 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d   i, z, "<");.  }
1bc30 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1bc40 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
1bc50 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e  )", 1);.  return
1bc60 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1bc70 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a  Finish(&txt);.}.
1bc80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1bc90 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
1bca0 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79  unless currently
1bcb0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45   processing an E
1bcc0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
1bcd0 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66  N.** command. If
1bce0 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e 67   the query being
1bcf0 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20   compiled is an 
1bd00 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1bd10 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  AN, a single.** 
1bd20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20  record is added 
1bd30 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f  to the output to
1bd40 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61   describe the ta
1bd50 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65 67  ble scan strateg
1bd60 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e  y in .** pLevel.
1bd70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1bd80 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
1bd90 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdb0 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
1bdc0 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
1bdd0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
1bde0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1bdf0 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20   list this loop 
1be00 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57  refers to */.  W
1be10 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1be20 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
1be30 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20  * Scan to write 
1be40 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64  OP_Explain opcod
1be50 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  e for */.  int i
1be60 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
1be70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1be80 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20  lue for "level" 
1be90 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
1bea0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
1beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bec0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
1bed0 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e  or "from" column
1bee0 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
1bef0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
1bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf10 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
1bf20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
1bf30 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69  egin() */.){.  i
1bf40 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
1bf50 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 73 74 72  in==2 ){.    str
1bf60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1bf70 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
1bf80 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
1bf90 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20  From];.    Vdbe 
1bfa0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1bfb0 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62  be;      /* VM b
1bfc0 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
1bfd0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20   */.    sqlite3 
1bfe0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1bff0 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
1c000 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  e handle */.    
1c010 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20  char *zMsg;     
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c030 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20   Text to add to 
1c040 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  EQP output */.  
1c050 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72    int iId = pPar
1c060 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20  se->iSelectId;  
1c070 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65  /* Select id (le
1c080 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63  ft-most output c
1c090 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  olumn) */.    in
1c0a0 74 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20  t isSearch;     
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c0c0 72 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48  rue for a SEARCH
1c0d0 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e  . False for SCAN
1c0e0 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  . */.    WhereLo
1c0f0 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
1c100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1c110 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72 65 4c  ntrolling WhereL
1c120 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
1c130 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20 20 20    u32 flags;    
1c140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c150 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20 64 65  /* Flags that de
1c160 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f 6f 70  scribe this loop
1c170 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d   */..    pLoop =
1c180 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
1c190 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f  .    flags = pLo
1c1a0 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  op->wsFlags;.   
1c1b0 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
1c1c0 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28  E_MULTI_OR) || (
1c1d0 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
1c1e0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
1c1f0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69  ) return;..    i
1c200 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67 73  sSearch = (flags
1c210 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  &(WHERE_BTM_LIMI
1c220 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
1c230 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  T))!=0.         
1c240 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57 48     || ((flags&WH
1c250 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1c260 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  )==0 && (pLoop->
1c270 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29 0a  u.btree.nEq>0)).
1c280 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
1c290 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52  wctrlFlags&(WHER
1c2a0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48  E_ORDERBY_MIN|WH
1c2b0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29  ERE_ORDERBY_MAX)
1c2c0 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  );..    zMsg = s
1c2d0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1c2e0 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72 63 68  , "%s", isSearch
1c2f0 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22  ?"SEARCH":"SCAN"
1c300 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
1c310 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1c320 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c330 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1c340 73 67 2c 20 22 25 73 20 53 55 42 51 55 45 52 59  sg, "%s SUBQUERY
1c350 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d   %d", zMsg,pItem
1c360 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  ->iSelectId);.  
1c370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
1c380 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1c390 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1c3a0 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a  "%s TABLE %s", z
1c3b0 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  Msg, pItem->zNam
1c3c0 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
1c3d0 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
1c3e0 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
1c3f0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1c400 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41  (db, zMsg, "%s A
1c410 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  S %s", zMsg, pIt
1c420 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
1c430 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
1c440 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57  s & (WHERE_IPK|W
1c450 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1c460 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 41  E))==0.     && A
1c470 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e 75 2e 62  LWAYS(pLoop->u.b
1c480 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 29 0a  tree.pIndex!=0).
1c490 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61      ){.      cha
1c4a0 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c  r *zWhere = expl
1c4b0 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62  ainIndexRange(db
1c4c0 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d 2d 3e  , pLoop, pItem->
1c4d0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73  pTab);.      zMs
1c4e0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1c4f0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1c500 73 20 55 53 49 4e 47 20 25 73 25 73 49 4e 44 45  s USING %s%sINDE
1c510 58 25 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c 20  X%s%s%s", zMsg, 
1c520 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61  .          ((fla
1c530 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
1c540 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41 54 49  INDEX)?"AUTOMATI
1c550 43 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20  C ":""),.       
1c560 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45     ((flags & WHE
1c570 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f  RE_IDX_ONLY)?"CO
1c580 56 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20 20  VERING ":""),.  
1c590 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
1c5a0 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
1c5b0 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20 20  EX)?"":" "),.   
1c5c0 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
1c5d0 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
1c5e0 58 29 3f 22 22 3a 20 70 4c 6f 6f 70 2d 3e 75 2e  X)?"": pLoop->u.
1c5f0 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e  btree.pIndex->zN
1c600 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
1c610 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a  zWhere.      );.
1c620 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1c630 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b  ree(db, zWhere);
1c640 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1c650 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  flags & WHERE_IP
1c660 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20  K)!=0 && (flags 
1c670 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49  & WHERE_CONSTRAI
1c680 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  NT)!=0 ){.      
1c690 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c6a0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c6b0 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47   "%s USING INTEG
1c6c0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c  ER PRIMARY KEY",
1c6d0 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69   zMsg);..      i
1c6e0 66 28 20 66 6c 61 67 73 26 28 57 48 45 52 45 5f  f( flags&(WHERE_
1c6f0 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
1c700 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20  COLUMN_IN) ){.  
1c710 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1c720 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1c730 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1c740 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d=?)", zMsg);.  
1c750 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
1c760 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f  lags&WHERE_BOTH_
1c770 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f  LIMIT)==WHERE_BO
1c780 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TH_LIMIT ){.    
1c790 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1c7a0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1c7b0 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e  Msg, "%s (rowid>
1c7c0 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c  ? AND rowid<?)",
1c7d0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
1c7e0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48  lse if( flags&WH
1c7f0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1c800 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
1c810 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1c820 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
1c830 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid>?)", zMsg);
1c840 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1c850 20 41 4c 57 41 59 53 28 66 6c 61 67 73 26 57 48   ALWAYS(flags&WH
1c860 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29  ERE_TOP_LIMIT) )
1c870 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
1c880 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1c890 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
1c8a0 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
1c8b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c8c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c8d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1c8e0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66  .    else if( (f
1c8f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1c900 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
1c910 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
1c920 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1c930 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54  , zMsg, "%s VIRT
1c940 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
1c950 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20  %d:%s", zMsg,.  
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1c980 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76  xNum, pLoop->u.v
1c990 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
1c9a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7a 4d   }.#endif.    zM
1c9b0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1c9c0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1c9d0 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  %s", zMsg);.    
1c9e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c9f0 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
1ca00 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46   iId, iLevel, iF
1ca10 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  rom, zMsg, P4_DY
1ca20 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
1ca30 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
1ca40 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c  lainOneScan(u,v,
1ca50 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20  w,x,y,z).#endif 
1ca60 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
1ca70 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  XPLAIN */.../*.*
1ca80 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ca90 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
1caa0 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c   the iLevel-th l
1cab0 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45  oop in the WHERE
1cac0 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65   clause.** imple
1cad0 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69  mentation descri
1cae0 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a  bed by pWInfo..*
1caf0 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
1cb00 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
1cb10 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
1cb20 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d  pWInfo,   /* Com
1cb30 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  plete informatio
1cb40 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52  n about the WHER
1cb50 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
1cb60 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
1cb70 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65     /* Which leve
1cb80 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l of pWInfo->a[]
1cb90 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64   should be coded
1cba0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
1cbb0 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68  tReady     /* Wh
1cbc0 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 63  ich tables are c
1cbd0 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
1cbe0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  le */.){.  int j
1cbf0 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
1cc00 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
1cc10 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
1cc20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1cc30 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
1cc40 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
1cc50 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20   int addrNxt;   
1cc60 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
1cc70 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e  o jump to contin
1cc80 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ue with the next
1cc90 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e   IN case */.  in
1cca0 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20  t omitTable;    
1ccb0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
1ccc0 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f   use the index o
1ccd0 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  nly */.  int bRe
1cce0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
1ccf0 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64   True if we need
1cd00 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65   to scan in reve
1cd10 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57  rse order */.  W
1cd20 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1cd30 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65  l;  /* The where
1cd40 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64   level to be cod
1cd50 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ed */.  WhereLoo
1cd60 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20  p *pLoop;    /* 
1cd70 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  The WhereLoop ob
1cd80 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ject being coded
1cd90 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
1cda0 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65  e *pWC;    /* De
1cdb0 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  composition of t
1cdc0 68 65 20 65 6e 74 69 72 65 20 57 48 45 52 45 20  he entire WHERE 
1cdd0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
1cde0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1ce00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
1ce10 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  rm */.  Parse *p
1ce20 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
1ce30 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1ce40 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1ce50 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce70 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
1ce80 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  stmt under const
1ce90 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74  ructions */.  st
1cea0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1ceb0 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a  m *pTabItem;  /*
1cec0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1ced0 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  m being coded */
1cee0 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20  .  int addrBrk; 
1cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf00 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
1cf10 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
1cf20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
1cf30 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20  t addrCont;     
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cf50 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
1cf60 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
1cf70 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
1cf80 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20  iRowidReg = 0;  
1cf90 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69        /* Rowid i
1cfa0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73  s stored in this
1cfb0 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f   register, if no
1cfc0 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20  t zero */.  int 
1cfd0 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b  iReleaseReg = 0;
1cfe0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
1cff0 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 62  gister to free b
1d000 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
1d010 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 65 77  */.  Bitmask new
1d020 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 2f  NotReady;      /
1d030 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
1d040 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
1d050 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
1d060 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1d070 65 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  e;.  pWC = &pWIn
1d080 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 65 76 65  fo->sWC;.  pLeve
1d090 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
1d0a0 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20  Level];.  pLoop 
1d0b0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
1d0c0 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26  ;.  pTabItem = &
1d0d0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1d0e0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
1d0f0 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61  m];.  iCur = pTa
1d100 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
1d110 20 20 62 52 65 76 20 3d 20 28 70 57 49 6e 66 6f    bRev = (pWInfo
1d120 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65  ->revMask>>iLeve
1d130 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c  l)&1;.  omitTabl
1d140 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  e = (pLoop->wsFl
1d150 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
1d160 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20  ONLY)!=0 .      
1d170 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
1d180 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
1d190 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29  ERE_FORCE_TABLE)
1d1a0 3d 3d 30 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  ==0;.  VdbeNoopC
1d1b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
1d1c0 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25 64 22 2c  n Join Loop %d",
1d1d0 20 69 4c 65 76 65 6c 29 29 3b 0a 0a 20 20 2f 2a   iLevel));..  /*
1d1e0 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66   Create labels f
1d1f0 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61  or the "break" a
1d200 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e  nd "continue" in
1d210 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  structions.  ** 
1d220 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1d230 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61  loop.  Jump to a
1d240 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20  ddrBrk to break 
1d250 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20  out of a loop.. 
1d260 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74   ** Jump to cont
1d270 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65   to go immediate
1d280 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  ly to the next i
1d290 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  teration of the.
1d2a0 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a    ** loop..  **.
1d2b0 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20    ** When there 
1d2c0 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  is an IN operato
1d2d0 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20  r, we also have 
1d2e0 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  a "addrNxt" labe
1d2f0 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e  l that.  ** mean
1d300 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  s to continue wi
1d310 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76  th the next IN v
1d320 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  alue combination
1d330 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65  .  When.  ** the
1d340 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65  re are no IN ope
1d350 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f  rators in the co
1d360 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22  nstraints, the "
1d370 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20  addrNxt" label. 
1d380 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
1d390 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20  as "addrBrk"..  
1d3a0 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70  */.  addrBrk = p
1d3b0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d  Level->addrBrk =
1d3c0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
1d3d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1d3e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64  keLabel(v);.  ad
1d3f0 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d  drCont = pLevel-
1d400 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69  >addrCont = sqli
1d410 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1d420 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (v);..  /* If th
1d430 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20  is is the right 
1d440 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
1d450 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f  OUTER JOIN, allo
1d460 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e  cate and.  ** in
1d470 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72  itialize a memor
1d480 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f  y cell that reco
1d490 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c  rds if this tabl
1d4a0 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20  e matches any.  
1d4b0 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65  ** row of the le
1d4c0 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ft table of the 
1d4d0 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  join..  */.  if(
1d4e0 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30   pLevel->iFrom>0
1d4f0 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d   && (pTabItem[0]
1d500 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
1d510 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  EFT)!=0 ){.    p
1d520 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1d530 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1d540 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
1d550 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1d560 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65  nteger, 0, pLeve
1d570 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
1d580 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1d590 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f  v, "init LEFT JO
1d5a0 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67  IN no-match flag
1d5b0 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  "));.  }..  /* S
1d5c0 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61  pecial case of a
1d5d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62   FROM clause sub
1d5e0 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65  query implemente
1d5f0 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e  d as a co-routin
1d600 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49  e */.  if( pTabI
1d610 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
1d620 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  e ){.    int reg
1d630 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d  Yield = pTabItem
1d640 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20  ->regReturn;.   
1d650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d660 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1d670 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72  , pTabItem->addr
1d680 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59 69  FillSub-1, regYi
1d690 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  eld);.    pLevel
1d6a0 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56  ->p2 =  sqlite3V
1d6b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1d6c0 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29  Yield, regYield)
1d6d0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
1d6e0 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20  t((v, "next row 
1d6f0 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73  of co-routine %s
1d700 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  ", pTabItem->pTa
1d710 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
1d720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d730 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59  2(v, OP_If, regY
1d740 69 65 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b 29  ield+1, addrBrk)
1d750 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1d760 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65   = OP_Goto;.  }e
1d770 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
1d780 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1d790 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c  TABLE.  if(  (pL
1d7a0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1d7b0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1d7c0 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  E)!=0 ){.    /* 
1d7d0 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62  Case 1:  The tab
1d7e0 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d  le is a virtual-
1d7f0 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20  table.  Use the 
1d800 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78  VFilter and VNex
1d810 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1d820 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20    to access the 
1d830 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
1d840 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20   int iReg;   /* 
1d850 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P3 Value for OP_
1d860 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69  VFilter */.    i
1d870 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b  nt addrNotFound;
1d880 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
1d890 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c  aint = pLoop->nL
1d8a0 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Term;..    sqlit
1d8b0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1d8c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65  pParse);.    iRe
1d8d0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1d8e0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1d8f0 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a  nConstraint+2);.
1d900 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64      addrNotFound
1d910 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
1d920 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  rk;.    for(j=0;
1d930 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   j<nConstraint; 
1d940 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  j++){.      int 
1d950 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a  iTarget = iReg+j
1d960 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  +2;.      pTerm 
1d970 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1d980 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  j];.      if( pT
1d990 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
1d9a0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  e;.      if( pTe
1d9b0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1d9c0 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20  WO_IN ){.       
1d9d0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
1d9e0 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
1d9f0 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76   pLevel, j, bRev
1da00 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
1da10 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64      addrNotFound
1da20 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1da30 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
1da40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1da50 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1da60 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
1da70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
1da80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1da90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1daa0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1dab0 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  er, pLoop->u.vta
1dac0 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b  b.idxNum, iReg);
1dad0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1dae0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1daf0 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  eger, nConstrain
1db00 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20  t, iReg+1);.    
1db10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1db20 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c  4(v, OP_VFilter,
1db30 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f   iCur, addrNotFo
1db40 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20  und, iReg,.     
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db60 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
1db70 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20  dxStr,.         
1db80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
1db90 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  op->u.vtab.needF
1dba0 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46  ree ? P4_MPRINTF
1dbb0 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20   : P4_STATIC);. 
1dbc0 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
1dbd0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1dbe0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
1dbf0 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31  onstraint && j<1
1dc00 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  6; j++){.      i
1dc10 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  f( (pLoop->u.vta
1dc20 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31  b.omitMask>>j)&1
1dc30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
1dc40 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1dc50 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
1dc60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1dc70 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1dc80 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20  = OP_VNext;.    
1dc90 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1dca0 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1dcb0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
1dcc0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1dcd0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1dce0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
1dcf0 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72  e, iReg, nConstr
1dd00 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c  aint+2);.    sql
1dd10 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1dd20 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d  (pParse, 1);.  }
1dd30 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
1dd40 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1dd50 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66  ALTABLE */..  if
1dd60 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1dd70 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
1dd80 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  0.   && (pLoop->
1dd90 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1dda0 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45  _COLUMN_IN|WHERE
1ddb0 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a  _COLUMN_EQ))!=0.
1ddc0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65    ){.    /* Case
1ddd0 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   2:  We can dire
1dde0 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
1ddf0 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
1de00 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  g an.    **     
1de10 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
1de20 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
1de30 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
1de40 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20  .  Or.    **    
1de50 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e        we referen
1de60 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ce multiple rows
1de70 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20   using a "rowid 
1de80 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  IN (...)".    **
1de90 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72            constr
1dea0 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  uct..    */.    
1deb0 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75  assert( pLoop->u
1dec0 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b  .btree.nEq==1 );
1ded0 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67  .    iReleaseReg
1dee0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1def0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1df00 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
1df10 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  >aLTerm[0];.    
1df20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
1df30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1df40 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20  pTerm->pExpr!=0 
1df50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
1df60 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
1df70 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1df80 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1df90 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
1dfa0 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
1dfb0 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64  62 */.    iRowid
1dfc0 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69  Reg = codeEquali
1dfd0 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
1dfe0 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c  Term, pLevel, 0,
1dff0 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52   bRev, iReleaseR
1e000 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  eg);.    addrNxt
1e010 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1e020 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  xt;.    sqlite3V
1e030 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e040 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69  MustBeInt, iRowi
1e050 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a  dReg, addrNxt);.
1e060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e070 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
1e080 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64  xists, iCur, add
1e090 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29  rNxt, iRowidReg)
1e0a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1e0b0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1e0c0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 6f  ange(pParse, iRo
1e0d0 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20 20  widReg, 1);.    
1e0e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1e0f0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1e100 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1e110 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  g);.    VdbeComm
1e120 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
1e130 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1e140 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73   OP_Noop;.  }els
1e150 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  e if( (pLoop->ws
1e160 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
1e170 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  K)!=0.         &
1e180 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
1e190 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1e1a0 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a  _RANGE)!=0.  ){.
1e1b0 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20      /* Case 3:  
1e1c0 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75  We have an inequ
1e1d0 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
1e1e0 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
1e1f0 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f  ID field..    */
1e200 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20  .    int testOp 
1e210 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69  = OP_Noop;.    i
1e220 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e  nt start;.    in
1e230 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20  t memEndValue = 
1e240 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  0;.    WhereTerm
1e250 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b   *pStart, *pEnd;
1e260 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ..    assert( om
1e270 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
1e280 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74    j = 0;.    pSt
1e290 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a  art = pEnd = 0;.
1e2a0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1e2b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
1e2c0 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61 72  TM_LIMIT ) pStar
1e2d0 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  t = pLoop->aLTer
1e2e0 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20  m[j++];.    if( 
1e2f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1e300 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
1e310 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d   ) pEnd = pLoop-
1e320 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1e330 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
1e340 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29  !=0 || pEnd!=0 )
1e350 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29  ;.    if( bRev )
1e360 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
1e370 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53  pStart;.      pS
1e380 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
1e390 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b     pEnd = pTerm;
1e3a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1e3b0 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
1e3c0 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
1e3d0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
1e3e0 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69  ession that defi
1e3f0 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f  nes the start bo
1e400 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
1e410 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20   r1, rTemp;     
1e420 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
1e430 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  for holding the 
1e440 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a  start boundary *
1e450 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
1e460 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61  following consta
1e470 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f  nt maps TK_xx co
1e480 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70  des into corresp
1e490 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  onding .      **
1e4a0 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20   seek opcodes.  
1e4b0 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20  It depends on a 
1e4c0 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
1e4d0 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20  ing of TK_xx.   
1e4e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73     */.      cons
1e4f0 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d  t u8 aMoveOp[] =
1e500 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {.           /*
1e510 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65   TK_GT */  OP_Se
1e520 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20  ekGt,.          
1e530 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50   /* TK_LE */  OP
1e540 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20  _SeekLe,.       
1e550 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20      /* TK_LT */ 
1e560 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20   OP_SeekLt,.    
1e570 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20         /* TK_GE 
1e580 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20  */  OP_SeekGe.  
1e590 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73      };.      ass
1e5a0 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47  ert( TK_LE==TK_G
1e5b0 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d  T+1 );      /* M
1e5c0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64  ake sure the ord
1e5d0 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20  ering.. */.     
1e5e0 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
1e5f0 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20  TK_GT+2 );      
1e600 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54  /*  ... of the T
1e610 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a  K_xx values... *
1e620 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1e630 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29  TK_GE==TK_GT+3 )
1e640 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69  ;      /*  ... i
1e650 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a  s correcct. */..
1e660 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e670 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
1e680 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1e690 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
1e6a0 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20  -11662 */.      
1e6b0 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78  pX = pStart->pEx
1e6c0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
1e6d0 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
1e6e0 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d   assert( pStart-
1e6f0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
1e700 72 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  r );.      r1 = 
1e710 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e720 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  emp(pParse, pX->
1e730 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b  pRight, &rTemp);
1e740 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e750 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76  beAddOp3(v, aMov
1e760 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54  eOp[pX->op-TK_GT
1e770 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
1e780 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
1e790 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
1e7a0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1e7b0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1e7c0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1e7d0 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
1e7e0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1e7f0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54  mpReg(pParse, rT
1e800 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61  emp);.      disa
1e810 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1e820 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c  pStart);.    }el
1e830 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1e840 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
1e850 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
1e860 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
1e870 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d   addrBrk);.    }
1e880 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b  .    if( pEnd ){
1e890 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
1e8a0 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64  .      pX = pEnd
1e8b0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
1e8c0 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
1e8d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1e8e0 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  nd->leftCursor==
1e8f0 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65  iCur );.      te
1e900 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74  stcase( pEnd->wt
1e910 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1e920 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
1e930 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
1e940 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75        memEndValu
1e950 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  e = ++pParse->nM
1e960 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
1e970 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1e980 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65  , pX->pRight, me
1e990 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20  mEndValue);.    
1e9a0 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
1e9b0 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _LT || pX->op==T
1e9c0 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20  K_GT ){.        
1e9d0 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
1e9e0 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20  OP_Le : OP_Ge;. 
1e9f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ea00 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
1ea10 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47  v ? OP_Lt : OP_G
1ea20 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1ea30 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1ea40 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  vel, pEnd);.    
1ea50 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71  }.    start = sq
1ea60 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1ea70 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65  Addr(v);.    pLe
1ea80 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
1ea90 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
1eaa0 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
1eab0 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
1eac0 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
1ead0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
1eae0 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a  Level->p5==0 );.
1eaf0 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d      if( testOp!=
1eb00 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
1eb10 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65   iRowidReg = iRe
1eb20 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74  leaseReg = sqlit
1eb30 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1eb40 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1eb50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1eb60 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c   OP_Rowid, iCur,
1eb70 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1eb80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1eb90 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
1eba0 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
1ebb0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
1ebc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1ebd0 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64  , testOp, memEnd
1ebe0 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20  Value, addrBrk, 
1ebf0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1ec00 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1ec10 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
1ec20 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51  AFF_NUMERIC | SQ
1ec30 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1ec40 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
1ec50 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1ec60 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
1ec70 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ED ){.    /* Cas
1ec80 65 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e  e 4: A scan usin
1ec90 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20  g an index..    
1eca0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1ecb0 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75    The WHERE clau
1ecc0 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a  se may contain z
1ecd0 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61  ero or more equa
1ece0 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  lity .    **    
1ecf0 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22       terms ("=="
1ed00 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f   or "IN" operato
1ed10 72 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74  rs) that refer t
1ed20 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20  o the N.    **  
1ed30 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74         left-most
1ed40 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1ed50 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c  index. It may al
1ed60 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a  so contain.    *
1ed70 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61  *         inequa
1ed80 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1ed90 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d   (>, <, >= or <=
1eda0 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64  ) on the indexed
1edb0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1edc0 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65  column that imme
1edd0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20  diately follows 
1ede0 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73  the N equalities
1edf0 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20  . Only .    **  
1ee00 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
1ee10 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e  -most column can
1ee20 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   be an inequalit
1ee30 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73  y - the rest mus
1ee40 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1ee50 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e   use the "==" an
1ee60 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  d "IN" operators
1ee70 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
1ee80 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20  f the .    **   
1ee90 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f        index is o
1eea0 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20  n (x,y,z), then 
1eeb0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c  the following cl
1eec0 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20  auses are all . 
1eed0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70     **         op
1eee0 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a  timized:.    **.
1eef0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1ef00 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20    x=5.    **    
1ef10 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1ef20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y=10.    **     
1ef30 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1ef40 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
1ef50 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e        x=5 AND y>
1ef60 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a  5 AND y<10.    *
1ef70 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1ef80 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d   AND y=5 AND z<=
1ef90 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
1efa0 20 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31           The z<1
1efb0 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  0 term of the fo
1efc0 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62  llowing cannot b
1efd0 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20  e used, only.   
1efe0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
1eff0 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a  x=5 term:.    **
1f000 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f010 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a     x=5 AND z<10.
1f020 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1f030 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a        N may be z
1f040 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65  ero if there are
1f050 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1f060 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20  traints..    ** 
1f070 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65          If there
1f080 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69   are no inequali
1f090 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
1f0a0 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20  then N is at.   
1f0b0 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73   **         leas
1f0c0 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  t one..    **.  
1f0d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69    **         Thi
1f0e0 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75  s case is also u
1f0f0 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61  sed when there a
1f100 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
1f110 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  se.    **       
1f120 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75    constraints bu
1f130 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65  t an index is se
1f140 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69  lected anyway, i
1f150 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20  n order.    **  
1f160 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20         to force 
1f170 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72  the output order
1f180 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61   to conform to a
1f190 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20  n ORDER BY..    
1f1a0 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20  */  .    static 
1f1b0 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f  const u8 aStartO
1f1c0 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c  p[] = {.      0,
1f1d0 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
1f1e0 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20  OP_Rewind,      
1f1f0 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61       /* 2: (!sta
1f200 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
1f210 26 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62  & startEq &&  !b
1f220 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1f230 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20  _Last,          
1f240 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74     /* 3: (!start
1f250 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1f260 73 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65  startEq &&   bRe
1f270 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1f280 65 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20  eekGt,          
1f290 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f   /* 4: (start_co
1f2a0 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
1f2b0 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
1f2c0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1f2d0 6b 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kLt,           /
1f2e0 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 5: (start_cons
1f2f0 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
1f300 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
1f310 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47  /.      OP_SeekG
1f320 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
1f330 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  6: (start_constr
1f340 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
1f350 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
1f360 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20        OP_SeekLe 
1f370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a             /* 7:
1f380 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1f390 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
1f3a0 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20   &&  bRev) */.  
1f3b0 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20    };.    static 
1f3c0 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b  const u8 aEndOp[
1f3d0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e  ] = {.      OP_N
1f3e0 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
1f3f0 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e   /* 0: (!end_con
1f400 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20  straints) */.   
1f410 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20     OP_IdxGE,    
1f420 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65          /* 1: (e
1f430 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
1f440 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
1f450 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20    OP_IdxLT      
1f460 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e         /* 2: (en
1f470 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1f480 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b   bRev) */.    };
1f490 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  .    int nEq = p
1f4a0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
1f4b0 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  q;  /* Number of
1f4c0 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20   == or IN terms 
1f4d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e  */.    int isMin
1f4e0 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Query = 0;      
1f4f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1f500 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
1f510 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e   SELECT min(x)..
1f520 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
1f530 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1f540 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1f550 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
1f560 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
1f570 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20  */.    int r1;  
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
1f5a0 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72  ster */.    Wher
1f5b0 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61  eTerm *pRangeSta
1f5c0 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71  rt = 0;  /* Ineq
1f5d0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1f5e0 74 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74  t at range start
1f5f0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
1f600 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30  m *pRangeEnd = 0
1f610 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69  ;    /* Inequali
1f620 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
1f630 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20   range end */.  
1f640 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20    int startEq;  
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f660 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
1f670 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e  start uses ==, >
1f680 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
1f690 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20  nt endEq;       
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f6b0 72 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64  rue if range end
1f6c0 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
1f6d0 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  <= */.    int st
1f6e0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b  art_constraints;
1f6f0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
1f700 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73  of range is cons
1f710 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69  trained */.    i
1f720 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  nt nConstraint; 
1f730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f740 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61  umber of constra
1f750 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  int terms */.   
1f760 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f780 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69   The index we wi
1f790 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20  ll be using */. 
1f7a0 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
1f7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7c0 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
1f7d0 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
1f7e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74   */.    int nExt
1f7f0 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  raReg = 0;      
1f800 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f810 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
1f820 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20  s needed */.    
1f830 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f850 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f  Instruction opco
1f860 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  de */.    char *
1f870 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20  zStartAff;      
1f880 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
1f890 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  ty for start of 
1f8a0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
1f8b0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   */.    char *zE
1f8c0 6e 64 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  ndAff;          
1f8d0 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
1f8e0 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67   for end of rang
1f8f0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
1f900 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f  .    pIdx = pLoo
1f910 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1f920 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d  x;.    iIdxCur =
1f930 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
1f940 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
1f950 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73  s loop satisfies
1f960 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70   a sort order (p
1f970 4f 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74  OrderBy) request
1f980 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61   that .    ** wa
1f990 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
1f9a0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70   function to imp
1f9b0 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54  lement a "SELECT
1f9c0 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20   min(x) ..." .  
1f9d0 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e    ** query, then
1f9e0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
1f9f0 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20   only allow the 
1fa00 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a  loop to run for.
1fa10 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
1fa20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  iteration. This 
1fa30 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
1fa40 69 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65  irst row returne
1fa50 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20  d.    ** should 
1fa60 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20  not have a NULL 
1fa70 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
1fa80 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27  'x'. If column '
1fa90 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65  x' is.    ** the
1faa0 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72   first one after
1fab0 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74   the nEq equalit
1fac0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  y constraints in
1fad0 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20   the index,.    
1fae0 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73  ** this requires
1faf0 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61   some special ha
1fb00 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  ndling..    */. 
1fb10 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
1fb20 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
1fb30 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30  _ORDERBY_MIN)!=0
1fb40 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
1fb50 2d 3e 62 4f 42 53 61 74 21 3d 30 29 0a 20 20 20  ->bOBSat!=0).   
1fb60 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c    && (pIdx->nCol
1fb70 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a  umn>nEq).    ){.
1fb80 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
1fb90 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
1fba0 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  ==1 ); */.      
1fbb0 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  /* assert( pOrde
1fbc0 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  rBy->a[0].pExpr-
1fbd0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
1fbe0 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b  aiColumn[nEq] );
1fbf0 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51   */.      isMinQ
1fc00 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  uery = 1;.      
1fc10 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
1fc20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
1fc30 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79  d any inequality
1fc40 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
1fc50 73 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  s for the start 
1fc60 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20  and end .    ** 
1fc70 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20  of the range. . 
1fc80 20 20 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45     */.    j = nE
1fc90 71 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  q;.    if( pLoop
1fca0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1fcb0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
1fcc0 20 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74       pRangeStart
1fcd0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1fce0 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78  [j++];.      nEx
1fcf0 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
1fd00 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
1fd10 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1fd20 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
1fd30 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20      pRangeEnd = 
1fd40 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
1fd50 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  +];.      nExtra
1fd60 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
1fd70 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
1fd80 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
1fd90 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
1fda0 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
1fdb0 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20  r IN.    ** and 
1fdc0 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73  store the values
1fdd0 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
1fde0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
1fdf0 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
1fe00 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42  starting at regB
1fe10 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1fe20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c  regBase = codeAl
1fe30 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70  lEqualityTerms(p
1fe40 50 61 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65  Parse,pLevel,bRe
1fe50 76 2c 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74  v,nExtraReg,&zSt
1fe60 61 72 74 41 66 66 29 3b 0a 20 20 20 20 7a 45 6e  artAff);.    zEn
1fe70 64 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62  dAff = sqlite3Db
1fe80 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
1fe90 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  b, zStartAff);. 
1fea0 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
1feb0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20  vel->addrNxt;.. 
1fec0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1fed0 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20  doing a reverse 
1fee0 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e  order scan on an
1fef0 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78   ascending index
1ff00 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f  , or.    ** a fo
1ff10 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e  rward order scan
1ff20 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
1ff30 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61   index, intercha
1ff40 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nge the .    ** 
1ff50 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65  start and end te
1ff60 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74  rms (pRangeStart
1ff70 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e   and pRangeEnd).
1ff80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ff90 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  (nEq<pIdx->nColu
1ffa0 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64  mn && bRev==(pId
1ffb0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
1ffc0 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
1ffd0 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65  C)).     || (bRe
1ffe0 76 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  v && pIdx->nColu
1fff0 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a  mn==nEq).    ){.
20000 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
20010 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e  Term *, pRangeEn
20020 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  d, pRangeStart);
20030 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74  .    }..    test
20040 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
20050 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72  t && (pRangeStar
20060 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
20070 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_LE)!=0 );.    
20080 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
20090 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67 65  Start && (pRange
200a0 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
200b0 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a   & WO_GE)!=0 );.
200c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
200d0 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e  angeEnd && (pRan
200e0 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
200f0 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a   & WO_LE)!=0 );.
20100 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
20110 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e  angeEnd && (pRan
20120 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
20130 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a   & WO_GE)!=0 );.
20140 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70      startEq = !p
20150 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52  RangeStart || pR
20160 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72  angeStart->eOper
20170 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
20180 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20  _GE);.    endEq 
20190 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c  =   !pRangeEnd |
201a0 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  | pRangeEnd->eOp
201b0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
201c0 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72  WO_GE);.    star
201d0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
201e0 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e  pRangeStart || n
201f0 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  Eq>0;..    /* Se
20200 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  ek the index cur
20210 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  sor to the start
20220 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
20230 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e  /.    nConstrain
20240 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  t = nEq;.    if(
20250 20 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a   pRangeStart ){.
20260 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
20270 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74  ht = pRangeStart
20280 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
20290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
202a0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
202b0 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
202c0 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Eq);.      if( (
202d0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46  pRangeStart->wtF
202e0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
202f0 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
20300 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20310 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
20320 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
20330 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
20340 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
20350 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20  StartAff ){.    
20360 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
20370 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
20380 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66  Right, zStartAff
20390 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  [nEq])==SQLITE_A
203a0 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20  FF_NONE){.      
203b0 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65      /* Since the
203c0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
203d0 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77  o be performed w
203e0 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  ith no conversio
203f0 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ns.          ** 
20400 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f  applied to the o
20410 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65  perands, set the
20420 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70   affinity to app
20430 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20  ly to pRight to 
20440 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
20450 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20  LITE_AFF_NONE.  
20460 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  */.          zSt
20470 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
20480 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
20490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
204a0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
204b0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
204c0 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53  hange(pRight, zS
204d0 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b  tartAff[nEq]) ){
204e0 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
204f0 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
20500 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
20510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20       }.      }  
20520 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
20530 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74  nt++;.      test
20540 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
20550 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
20560 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
20570 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
20580 32 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  2 */.    }else i
20590 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b  f( isMinQuery ){
205a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
205b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
205c0 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b  ull, 0, regBase+
205d0 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e  nEq);.      nCon
205e0 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
205f0 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20   startEq = 0;.  
20600 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
20610 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d  aints = 1;.    }
20620 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66  .    codeApplyAf
20630 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
20640 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
20650 69 6e 74 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  int, zStartAff);
20660 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74  .    op = aStart
20670 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  Op[(start_constr
20680 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61  aints<<2) + (sta
20690 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d  rtEq<<1) + bRev]
206a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
206b0 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
206c0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69  ase( op==OP_Rewi
206d0 6e 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  nd );.    testca
206e0 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20  se( op==OP_Last 
206f0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
20700 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29   op==OP_SeekGt )
20710 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20720 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b  op==OP_SeekGe );
20730 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
20740 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a  p==OP_SeekLe );.
20750 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
20760 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20  ==OP_SeekLt );. 
20770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20780 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69  dOp4Int(v, op, i
20790 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  IdxCur, addrNxt,
207a0 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
207b0 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  raint);..    /* 
207c0 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66  Load the value f
207d0 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74  or the inequalit
207e0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
207f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
20800 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20     ** range (if 
20810 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  any)..    */.   
20820 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
20830 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
20840 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45  geEnd ){.      E
20850 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
20860 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e  angeEnd->pExpr->
20870 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
20880 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
20890 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  move(pParse, reg
208a0 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20  Base+nEq, 1);.  
208b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
208c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
208d0 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
208e0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
208f0 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
20900 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
20910 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20920 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
20930 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c  lJump(v, pRight,
20940 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
20950 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  drNxt);.      }.
20960 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64 41 66        if( zEndAf
20970 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
20980 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
20990 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
209a0 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53  zEndAff[nEq])==S
209b0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b  QLITE_AFF_NONE){
209c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  .          /* Si
209d0 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  nce the comparis
209e0 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66  on is to be perf
209f0 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f  ormed with no co
20a00 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20  nversions.      
20a10 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74      ** applied t
20a20 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20  o the operands, 
20a30 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  set the affinity
20a40 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69   to apply to pRi
20a50 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ght to .        
20a60 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    ** SQLITE_AFF_
20a70 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20  NONE.  */.      
20a80 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d      zEndAff[nEq]
20a90 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
20aa0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
20ab0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
20ac0 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
20ad0 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
20ae0 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29  t, zEndAff[nEq])
20af0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45   ){.          zE
20b00 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  ndAff[nEq] = SQL
20b10 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
20b20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
20b30 20 0a 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c   .      codeAppl
20b40 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
20b50 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31  , regBase, nEq+1
20b60 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20  , zEndAff);.    
20b70 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
20b80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20b90 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c   pRangeEnd->wtFl
20ba0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
20bb0 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
20bc0 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
20bd0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
20be0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
20bf0 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
20c00 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
20c10 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 45 6e 64  pParse->db, zEnd
20c20 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f  Aff);..    /* To
20c30 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f  p of the loop bo
20c40 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c  dy */.    pLevel
20c50 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
20c60 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
20c70 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
20c80 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  if the index cur
20c90 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20  sor is past the 
20ca0 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  end of the range
20cb0 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45  . */.    op = aE
20cc0 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20  ndOp[(pRangeEnd 
20cd0 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62  || nEq) * (1 + b
20ce0 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63  Rev)];.    testc
20cf0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70  ase( op==OP_Noop
20d00 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20d10 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29  ( op==OP_IdxGE )
20d20 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20d30 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a  op==OP_IdxLT );.
20d40 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e      if( op!=OP_N
20d50 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
20d60 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
20d70 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
20d80 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
20d90 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
20da0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20db0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65  dbeChangeP5(v, e
20dc0 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29  ndEq!=bRev ?1:0)
20dd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
20de0 49 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65  If there are ine
20df0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
20e00 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20  nts, check that 
20e10 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  the value.    **
20e20 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
20e30 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e  lumn that the in
20e40 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69  equality contrai
20e50 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a  ns is not NULL..
20e60 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c      ** If it is,
20e70 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78   jump to the nex
20e80 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
20e90 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  he loop..    */.
20ea0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
20eb0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
20ec0 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  e);.    testcase
20ed0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
20ee0 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
20ef0 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IT );.    testca
20f00 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  se( pLoop->wsFla
20f10 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
20f20 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20  IMIT );.    if( 
20f30 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
20f40 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
20f50 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
20f60 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IT))!=0 ){.     
20f70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20f80 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
20f90 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72   iIdxCur, nEq, r
20fa0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
20fb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20fc0 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64  P_IsNull, r1, ad
20fd0 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  drCont);.    }. 
20fe0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
20ff0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
21000 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   r1);..    /* Se
21010 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ek the table cur
21020 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64  sor, if required
21030 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54   */.    disableT
21040 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
21050 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69  geStart);.    di
21060 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
21070 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20  , pRangeEnd);.  
21080 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
21090 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
210a0 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
210b0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
210c0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
210d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
210e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
210f0 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
21100 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
21110 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
21120 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
21130 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
21140 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
21150 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21160 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20   OP_Seek, iCur, 
21170 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20  iRowidReg);  /* 
21180 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
21190 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
211a0 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75  ecord the instru
211b0 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65  ction used to te
211c0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
211d0 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a  . Disable .    *
211e0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
211f0 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64  erms made redund
21200 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78  ant by the index
21210 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20   range scan..   
21220 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
21230 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
21240 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20  RE_ONEROW ){.   
21250 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
21260 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
21270 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20  se if( bRev ){. 
21280 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
21290 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d  = OP_Prev;.    }
212a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
212b0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
212c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
212d0 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
212e0 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ;.    if( (pLoop
212f0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
21300 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30  E_CONSTRAINT)==0
21310 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
21320 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
21330 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
21340 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73  N_STEP;.    }els
21350 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
21360 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29   pLevel->p5==0 )
21370 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
21380 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21390 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
213a0 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70  TION.  if( pLoop
213b0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
213c0 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
213d0 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 77    /* Case 5:  Tw
213e0 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
213f0 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72  tely indexed ter
21400 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
21410 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  OR.    **.    **
21420 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
21430 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
21440 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c   TABLE t1(a,b,c,
21450 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  d);.    **   CRE
21460 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
21470 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(a);.    **   
21480 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20  CREATE INDEX i2 
21490 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a  ON t1(b);.    **
214a0 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
214b0 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20  i3 ON t1(c);.   
214c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
214d0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
214e0 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f  ERE a=5 OR b=7 O
214f0 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33  R (c=11 AND d=13
21500 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
21510 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20  In the example, 
21520 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  there are three 
21530 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
21540 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20  nnected by OR.. 
21550 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66     ** The top of
21560 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20   the loop looks 
21570 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
21580 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
21590 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
215a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
215b0 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
215c0 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a  in reg 1.    **.
215d0 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72      ** Then, for
215e0 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74 65   each indexed te
215f0 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rm, the followin
21600 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  g. The arguments
21610 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65   to.    ** RowSe
21620 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20 74  tTest are such t
21630 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66  hat the rowid of
21640 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
21650 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20   is inserted.   
21660 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77   ** into the Row
21670 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c  Set. If it is al
21680 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63  ready present, c
21690 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65  ontrol skips the
216a0 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70  .    ** Gosub op
216b0 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73  code and jumps s
216c0 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20 63  traight to the c
216d0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
216e0 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20   WhereEnd()..   
216f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
21700 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65    sqlite3WhereBe
21710 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20  gin(<term>).    
21720 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77 53  **          RowS
21730 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20 20  etTest          
21740 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72 74          # Insert
21750 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73   rowid into rows
21760 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  et.    **       
21770 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32 20     Gosub      2 
21780 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  A.    **        
21790 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
217a0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
217b0 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62  Following the ab
217c0 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72  ove, code to ter
217d0 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
217e0 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61   Label A, the ta
217f0 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  rget.    ** of t
21800 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20  he Gosub above, 
21810 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73  jumps to the ins
21820 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61  truction right a
21830 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20  fter the Goto.. 
21840 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
21850 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20        Null      
21860 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
21870 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77    # Zero the row
21880 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20  set in reg 1.   
21890 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74   **          Got
218a0 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20 20  o       B       
218b0 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20 6c           # The l
218c0 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e  oop is finished.
218d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
218e0 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f       A: <loop bo
218f0 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  dy>             
21900 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61 74      # Return dat
21910 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20  a, whatever..   
21920 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
21930 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20 32      Return     2
21940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21950 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74  # Jump back to t
21960 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a  he Gosub.    **.
21970 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20      **       B: 
21980 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e  <after the loop>
21990 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20  .    **.    */. 
219a0 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
219b0 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65  pOrWc;    /* The
219c0 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65   OR-clause broke
219d0 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65  n out into subte
219e0 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69  rms */.    SrcLi
219f0 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20  st *pOrTab;     
21a00 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74    /* Shortened t
21a10 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d  able list or OR-
21a20 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f  clause generatio
21a30 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  n */.    Index *
21a40 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20  pCov = 0;       
21a50 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69        /* Potenti
21a60 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  al covering inde
21a70 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  x (or NULL) */. 
21a80 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d     int iCovCur =
21a90 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
21aa0 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64    /* Cursor used
21ab0 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73   for index scans
21ac0 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20   (if any) */..  
21ad0 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20    int regReturn 
21ae0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
21af0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
21b00 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69 74  egister used wit
21b10 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20  h OP_Gosub */.  
21b20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20    int regRowset 
21b30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
21b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21b50 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53  egister for RowS
21b60 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  et object */.   
21b70 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20   int regRowid = 
21b80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21ba0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
21bb0 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  owid */.    int 
21bc0 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69  iLoopBody = sqli
21bd0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
21be0 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  (v);  /* Start o
21bf0 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  f loop body */. 
21c00 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b     int iRetInit;
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c30 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52 65  Address of regRe
21c40 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20  turn init */.   
21c50 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72   int untestedTer
21c60 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ms = 0;         
21c70 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d      /* Some term
21c80 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
21c90 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69   tested */.    i
21ca0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
21cd0 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
21ce0 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20  AndExpr = 0;    
21cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
21d00 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22  n ".. AND (...)"
21d10 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
21d20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70    .    pTerm = p
21d30 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b  Loop->aLTerm[0];
21d40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
21d50 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
21d60 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
21d70 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b  rator & WO_OR );
21d80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
21d90 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
21da0 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29  ERM_ORINFO)!=0 )
21db0 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70  ;.    pOrWc = &p
21dc0 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
21dd0 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  >wc;.    pLevel-
21de0 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b  >op = OP_Return;
21df0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
21e00 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20  = regReturn;..  
21e10 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65    /* Set up a ne
21e20 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72  w SrcList in pOr
21e30 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  Tab containing t
21e40 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73  he table being s
21e50 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79  canned.    ** by
21e60 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68   this loop in th
21e70 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20  e a[0] slot and 
21e80 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62  all notReady tab
21e90 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c  les in a[1..] sl
21ea0 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  ots..    ** This
21eb0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63   becomes the Src
21ec0 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75  List in the recu
21ed0 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71  rsive call to sq
21ee0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
21ef0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
21f00 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
21f10 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
21f20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20  nNotReady;      
21f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21f40 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52  e number of notR
21f50 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20  eady tables */. 
21f60 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
21f70 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72  ist_item *origSr
21f80 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  c;     /* Origin
21f90 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65  al list of table
21fa0 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52  s */.      nNotR
21fb0 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  eady = pWInfo->n
21fc0 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d  Level - iLevel -
21fd0 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62   1;.      pOrTab
21fe0 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41   = sqlite3StackA
21ff0 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e  llocRaw(pParse->
22000 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22020 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b  sizeof(*pOrTab)+
22030 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f   nNotReady*sizeo
22040 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29  f(pOrTab->a[0]))
22050 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
22060 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e  ab==0 ) return n
22070 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70  otReady;.      p
22080 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  OrTab->nAlloc = 
22090 28 75 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  (u8)(nNotReady +
220a0 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
220b0 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
220c0 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
220d0 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
220e0 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
220f0 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
22100 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
22110 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
22120 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
22130 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
22140 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
22150 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
22160 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
22170 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
22180 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
22190 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
221a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
221b0 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
221c0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
221d0 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
221e0 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
221f0 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
22200 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
22210 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
22220 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
22230 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a  n empty rowset..
22240 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
22250 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
22260 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
22270 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
22280 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
22290 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
222a0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
222b0 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
222c0 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
222d0 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
222e0 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
222f0 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
22300 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
22310 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
22320 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
22330 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
22340 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
22350 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
22360 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
22370 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
22380 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
22390 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
223a0 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
223b0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
223c0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
223d0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
223e0 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
223f0 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
22400 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
22410 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
22420 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
22430 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
22440 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
22450 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
22460 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67  ==0 ){.      reg
22470 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Rowset = ++pPars
22480 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
22490 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
224a0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
224b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
224c0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
224d0 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20   regRowset);.   
224e0 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20   }.    iRetInit 
224f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
22500 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
22510 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29  r, 0, regReturn)
22520 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
22530 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
22540 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74  clause is z of t
22550 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52  he form:  (x1 OR
22560 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20   x2 OR ...) AND 
22570 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f  y.    ** Then fo
22580 72 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c  r every term xN,
22590 20 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65   evaluate as the
225a0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20   subexpression: 
225b0 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20  xN AND z.    ** 
225c0 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20  That way, terms 
225d0 69 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61  in y that are fa
225e0 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20  ctored into the 
225f0 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  disjunction will
22600 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65  .    ** be picke
22610 64 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75  d up by the recu
22620 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73  rsive calls to s
22630 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
22640 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  () below..    **
22650 0a 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  .    ** Actually
22660 2c 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73  , each subexpres
22670 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65  sion is converte
22680 64 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20  d to "xN AND w" 
22690 77 68 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a  where w is.    *
226a0 2a 20 74 68 65 20 22 69 6e 74 65 72 65 73 74 69  * the "interesti
226b0 6e 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d  ng" terms of z -
226c0 20 74 65 72 6d 73 20 74 68 61 74 20 64 69 64 20   terms that did 
226d0 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
226e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f   the.    ** ON o
226f0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
22700 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61  f a LEFT JOIN, a
22710 6e 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  nd terms that ar
22720 65 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20  e usable as .   
22730 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20   ** indices..   
22740 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
22750 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73  optimization als
22760 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69  o only applies i
22770 66 20 74 68 65 20 28 78 31 20 4f 52 20 78 32 20  f the (x1 OR x2 
22780 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20  OR ...) term.   
22790 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61   ** is not conta
227a0 69 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63  ined in the ON c
227b0 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
227c0 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65  JOIN..    ** See
227d0 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77   ticket http://w
227e0 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
227f0 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65  c/info/f2369304e
22800 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  4.    */.    if(
22810 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b   pWC->nTerm>1 ){
22820 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d  .      int iTerm
22830 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72  ;.      for(iTer
22840 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e  m=0; iTerm<pWC->
22850 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b  nTerm; iTerm++){
22860 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
22870 45 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54  Expr = pWC->a[iT
22880 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  erm].pExpr;.    
22890 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
228a0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
228b0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f  P_FromJoin) ) co
228c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
228d0 69 66 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d  if( pWC->a[iTerm
228e0 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ].wtFlags & (TER
228f0 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 4f  M_VIRTUAL|TERM_O
22900 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75  RINFO) ) continu
22910 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
22920 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f  pWC->a[iTerm].eO
22930 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
22940 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
22950 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d  .        pExpr =
22960 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
22970 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
22980 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
22990 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65  AndExpr = sqlite
229a0 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
229b0 3e 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70  >db, pAndExpr, p
229c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
229d0 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70       if( pAndExp
229e0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e  r ){.        pAn
229f0 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  dExpr = sqlite3P
22a00 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
22a10 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72  AND, 0, pAndExpr
22a20 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
22a30 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d    }..    for(ii=
22a40 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65  0; ii<pOrWc->nTe
22a50 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  rm; ii++){.     
22a60 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
22a70 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  erm = &pOrWc->a[
22a80 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ii];.      if( p
22a90 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
22aa0 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70 4f 72  or==iCur || (pOr
22ab0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
22ac0 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a  & WO_AND)!=0 ){.
22ad0 20 20 20 20 20 20 20 20 57 68 65 72 65 49 6e 66          WhereInf
22ae0 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20  o *pSubWInfo;   
22af0 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66         /* Info f
22b00 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72  or single OR-ter
22b10 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  m scan */.      
22b20 20 20 45 78 70 72 20 2a 70 4f 72 45 78 70 72 20    Expr *pOrExpr 
22b30 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  = pOrTerm->pExpr
22b40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
22b50 6e 64 45 78 70 72 20 26 26 20 21 45 78 70 72 48  ndExpr && !ExprH
22b60 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72 45 78  asProperty(pOrEx
22b70 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
22b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41   ){.          pA
22b90 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ndExpr->pLeft = 
22ba0 70 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20  pOrExpr;.       
22bb0 20 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e     pOrExpr = pAn
22bc0 64 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  dExpr;.        }
22bd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
22be0 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
22bf0 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
22c00 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
22c10 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62 57  */.        pSubW
22c20 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
22c30 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
22c40 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72   pOrTab, pOrExpr
22c50 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f  WHERE_OMIT_OPEN_
22c80 43 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f 41 4e  CLOSE | WHERE_AN
22c90 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20  D_ONLY |.       
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cb0 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
22cc0 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41  LE | WHERE_ONETA
22cd0 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76 43 75  BLE_ONLY, iCovCu
22ce0 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
22cf0 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20 7c 7c  rt( pSubWInfo ||
22d00 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
22d10 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
22d20 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
22d30 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
22d40 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
22d50 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c  WhereLoop *pSubL
22d60 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 65  oop;.          e
22d70 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
22d90 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53  rse, pOrTab, &pS
22da0 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69  ubWInfo->a[0], i
22db0 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69  Level, pLevel->i
22dc0 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20  From, 0.        
22dd0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
22de0 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
22df0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
22e00 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
22e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22e20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d  int iSet = ((ii=
22e30 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29  =pOrWc->nTerm-1)
22e40 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20  ?-1:ii);.       
22e50 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20       int r;.    
22e60 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69          r = sqli
22e70 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
22e80 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61  lumn(pParse, pTa
22e90 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c  bItem->pTab, -1,
22ea0 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20   iCur, .        
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ed0 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20   regRowid, 0);. 
22ee0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
22ef0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
22f00 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74  v, OP_RowSetTest
22f10 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20  , regRowset,.   
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
22f40 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
22f50 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53  Addr(v)+2, r, iS
22f60 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  et);.          }
22f70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22f80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22f90 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74  OP_Gosub, regRet
22fa0 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  urn, iLoopBody);
22fb0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
22fc0 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  he pSubWInfo->un
22fd0 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67  testedTerms flag
22fe0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
22ff0 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20   OR term.       
23000 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20     ** contained 
23010 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20  one or more AND 
23020 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52  term from a notR
23030 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65  eady table.  The
23040 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
23050 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74  rms from the not
23060 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c  Ready table coul
23070 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  d not be tested 
23080 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  and will.       
23090 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65     ** need to be
230a0 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20   tested later.. 
230b0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
230c0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
230d0 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
230e0 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72  ms ) untestedTer
230f0 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  ms = 1;..       
23100 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20     /* If all of 
23110 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  the OR-connected
23120 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d   terms are optim
23130 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ized using the s
23140 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
23150 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20   index, and the 
23160 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20  index is opened 
23170 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  using the same c
23180 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20  ursor number.   
23190 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63         ** by eac
231a0 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  h call to sqlite
231b0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61  3WhereBegin() ma
231c0 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c  de by this loop,
231d0 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20   it may.        
231e0 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
231f0 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64   to use that ind
23200 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67  ex as a covering
23210 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
23220 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
23230 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  * If the call to
23240 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
23250 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c  in() above resul
23260 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68  ted in a scan th
23270 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
23280 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61  uses an index, a
23290 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68 65  nd this is eithe
232a0 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63  r the first OR-c
232b0 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20  onnected term.  
232c0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
232d0 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65  ssed or the inde
232e0 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  x is the same as
232f0 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61 6c   that used by al
23300 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  l previous.     
23310 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73       ** terms, s
23320 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63  et pCov to the c
23330 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
23340 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69  g index. Otherwi
23350 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20  se, set .       
23360 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55     ** pCov to NU
23370 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  LL to indicate t
23380 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65  hat no candidate
23390 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
233a0 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20  will .          
233b0 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  ** be available.
233c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
233d0 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f 70          pSubLoop
233e0 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b   = pSubWInfo->a[
233f0 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20  0].pWLoop;.     
23400 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53       assert( (pS
23410 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  ubLoop->wsFlags 
23420 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
23430 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  EX)==0 );.      
23440 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f      if( (pSubLoo
23450 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
23460 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
23470 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69 69            && (ii
23480 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d  ==0 || pSubLoop-
23490 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d  >u.btree.pIndex=
234a0 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20  =pCov).         
234b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
234c0 61 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66  assert( pSubWInf
234d0 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d  o->a[0].iIdxCur=
234e0 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20  =iCovCur );.    
234f0 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70          pCov = p
23500 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  SubLoop->u.btree
23510 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  .pIndex;.       
23520 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23530 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30 3b 0a        pCov = 0;.
23540 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
23550 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68         /* Finish
23560 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67   the loop throug
23570 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
23580 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
23590 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
235a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
235b0 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29  reEnd(pSubWInfo)
235c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
235d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c    }.    }.    pL
235e0 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 20  evel->u.pCovidx 
235f0 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66 28 20  = pCov;.    if( 
23600 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d 3e 69  pCov ) pLevel->i
23610 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43 75 72  IdxCur = iCovCur
23620 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64 45 78  ;.    if( pAndEx
23630 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64  pr ){.      pAnd
23640 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
23650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
23660 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
23670 3e 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a  >db, pAndExpr);.
23680 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
23690 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
236a0 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74   iRetInit, sqlit
236b0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
236c0 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  r(v));.    sqlit
236d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
236e0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
236f0 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
23700 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
23710 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f  olveLabel(v, iLo
23720 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66  opBody);..    if
23730 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
23740 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63  >1 ) sqlite3Stac
23750 6b 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  kFree(pParse->db
23760 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69  , pOrTab);.    i
23770 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d  f( !untestedTerm
23780 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28  s ) disableTerm(
23790 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
237a0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
237b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
237c0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
237d0 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ..  {.    /* Cas
237e0 65 20 36 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 6:  There is n
237f0 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
23800 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
23810 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20  mplete.    **   
23820 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74         scan of t
23830 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e  he entire table.
23840 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
23850 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65  ic const u8 aSte
23860 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c  p[] = { OP_Next,
23870 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20   OP_Prev };.    
23880 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
23890 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f  aStart[] = { OP_
238a0 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20  Rewind, OP_Last 
238b0 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  };.    assert( b
238c0 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d  Rev==0 || bRev==
238d0 31 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  1 );.    pLevel-
238e0 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76  >op = aStep[bRev
238f0 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  ];.    pLevel->p
23900 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
23910 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
23920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23930 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d  (v, aStart[bRev]
23940 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
23950 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35  ;.    pLevel->p5
23960 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
23970 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
23980 45 50 3b 0a 20 20 7d 0a 20 20 6e 65 77 4e 6f 74  EP;.  }.  newNot
23990 52 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79  Ready = notReady
239a0 20 26 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49   & ~getMask(&pWI
239b0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
239c0 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65  Cur);..  /* Inse
239d0 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
239e0 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73  every subexpress
239f0 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20  ion that can be 
23a00 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20  completely.  ** 
23a10 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74  computed using t
23a20 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f  he current set o
23a30 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  f tables..  **. 
23a40 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
23a50 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d 35  ON-OF: R-49525-5
23a60 30 39 33 35 20 54 65 72 6d 73 20 74 68 61 74 20  0935 Terms that 
23a70 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69 73 66  cannot be satisf
23a80 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ied through.  **
23a90 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 69   the use of indi
23aa0 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73 74 73  ces become tests
23ab0 20 74 68 61 74 20 61 72 65 20 65 76 61 6c 75 61   that are evalua
23ac0 74 65 64 20 61 67 61 69 6e 73 74 20 65 61 63 68  ted against each
23ad0 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68 65   row of.  ** the
23ae0 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75 74 20   relevant input 
23af0 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
23b00 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
23b10 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j=pWC->nTerm; j
23b20 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; j--, pTerm++
23b30 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b  ){.    Expr *pE;
23b40 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
23b50 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
23b60 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
23b70 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d  /* IMP: R-30575-
23b80 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 74 65 73  11662 */.    tes
23b90 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
23ba0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
23bb0 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ED );.    if( pT
23bc0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
23bd0 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
23be0 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
23bf0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54  nue;.    if( (pT
23c00 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
23c10 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30   newNotReady)!=0
23c20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
23c30 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65  se( pWInfo->unte
23c40 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20  stedTerms==0.   
23c50 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
23c60 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
23c70 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
23c80 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a  BLE_ONLY)!=0 );.
23c90 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e        pWInfo->un
23ca0 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b  testedTerms = 1;
23cb0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
23cc0 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20  .    }.    pE = 
23cd0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
23ce0 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
23cf0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
23d00 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20  l->iLeftJoin && 
23d10 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
23d20 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
23d30 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69  ) ){.      conti
23d40 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nue;.    }.    s
23d50 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
23d60 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64  e(pParse, pE, ad
23d70 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
23d80 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
23d90 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
23da0 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
23db0 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  }..  /* Insert c
23dc0 6f 64 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20  ode to test for 
23dd0 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69  implied constrai
23de0 6e 74 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61  nts based on tra
23df0 6e 73 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f  nsitivity.  ** o
23e00 66 20 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61  f the "==" opera
23e10 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  tor..  **.  ** E
23e20 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57  xample: If the W
23e30 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
23e40 61 69 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22  ains "t1.a=t2.b"
23e50 20 61 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a   and "t2.b=123".
23e60 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20    ** and we are 
23e70 63 6f 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f  coding the t1 lo
23e80 6f 70 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f  op and the t2 lo
23e90 6f 70 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63  op has not yet c
23ea0 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  oded,.  ** then 
23eb0 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68  we cannot use th
23ec0 65 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f  e "t1.a=t2.b" co
23ed0 6e 73 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65  nstraint, but we
23ee0 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74   can code.  ** t
23ef0 68 65 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61  he implied "t1.a
23f00 3d 31 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74  =123" constraint
23f10 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65  ..  */.  for(pTe
23f20 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
23f30 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
23f40 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
23f50 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 57   Expr *pE;.    W
23f60 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a  hereTerm *pAlt;.
23f70 20 20 20 20 45 78 70 72 20 73 45 71 3b 0a 20 20      Expr sEq;.  
23f80 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
23f90 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
23fa0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
23fb0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23fc0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
23fd0 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56  rator!=(WO_EQUIV
23fe0 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e  |WO_EQ) ) contin
23ff0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
24000 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
24010 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
24020 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e      pE = pTerm->
24030 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
24040 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
24050 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
24060 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65  oin) );.    asse
24070 72 74 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  rt( (pTerm->prer
24080 65 71 52 69 67 68 74 20 26 20 6e 65 77 4e 6f 74  eqRight & newNot
24090 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20  Ready)!=0 );.   
240a0 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d   pAlt = findTerm
240b0 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54 65 72  (pWC, iCur, pTer
240c0 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c  m->u.leftColumn,
240d0 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51   notReady, WO_EQ
240e0 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20  |WO_IN, 0);.    
240f0 69 66 28 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f  if( pAlt==0 ) co
24100 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
24110 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  pAlt->wtFlags & 
24120 28 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  (TERM_CODED) ) c
24130 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74 65 73  ontinue;.    tes
24140 74 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70  tcase( pAlt->eOp
24150 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
24160 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
24170 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pAlt->eOperator 
24180 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56  & WO_IN );.    V
24190 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
241a0 76 2c 20 22 62 65 67 69 6e 20 74 72 61 6e 73 69  v, "begin transi
241b0 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 22  tive constraint"
241c0 29 29 3b 0a 20 20 20 20 73 45 71 20 3d 20 2a 70  ));.    sEq = *p
241d0 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Alt->pExpr;.    
241e0 73 45 71 2e 70 4c 65 66 74 20 3d 20 70 45 2d 3e  sEq.pLeft = pE->
241f0 70 4c 65 66 74 3b 0a 20 20 20 20 73 71 6c 69 74  pLeft;.    sqlit
24200 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
24210 61 72 73 65 2c 20 26 73 45 71 2c 20 61 64 64 72  arse, &sEq, addr
24220 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
24230 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 0a 20  PIFNULL);.  }.. 
24240 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f   /* For a LEFT O
24250 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72  UTER JOIN, gener
24260 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
24270 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  ll record the fa
24280 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20  ct that.  ** at 
24290 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66  least one row of
242a0 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
242b0 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65   has matched the
242c0 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20   left table.  . 
242d0 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
242e0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
242f0 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46     pLevel->addrF
24300 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
24310 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
24320 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
24330 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
24340 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c  teger, 1, pLevel
24350 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
24360 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
24370 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a  , "record LEFT J
24380 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20  OIN hit"));.    
24390 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
243a0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
243b0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
243c0 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d  ->a, j=0; j<pWC-
243d0 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65  >nTerm; j++, pTe
243e0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73  rm++){.      tes
243f0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
24400 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
24410 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49 4d 50 3a  TUAL );  /* IMP:
24420 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
24430 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
24440 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
24450 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
24460 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
24470 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
24480 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
24490 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
244a0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
244b0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
244c0 6e 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20  newNotReady)!=0 
244d0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
244e0 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  t( pWInfo->untes
244f0 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20  tedTerms );.    
24500 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
24510 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
24520 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
24530 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
24540 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
24550 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
24560 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  r, addrCont, SQL
24570 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
24580 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
24590 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
245a0 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  DED;.    }.  }. 
245b0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
245c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
245d0 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20  ReleaseReg);..  
245e0 72 65 74 75 72 6e 20 6e 65 77 4e 6f 74 52 65 61  return newNotRea
245f0 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48  dy;.}..#ifdef WH
24600 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
24610 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57  ./*.** Print a W
24620 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
24630 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75  for debugging pu
24640 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63  rposes.*/.static
24650 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50   void whereLoopP
24660 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a  rint(WhereLoop *
24670 70 2c 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  p, SrcList *pTab
24680 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 6e 62 20  List){.  int nb 
24690 3d 20 31 2b 28 70 54 61 62 4c 69 73 74 2d 3e 6e  = 1+(pTabList->n
246a0 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75  Src+7)/8;.  stru
246b0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
246c0 2a 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73  *pItem = pTabLis
246d0 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a  t->a + p->iTab;.
246e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
246f0 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73  pItem->pTab;.  s
24700 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24710 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
24720 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
24730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24740 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
24750 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
24760 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a  nb, p->prereq);.
24770 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24780 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20  intf(" %12s",.  
24790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247a0 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
247b0 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   ? pItem->zAlias
247c0 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b   : pTab->zName);
247d0 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
247e0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
247f0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
24800 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65     if( p->u.btre
24810 65 2e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  e.pIndex ){.    
24820 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
24830 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  ame = p->u.btree
24840 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 0a  .pIndex->zName;.
24850 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d        if( zName=
24860 3d 30 20 29 20 7a 4e 61 6d 65 20 3d 20 22 69 70  =0 ) zName = "ip
24870 6b 22 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  k";.      if( st
24880 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  rncmp(zName, "sq
24890 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22  lite_autoindex_"
248a0 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 17)==0 ){.    
248b0 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69      int i = sqli
248c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
248d0 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  e) - 1;.        
248e0 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21  while( zName[i]!
248f0 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20  ='_' ) i--;.    
24900 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a      zName += i;.
24910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
24920 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24930 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a  (".%-16s %2d", z
24940 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65  Name, p->u.btree
24950 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65  .nEq);.    }else
24960 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
24970 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73  ebugPrintf("%20s
24980 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ","");.    }.  }
24990 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
249a0 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  z;.    if( p->u.
249b0 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20  vtab.idxStr ){. 
249c0 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
249d0 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22  _mprintf("(%d,\"
249e0 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20  %s\",%x)",.     
249f0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e             p->u.
24a00 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e  vtab.idxNum, p->
24a10 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70  u.vtab.idxStr, p
24a20 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
24a30 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
24a40 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
24a50 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78  _mprintf("(%d,%x
24a60 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  )", p->u.vtab.id
24a70 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xNum, p->u.vtab.
24a80 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  omitMask);.    }
24a90 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
24aa0 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22  gPrintf(" %-19s"
24ab0 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , z);.    sqlite
24ac0 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20  3_free(z);.  }. 
24ad0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24ae0 6e 74 66 28 22 20 66 20 25 30 34 78 20 4e 20 25  ntf(" f %04x N %
24af0 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20  d", p->wsFlags, 
24b00 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 73 71  p->nLTerm);.  sq
24b10 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24b20 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64  (" cost %d,%d,%d
24b30 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20  \n", p->rSetup, 
24b40 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
24b50 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
24b60 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20  ** Convert bulk 
24b70 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61  memory into a va
24b80 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  lid WhereLoop th
24b90 61 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64  at can be passed
24ba0 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70  .** to whereLoop
24bb0 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79  Clear harmlessly
24bc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24bd0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57   whereLoopInit(W
24be0 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
24bf0 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61  p->aLTerm = p->a
24c00 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d  LTermSpace;.  p-
24c10 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
24c20 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79  ->nLSlot = Array
24c30 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70  Size(p->aLTermSp
24c40 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61  ace);.  p->wsFla
24c50 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gs = 0;.}../*.**
24c60 20 43 6c 65 61 72 20 74 68 65 20 57 68 65 72 65   Clear the Where
24c70 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c  Loop.u union.  L
24c80 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70  eave WhereLoop.p
24c90 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f  LTerm intact..*/
24ca0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
24cb0 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
24cc0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
24cd0 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69  ereLoop *p){.  i
24ce0 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  f( p->wsFlags & 
24cf0 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  (WHERE_VIRTUALTA
24d00 42 4c 45 7c 57 48 45 52 45 5f 54 45 4d 50 5f 49  BLE|WHERE_TEMP_I
24d10 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28  NDEX) ){.    if(
24d20 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
24d30 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
24d40 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74  E)!=0 && p->u.vt
24d50 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
24d60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24d70 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  e(p->u.vtab.idxS
24d80 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  tr);.      p->u.
24d90 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
24da0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  0;.      p->u.vt
24db0 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  ab.idxStr = 0;. 
24dc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
24dd0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
24de0 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20  _TEMP_INDEX)!=0 
24df0 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  && p->u.btree.pI
24e00 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20  ndex!=0 ){.     
24e10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24e20 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
24e30 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  ndex->zColAff);.
24e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
24e50 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72  ree(db, p->u.btr
24e60 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ee.pIndex);.    
24e70 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
24e80 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
24e90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c   }.}../*.** Deal
24ea0 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20  locate internal 
24eb0 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61  memory used by a
24ec0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
24ed0 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
24ee0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
24ef0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
24f00 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66  reLoop *p){.  if
24f10 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e  ( p->aLTerm!=p->
24f20 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71  aLTermSpace ) sq
24f30 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
24f40 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68  p->aLTerm);.  wh
24f50 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
24f60 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72  n(db, p);.  wher
24f70 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a  eLoopInit(p);.}.
24f80 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20  ./*.** Increase 
24f90 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
24fa0 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d  ation for pLoop-
24fb0 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20  >aLTerm[] to be 
24fc0 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73  at least n..*/.s
24fd0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
24fe0 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65  oopResize(sqlite
24ff0 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
25000 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57   *p, int n){.  W
25010 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77  hereTerm **paNew
25020 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f  ;.  if( p->nLSlo
25030 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51  t>=n ) return SQ
25040 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28  LITE_OK;.  n = (
25050 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77  n+7)&~7;.  paNew
25060 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
25070 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
25080 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e  (p->aLTerm[0])*n
25090 29 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d  );.  if( paNew==
250a0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
250b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70  E_NOMEM;.  memcp
250c0 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65  y(paNew, p->aLTe
250d0 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  rm, sizeof(p->aL
250e0 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c  Term[0])*p->nLSl
250f0 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  ot);.  if( p->aL
25100 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53  Term!=p->aLTermS
25110 70 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62  pace ) sqlite3Db
25120 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65  Free(db, p->aLTe
25130 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d  rm);.  p->aLTerm
25140 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e   = paNew;.  p->n
25150 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74  LSlot = n;.  ret
25160 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25170 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  ../*.** Transfer
25180 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
25190 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69  e second pLoop i
251a0 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a  nto the first..*
251b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
251c0 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74  reLoopXfer(sqlit
251d0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
251e0 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f  p *pTo, WhereLoo
251f0 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  p *pFrom){.  if(
25200 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
25210 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d  (db, pTo, pFrom-
25220 3e 6e 4c 54 65 72 6d 29 20 29 20 72 65 74 75 72  >nLTerm) ) retur
25230 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
25240 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
25250 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a  Union(db, pTo);.
25260 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46    memcpy(pTo, pF
25270 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f  rom, WHERE_LOOP_
25280 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63  XFER_SZ);.  memc
25290 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20  py(pTo->aLTerm, 
252a0 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70  pFrom->aLTerm, p
252b0 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f  To->nLTerm*sizeo
252c0 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d  f(pTo->aLTerm[0]
252d0 29 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  ));.  if( pFrom-
252e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
252f0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
25300 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74  .    pFrom->u.vt
25310 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
25320 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46  .  }else if( (pF
25330 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
25340 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
25350 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  !=0 ){.    pFrom
25360 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
25370 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
25380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25390 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
253a0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
253b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
253c0 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
253d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
253e0 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68  reLoop *p){.  wh
253f0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
25400 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
25410 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
25420 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
25430 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
25440 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25450 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71  whereInfoFree(sq
25460 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
25470 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
25480 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e   if( ALWAYS(pWIn
25490 66 6f 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65  fo) ){.    where
254a0 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57 49  ClauseClear(&pWI
254b0 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77  nfo->sWC);.    w
254c0 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c  hile( pWInfo->pL
254d0 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68  oops ){.      Wh
254e0 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49  ereLoop *p = pWI
254f0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20  nfo->pLoops;.   
25500 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70     pWInfo->pLoop
25510 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  s = p->pNextLoop
25520 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
25530 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a  pDelete(db, p);.
25540 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
25550 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
25560 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fo);.  }.}../*.*
25570 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c  * Insert or repl
25580 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ace a WhereLoop 
25590 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
255a0 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65  template supplie
255b0 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  d..**.** An exis
255c0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65  ting WhereLoop e
255d0 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76  ntry might be ov
255e0 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
255f0 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a   new template.**
25600 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68   is better and h
25610 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  as fewer depende
25620 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74  ncies.  Or the t
25630 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20  emplate will be 
25640 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e  ignored.** and n
25650 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63  o insert will oc
25660 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69  cur if an existi
25670 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ng WhereLoop is 
25680 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a  faster and has.*
25690 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  * fewer dependen
256a0 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65  cies than the te
256b0 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69  mplate.  Otherwi
256c0 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  se a new WhereLo
256d0 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62  op is.** added b
256e0 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70  ased on the temp
256f0 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  late..**.** If p
25700 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69  Builder->pBest i
25710 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
25720 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
25730 75 74 20 74 68 65 20 76 65 72 79 0a 2a 2a 20 62  ut the very.** b
25740 65 73 74 20 74 65 6d 70 6c 61 74 65 20 61 6e 64  est template and
25750 20 74 68 61 74 20 74 65 6d 70 6c 61 74 65 20 73   that template s
25760 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
25770 69 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65  in pBuilder->pBe
25780 73 74 2e 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64  st..** If pBuild
25790 65 72 2d 3e 70 42 65 73 74 20 69 73 20 4e 55 4c  er->pBest is NUL
257a0 4c 20 74 68 65 6e 20 61 20 6c 69 73 74 20 6f 66  L then a list of
257b0 20 74 68 65 20 62 65 73 74 20 74 65 6d 70 6c 61   the best templa
257c0 74 65 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  tes are stored.*
257d0 2a 20 69 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70  * in pBuilder->p
257e0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2e 0a 2a  WInfo->pLoops..*
257f0 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
25800 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
25810 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
25820 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73 20 4e  lder->pBest is N
25830 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c  ULL) we.** still
25840 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65   might overwrite
25850 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77   similar loops w
25860 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70  ith the new temp
25870 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 74  late if the.** t
25880 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
25890 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65  r.  Loops may be
258a0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20   overwritten if 
258b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  the following .*
258c0 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65  * conditions are
258d0 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28   met:.**.**    (
258e0 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68  1)  They have th
258f0 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20  e same iTab..** 
25900 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76     (2)  They hav
25910 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74  e the same iSort
25920 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20  Idx..**    (3)  
25930 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73  The template has
25940 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64   same or fewer d
25950 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
25960 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
25970 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65  p.**    (4)  The
25980 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68   template has th
25990 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20  e same or lower 
259a0 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75  cost than the cu
259b0 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20  rrent loop.**   
259c0 20 28 35 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (5)  The templa
259d0 74 65 20 75 73 65 73 20 6d 6f 72 65 20 74 65 72  te uses more ter
259e0 6d 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 69  ms of the same i
259f0 6e 64 65 78 20 62 75 74 20 68 61 73 20 6e 6f 20  ndex but has no 
25a00 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20 20  additional.**   
25a10 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69        dependenci
25a20 65 73 20 20 20 20 20 20 20 20 20 20 0a 2a 2f 0a  es          .*/.
25a30 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
25a40 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65  LoopInsert(Where
25a50 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
25a60 69 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70  ilder, WhereLoop
25a70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
25a80 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72  WhereLoop **ppPr
25a90 65 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74 20 3d  ev, *p, *pNext =
25aa0 20 30 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   0;.  WhereInfo 
25ab0 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
25ac0 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71  er->pWInfo;.  sq
25ad0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
25ae0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
25af0 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65  .  /* If pBuilde
25b00 72 2d 3e 70 42 65 73 74 20 69 73 20 64 65 66 69  r->pBest is defi
25b10 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b  ned, then only k
25b20 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
25b30 20 73 69 6e 67 6c 65 0a 20 20 2a 2a 20 62 65 73   single.  ** bes
25b40 74 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 70 42  t WhereLoop.  pB
25b50 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 2d 3e 6d  uilder->pBest->m
25b60 61 73 6b 53 65 6c 66 3d 3d 30 20 69 6e 64 69 63  askSelf==0 indic
25b70 61 74 65 73 20 74 68 61 74 20 6e 6f 0a 20 20 2a  ates that no.  *
25b80 2a 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f  * prior WhereLoo
25b90 70 73 20 68 61 76 65 20 62 65 65 6e 20 65 76 61  ps have been eva
25ba0 6c 75 61 74 65 64 20 61 6e 64 20 74 68 61 74 20  luated and that 
25bb0 74 68 65 20 63 75 72 72 65 6e 74 20 70 54 65 6d  the current pTem
25bc0 70 6c 61 74 65 0a 20 20 2a 2a 20 69 73 20 74 68  plate.  ** is th
25bd0 65 72 65 66 6f 72 65 20 74 68 65 20 66 69 72 73  erefore the firs
25be0 74 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  t and hence the 
25bf0 62 65 73 74 20 61 6e 64 20 73 68 6f 75 6c 64 20  best and should 
25c00 62 65 20 72 65 74 61 69 6e 65 64 2e 0a 20 20 2a  be retained..  *
25c10 2f 0a 20 20 69 66 28 20 28 70 20 3d 20 70 42 75  /.  if( (p = pBu
25c20 69 6c 64 65 72 2d 3e 70 42 65 73 74 29 21 3d 30  ilder->pBest)!=0
25c30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d   ){.    if( p->m
25c40 61 73 6b 53 65 6c 66 21 3d 30 20 29 7b 0a 20 20  askSelf!=0 ){.  
25c50 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 72 43      WhereCost rC
25c60 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74 41  ost = whereCostA
25c70 64 64 28 70 2d 3e 72 52 75 6e 2c 70 2d 3e 72 53  dd(p->rRun,p->rS
25c80 65 74 75 70 29 3b 0a 20 20 20 20 20 20 57 68 65  etup);.      Whe
25c90 72 65 43 6f 73 74 20 72 54 65 6d 70 6c 61 74 65  reCost rTemplate
25ca0 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
25cb0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
25cc0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
25cd0 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 43  p);.      if( rC
25ce0 6f 73 74 20 3c 20 72 54 65 6d 70 6c 61 74 65 20  ost < rTemplate 
25cf0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
25d00 61 73 65 28 20 72 43 6f 73 74 3d 3d 72 54 65 6d  ase( rCost==rTem
25d10 70 6c 61 74 65 2d 31 20 29 3b 0a 20 20 20 20 20  plate-1 );.     
25d20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f     goto whereLoo
25d30 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20  pInsert_noop;.  
25d40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
25d50 72 43 6f 73 74 3d 3d 72 54 65 6d 70 6c 61 74 65  rCost==rTemplate
25d60 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26   && (p->prereq &
25d70 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
25d80 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29  eq)==p->prereq )
25d90 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77  {.        goto w
25da0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e  hereLoopInsert_n
25db0 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oop;.      }.   
25dc0 20 7d 0a 23 69 66 20 57 48 45 52 45 54 52 41 43   }.#if WHERETRAC
25dd0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
25de0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
25df0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
25e00 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25e10 72 69 6e 74 66 28 70 2d 3e 6d 61 73 6b 53 65 6c  rintf(p->maskSel
25e20 66 3d 3d 30 20 3f 20 22 69 6e 73 2d 69 6e 69 74  f==0 ? "ins-init
25e30 3a 20 22 20 3a 20 22 69 6e 73 2d 62 65 73 74 3a  : " : "ins-best:
25e40 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
25e50 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
25e60 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ate, pWInfo->pTa
25e70 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 23 65  bList);.    }.#e
25e80 6e 64 69 66 0a 20 20 20 20 77 68 65 72 65 4c 6f  ndif.    whereLo
25e90 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54  opXfer(db, p, pT
25ea0 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 72 65  emplate);.    re
25eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25ec0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
25ed0 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
25ee0 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 6f 76   WhereLoop to ov
25ef0 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68 69 63  erwrite, or whic
25f00 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70 72 69  h takes.  ** pri
25f10 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65 6d 70  ority over pTemp
25f20 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  late..  */.  for
25f30 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66 6f 2d  (ppPrev=&pWInfo-
25f40 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70 50 72  >pLoops, p=*ppPr
25f50 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70  ev; p; ppPrev=&p
25f60 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a  ->pNextLoop, p=*
25f70 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28  ppPrev){.    if(
25f80 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c   p->iTab!=pTempl
25f90 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e  ate->iTab || p->
25fa0 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c  iSortIdx!=pTempl
25fb0 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b  ate->iSortIdx ){
25fc0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74  .      /* If eit
25fd0 68 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20  her the iTab or 
25fe0 69 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20  iSortIdx values 
25ff0 66 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f  for two WhereLoo
26000 70 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a  p are different.
26010 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
26020 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e  ose WhereLoops n
26030 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64  eed to be consid
26040 65 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  ered separately.
26050 20 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20    Neither is.   
26060 20 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74     ** a candidat
26070 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65  e to replace the
26080 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20   other. */.     
26090 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
260a0 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63  .    /* In the c
260b0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
260c0 61 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75  ation, the rSetu
260d0 70 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  p value is eithe
260e0 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72  r zero.    ** or
260f0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69   the cost of bui
26100 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  lding an automat
26110 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29  ic index (NlogN)
26120 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20   and the NlogN. 
26130 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d     ** is the sam
26140 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65  e for compatible
26150 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a   WhereLoops. */.
26160 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
26170 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d  Setup==0 || pTem
26180 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30  plate->rSetup==0
26190 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
261a0 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d     || p->rSetup=
261b0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
261c0 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68  up );..    /* wh
261d0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
261e0 29 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74  ) always generat
261f0 65 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74  es and inserts t
26200 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
26210 65 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66  ex.    ** case f
26220 69 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d  irst.  Hence com
26230 70 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74  patible candidat
26240 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76  e WhereLoops nev
26250 65 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72  er have a larger
26260 0a 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20  .    ** rSetup. 
26270 43 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d  Call this SETUP-
26280 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20  INVARIANT */.   
26290 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
262a0 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up>=pTemplate->r
262b0 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 69 66  Setup );..    if
262c0 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
262d0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
262e0 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20 20 20  )==p->prereq.   
262f0 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d    && p->rSetup<=
26300 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
26310 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  p.     && p->rRu
26320 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n<=pTemplate->rR
26330 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  un.    ){.      
26340 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 74  /* This branch t
26350 61 6b 65 6e 20 77 68 65 6e 20 70 20 69 73 20 65  aken when p is e
26360 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72 20 74  qual or better t
26370 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 20 69 6e  han pTemplate in
26380 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f   .      ** all o
26390 66 20 28 31 29 20 64 65 70 65 6e 64 65 6e 63 65  f (1) dependence
263a0 73 20 28 32 29 20 73 65 74 75 70 2d 63 6f 73 74  s (2) setup-cost
263b0 2c 20 61 6e 64 20 28 33 29 20 72 75 6e 2d 63 6f  , and (3) run-co
263c0 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  st. */.      ass
263d0 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d  ert( p->rSetup==
263e0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
263f0 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  p );.      if( p
26400 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65 6d 70 6c 61  ->nLTerm<pTempla
26410 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20 20 20 20 20  te->nLTerm.     
26420 20 20 26 26 20 28 70 2d 3e 77 73 46 6c 61 67 73    && (p->wsFlags
26430 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
26440 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )!=0.       && (
26450 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
26460 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
26470 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26  ED)!=0.       &&
26480 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
26490 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 75  ex==pTemplate->u
264a0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 0a 20 20  .btree.pIndex.  
264b0 20 20 20 20 20 26 26 20 70 2d 3e 70 72 65 72 65       && p->prere
264c0 71 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  q==pTemplate->pr
264d0 65 72 65 71 0a 20 20 20 20 20 20 29 7b 0a 20 20  ereq.      ){.  
264e0 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69        /* Overwri
264f0 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  te an existing W
26500 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
26510 20 73 69 6d 69 6c 61 72 20 6f 6e 65 20 74 68 61   similar one tha
26520 74 20 75 73 65 73 0a 20 20 20 20 20 20 20 20 2a  t uses.        *
26530 2a 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20  * more terms of 
26540 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
26550 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
26560 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20  pNextLoop;.     
26570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
26580 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
26590 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 6e  * pTemplate is n
265a0 6f 74 20 68 65 6c 70 66 75 6c 2e 0a 20 20 20 20  ot helpful..    
265b0 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 77 69      ** Return wi
265c0 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 6f  thout changing o
265d0 72 20 61 64 64 69 6e 67 20 61 6e 79 74 68 69 6e  r adding anythin
265e0 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  g */.        got
265f0 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  o whereLoopInser
26600 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a  t_noop;.      }.
26610 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
26620 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
26630 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
26640 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
26650 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
26660 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  >=pTemplate->rRu
26670 6e 0a 20 20 20 20 20 26 26 20 41 4c 57 41 59 53  n.     && ALWAYS
26680 28 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d  (p->rSetup>=pTem
26690 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 29 20 2f  plate->rSetup) /
266a0 2a 20 53 65 65 20 53 45 54 55 50 2d 49 4e 56 41  * See SETUP-INVA
266b0 52 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20  RIANT above */. 
266c0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f     ){.      /* O
266d0 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69 73  verwrite an exis
266e0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77  ting WhereLoop w
266f0 69 74 68 20 61 20 62 65 74 74 65 72 20 6f 6e 65  ith a better one
26700 3a 20 6f 6e 65 20 74 68 61 74 20 69 73 0a 20 20  : one that is.  
26710 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 61 74      ** better at
26720 20 6f 6e 65 20 6f 66 20 28 31 29 20 64 65 70 65   one of (1) depe
26730 6e 64 65 6e 63 65 73 2c 20 28 32 29 20 73 65 74  ndences, (2) set
26740 75 70 2d 63 6f 73 74 2c 20 6f 72 20 28 33 29 20  up-cost, or (3) 
26750 72 75 6e 2d 63 6f 73 74 0a 20 20 20 20 20 20 2a  run-cost.      *
26760 2a 20 61 6e 64 20 69 73 20 6e 6f 20 77 6f 72 73  * and is no wors
26770 65 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 6f 73  e in any of thos
26780 65 20 63 61 74 65 67 6f 72 69 65 73 2e 20 2a 2f  e categories. */
26790 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
267a0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
267b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
267c0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
267d0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
267e0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65   it means that e
267f0 69 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64  ither p[] should
26800 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
26810 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c    ** with pTempl
26820 61 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69  ate[] if p[] exi
26830 73 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55  sts, or if p==NU
26840 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  LL then allocate
26850 20 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72   a new.  ** Wher
26860 65 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74  eLoop and insert
26870 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48   it..  */.#if WH
26880 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
26890 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
268a0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
268b0 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29  {.    if( p!=0 )
268c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
268d0 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d  ebugPrintf("ins-
268e0 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20  del:  ");.      
268f0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
26900 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  , pWInfo->pTabLi
26910 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  st);.    }.    s
26920 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
26930 66 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29 3b  f("ins-new:  ");
26940 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72  .    whereLoopPr
26950 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
26960 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29  WInfo->pTabList)
26970 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
26980 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70  f( p==0 ){.    p
26990 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
269a0 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
269b0 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
269c0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
269d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
269e0 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49  ;.    whereLoopI
269f0 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 77 68  nit(p);.  }.  wh
26a00 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20  ereLoopXfer(db, 
26a10 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  p, pTemplate);. 
26a20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20   p->pNextLoop = 
26a30 70 4e 65 78 74 3b 0a 20 20 2a 70 70 50 72 65 76  pNext;.  *ppPrev
26a40 20 3d 20 70 3b 0a 20 20 69 66 28 20 28 70 2d 3e   = p;.  if( (p->
26a50 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26a60 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
26a70 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
26a80 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72  Index = p->u.btr
26a90 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  ee.pIndex;.    i
26aa0 66 28 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e  f( pIndex && pIn
26ab0 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a  dex->tnum==0 ){.
26ac0 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65        p->u.btree
26ad0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
26ae0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
26af0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
26b00 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
26b10 65 20 69 6e 73 65 72 74 20 69 73 20 61 20 6e 6f  e insert is a no
26b20 2d 6f 70 20 2a 2f 0a 77 68 65 72 65 4c 6f 6f 70  -op */.whereLoop
26b30 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23 69 66  Insert_noop:.#if
26b40 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
26b50 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
26b60 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
26b70 38 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  8 ){.    sqlite3
26b80 44 65 62 75 67 50 72 69 6e 74 66 28 70 42 75 69  DebugPrintf(pBui
26b90 6c 64 65 72 2d 3e 70 42 65 73 74 20 3f 20 22 69  lder->pBest ? "i
26ba0 6e 73 2d 73 6b 69 70 3a 20 22 20 3a 20 22 69 6e  ns-skip: " : "in
26bb0 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20  s-noop: ");.    
26bc0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
26bd0 54 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f  Template, pWInfo
26be0 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 7d  ->pTabList);.  }
26bf0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
26c00 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d 0a   SQLITE_OK;  .}.
26c10 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73  ./*.** We have s
26c20 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42  o far matched pB
26c30 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
26c40 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20  btree.nEq terms 
26c50 6f 66 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e  of the index pIn
26c60 64 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d  dex..** Try to m
26c70 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a  atch one more..*
26c80 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e  *.** If pProbe->
26c90 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65  tnum==0, that me
26ca0 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20  ans pIndex is a 
26cb0 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20  fake index used 
26cc0 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47  for the.** INTEG
26cd0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
26ce0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
26cf0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
26d00 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ndex(.  WhereLoo
26d10 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
26d20 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  er,     /* The W
26d30 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79  hereLoop factory
26d40 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
26d50 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
26d60 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
26d70 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
26d80 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e  analyzed */.  In
26d90 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20  dex *pProbe,    
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26db0 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72   An index on pSr
26dc0 63 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  c */.  WhereCost
26dd0 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20   nInMul         
26de0 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75         /* log(Nu
26df0 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
26e00 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f  ns due to IN) */
26e10 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
26e20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
26e30 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20  er->pWInfo;  /* 
26e40 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f  WHERE analyse co
26e50 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65  ntext */.  Parse
26e60 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66   *pParse = pWInf
26e70 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20  o->pParse;      
26e80 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
26e90 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
26ea0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
26eb0 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db;       /* Dat
26ec0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
26ed0 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20   malloc context 
26ee0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
26ef0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
26f00 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
26f10 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72   WhereLoop under
26f20 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
26f30 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
26f40 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
26f50 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72     /* A WhereTer
26f60 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72  m under consider
26f70 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ation */.  int o
26f80 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  pMask;          
26f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
26fa0 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f  lid operators fo
26fb0 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  r constraints */
26fc0 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
26fd0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
26fe0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
26ff0 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a  or WHERE terms *
27000 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65  /.  Bitmask save
27010 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20  d_prereq;       
27020 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
27030 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70  value of pNew->p
27040 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73  rereq */.  u16 s
27050 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20  aved_nLTerm;    
27060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
27070 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
27080 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a  pNew->nLTerm */.
27090 20 20 69 6e 74 20 73 61 76 65 64 5f 6e 45 71 3b    int saved_nEq;
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270b0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
270c0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
270d0 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 33  tree.nEq */.  u3
270e0 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  2 saved_wsFlags;
270f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27100 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
27110 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  of pNew->wsFlags
27120 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
27130 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20  saved_nOut;     
27140 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
27150 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
27160 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69  >nOut */.  int i
27170 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
27180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27190 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
271a0 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  n in the table *
271b0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
271c0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
271d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
271e0 64 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  de */.  WhereCos
271f0 74 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20 20  t nRowEst;      
27200 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d          /* Estim
27210 61 74 65 64 20 69 6e 64 65 78 20 73 65 6c 65 63  ated index selec
27220 74 69 76 69 74 79 20 2a 2f 0a 20 20 57 68 65 72  tivity */.  Wher
27230 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20  eCost rLogSize; 
27240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
27250 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c  ogarithm of tabl
27260 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72  e size */.  Wher
27270 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c  eTerm *pTop = 0,
27280 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54   *pBtm = 0; /* T
27290 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61  op and bottom ra
272a0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
272b0 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  */..  pNew = pBu
272c0 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69  ilder->pNew;.  i
272d0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
272e0 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
272f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73  ITE_NOMEM;..  as
27300 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
27310 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
27320 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
27330 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
27340 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
27350 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20  E_TOP_LIMIT)==0 
27360 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  );.  if( pNew->w
27370 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
27380 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
27390 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57  opMask = WO_LT|W
273a0 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  O_LE;.  }else if
273b0 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d  ( pProbe->tnum<=
273c0 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e  0 || (pSrc->join
273d0 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
273e0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  =0 ){.    opMask
273f0 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
27400 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
27410 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b  |WO_LE;.  }else{
27420 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
27430 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e  _EQ|WO_IN|WO_ISN
27440 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  ULL|WO_GT|WO_GE|
27450 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
27460 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62  .  if( pProbe->b
27470 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61  Unordered ) opMa
27480 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f  sk &= ~(WO_GT|WO
27490 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  _GE|WO_LT|WO_LE)
274a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
274b0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d  w->u.btree.nEq<=
274c0 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
274d0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75  );.  if( pNew->u
274e0 2e 62 74 72 65 65 2e 6e 45 71 20 3c 20 70 50 72  .btree.nEq < pPr
274f0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  obe->nColumn ){.
27500 20 20 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62      iCol = pProb
27510 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77  e->aiColumn[pNew
27520 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a  ->u.btree.nEq];.
27530 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 77 68      nRowEst = wh
27540 65 72 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e  ereCost(pProbe->
27550 61 69 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75  aiRowEst[pNew->u
27560 2e 62 74 72 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a  .btree.nEq+1]);.
27570 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 3d      if( nRowEst=
27580 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 6f 6e  =0 && pProbe->on
27590 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29  Error==OE_None )
275a0 20 6e 52 6f 77 45 73 74 20 3d 20 31 3b 0a 20 20   nRowEst = 1;.  
275b0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20  }else{.    iCol 
275c0 3d 20 2d 31 3b 0a 20 20 20 20 6e 52 6f 77 45 73  = -1;.    nRowEs
275d0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 65  t = 0;.  }.  pTe
275e0 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e  rm = whereScanIn
275f0 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64  it(&scan, pBuild
27600 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69  er->pWC, pSrc->i
27610 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20  Cursor, iCol,.  
27620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27630 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
27640 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e  robe);.  saved_n
27650 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  Eq = pNew->u.btr
27660 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f  ee.nEq;.  saved_
27670 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e  nLTerm = pNew->n
27680 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77  LTerm;.  saved_w
27690 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77  sFlags = pNew->w
276a0 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f  sFlags;.  saved_
276b0 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70  prereq = pNew->p
276c0 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e  rereq;.  saved_n
276d0 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out = pNew->nOut
276e0 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
276f0 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65   = 0;.  rLogSize
27700 20 3d 20 65 73 74 4c 6f 67 28 77 68 65 72 65 43   = estLog(whereC
27710 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ost(pProbe->aiRo
27720 77 45 73 74 5b 30 5d 29 29 3b 0a 20 20 66 6f 72  wEst[0]));.  for
27730 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
27740 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54   && pTerm!=0; pT
27750 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e  erm = whereScanN
27760 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20  ext(&scan)){.   
27770 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 20 20   int nIn = 0;.  
27780 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
27790 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
277a0 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
277b0 69 6e 75 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  inue;.    pNew->
277c0 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
277d0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65  wsFlags;.    pNe
277e0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
277f0 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
27800 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
27810 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20  aved_nLTerm;.   
27820 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
27830 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
27840 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
27850 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
27860 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  /.    pNew->aLTe
27870 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
27880 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
27890 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28  pNew->prereq = (
278a0 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70  saved_prereq | p
278b0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
278c0 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b  t) & ~pNew->mask
278d0 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Self;.    pNew->
278e0 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 3b  rRun = rLogSize;
278f0 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 63 6f 73   /* Baseline cos
27900 74 20 69 73 20 6c 6f 67 32 28 4e 29 2e 20 20 41  t is log2(N).  A
27910 64 6a 75 73 74 6d 65 6e 74 73 20 62 65 6c 6f 77  djustments below
27920 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
27930 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
27940 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
27950 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
27960 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
27970 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
27980 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
27990 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
279a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
279b0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
279c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
279d0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
279e0 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65  )":  TUNING: the
279f0 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
27a00 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
27a10 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73     nIn = 46;  as
27a20 73 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43  sert( 46==whereC
27a30 6f 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20  ost(25) );.     
27a40 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
27a50 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
27a60 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
27a70 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
27a80 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
27a90 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
27aa0 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  .)" */.        n
27ab0 49 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70  In = whereCost(p
27ac0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
27ad0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
27ae0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
27af0 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 70 4e  += nIn;.      pN
27b00 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
27b10 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  +;.      pNew->n
27b20 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20  Out = nRowEst + 
27b30 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
27b40 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
27b50 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
27b60 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20  WO_EQ) ){.      
27b70 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
27b80 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
27b90 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52  COLUMN_NULL|WHER
27ba0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 30  E_COLUMN_IN))!=0
27bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27bc0 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 20     || nInMul==0 
27bd0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
27be0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
27bf0 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
27c00 20 69 66 28 20 69 43 6f 6c 3c 30 20 20 0a 20 20   if( iCol<0  .  
27c10 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d       || (pProbe-
27c20 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
27c30 65 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20  e && nInMul==0. 
27c40 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65            && pNe
27c50 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d  w->u.btree.nEq==
27c60 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d  pProbe->nColumn-
27c70 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1).      ){.    
27c80 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4e 65      assert( (pNe
27c90 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
27ca0 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30  RE_COLUMN_IN)==0
27cb0 20 7c 7c 20 69 43 6f 6c 3c 30 20 29 3b 0a 20 20   || iCol<0 );.  
27cc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
27cd0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
27ce0 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROW;.      }.   
27cf0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
27d00 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e  .nEq++;.      pN
27d10 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45  ew->nOut = nRowE
27d20 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20  st + nInMul;.   
27d30 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
27d40 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
27d50 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  O_ISNULL) ){.   
27d60 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
27d70 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
27d80 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4e 65  _NULL;.      pNe
27d90 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
27da0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
27db0 47 3a 20 49 53 20 4e 55 4c 4c 20 73 65 6c 65 63  G: IS NULL selec
27dc0 74 73 20 32 20 72 6f 77 73 20 2a 2f 0a 20 20 20  ts 2 rows */.   
27dd0 20 20 20 6e 49 6e 20 3d 20 31 30 3b 20 20 61 73     nIn = 10;  as
27de0 73 65 72 74 28 20 31 30 3d 3d 77 68 65 72 65 43  sert( 10==whereC
27df0 6f 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20  ost(2) );.      
27e00 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f  pNew->nOut = nRo
27e10 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20  wEst + nInMul + 
27e20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  nIn;.    }else i
27e30 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
27e40 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  tor & (WO_GT|WO_
27e50 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  GE) ){.      tes
27e60 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
27e70 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 20  perator & WO_GT 
27e80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27e90 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
27ea0 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  tor & WO_GE );. 
27eb0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
27ec0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
27ed0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42  MN_RANGE|WHERE_B
27ee0 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
27ef0 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pBtm = pTerm;.  
27f00 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20      pTop = 0;.  
27f10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
27f20 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
27f30 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54  perator & (WO_LT
27f40 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20  |WO_LE) );.     
27f50 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
27f60 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
27f70 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
27f80 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
27f90 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20  perator & WO_LE 
27fa0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
27fb0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
27fc0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
27fd0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20  RE_TOP_LIMIT;.  
27fe0 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d      pTop = pTerm
27ff0 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28  ;.      pBtm = (
28000 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
28010 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29  WHERE_BTM_LIMIT)
28020 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
28030 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
28040 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
28050 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20  Term-2] : 0;.   
28060 20 7d 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d   }.    if( pNew-
28070 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
28080 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b  _COLUMN_RANGE ){
28090 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
280a0 20 6e 4f 75 74 20 61 6e 64 20 72 52 75 6e 20 66   nOut and rRun f
280b0 6f 72 20 53 54 41 54 33 20 72 61 6e 67 65 20 76  or STAT3 range v
280c0 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20 57  alues */.      W
280d0 68 65 72 65 43 6f 73 74 20 72 44 69 76 3b 0a 20  hereCost rDiv;. 
280e0 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53       whereRangeS
280f0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
28100 50 72 6f 62 65 2c 20 70 4e 65 77 2d 3e 75 2e 62  Probe, pNew->u.b
28110 74 72 65 65 2e 6e 45 71 2c 0a 20 20 20 20 20 20  tree.nEq,.      
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28130 20 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 72    pBtm, pTop, &r
28140 44 69 76 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  Div);.      pNew
28150 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
28160 4f 75 74 3e 72 44 69 76 2b 31 30 20 3f 20 73 61  Out>rDiv+10 ? sa
28170 76 65 64 5f 6e 4f 75 74 20 2d 20 72 44 69 76 20  ved_nOut - rDiv 
28180 3a 20 31 30 3b 0a 20 20 20 20 7d 0a 23 69 66 64  : 10;.    }.#ifd
28190 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
281a0 5f 53 54 41 54 33 0a 20 20 20 20 69 66 28 20 70  _STAT3.    if( p
281b0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
281c0 3d 3d 31 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e  ==1 && pProbe->n
281d0 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20  Sample ){.      
281e0 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30  tRowcnt nOut = 0
281f0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
28200 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28210 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
28220 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
28230 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
28240 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
28250 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74  _EQ );.        t
28260 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
28270 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
28280 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
28290 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
282a0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
282b0 70 50 72 6f 62 65 2c 20 70 54 65 72 6d 2d 3e 70  pProbe, pTerm->p
282c0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
282d0 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Out);.      }els
282e0 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
282f0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
28300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
28310 20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72    !ExprHasProper
28320 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
28330 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 20   EP_xIsSelect)  
28340 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28350 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
28360 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70  Parse, pProbe, p
28370 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  Term->pExpr->x.p
28380 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  List, &nOut);.  
28390 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
283a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
283b0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 77 68 65  pNew->nOut = whe
283c0 72 65 43 6f 73 74 28 6e 4f 75 74 29 3b 0a 20 20  reCost(nOut);.  
283d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
283e0 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
283f0 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  s & (WHERE_IDX_O
28400 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d  NLY|WHERE_IPK))=
28410 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45  =0 ){.      /* E
28420 61 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73  ach row involves
28430 20 61 20 73 74 65 70 20 6f 66 20 74 68 65 20 69   a step of the i
28440 6e 64 65 78 2c 20 74 68 65 6e 20 61 20 62 69 6e  ndex, then a bin
28450 61 72 79 20 73 65 61 72 63 68 20 6f 66 0a 20 20  ary search of.  
28460 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20      ** the main 
28470 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70  table */.      p
28480 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 20 77 68 65  New->rRun =  whe
28490 72 65 43 6f 73 74 41 64 64 28 70 4e 65 77 2d 3e  reCostAdd(pNew->
284a0 72 52 75 6e 2c 20 72 4c 6f 67 53 69 7a 65 3e 32  rRun, rLogSize>2
284b0 37 20 3f 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20  7 ? rLogSize-17 
284c0 3a 20 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  : 10);.    }.   
284d0 20 2f 2a 20 53 74 65 70 20 63 6f 73 74 20 66 6f   /* Step cost fo
284e0 72 20 65 61 63 68 20 6f 75 74 70 75 74 20 72 6f  r each output ro
284f0 77 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72  w */.    pNew->r
28500 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41  Run = whereCostA
28510 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  dd(pNew->rRun, p
28520 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
28530 2f 2a 20 54 42 44 3a 20 41 64 6a 75 73 74 20 6e  /* TBD: Adjust n
28540 4f 75 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  Out for addition
28550 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  al constraints *
28560 2f 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  /.    rc = where
28570 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
28580 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
28590 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
285a0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
285b0 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26  IMIT)==0.     &&
285c0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
285d0 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq<(pProbe->nCol
285e0 75 6d 6e 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a  umn + (pProbe->z
285f0 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20 20 29 7b  Name!=0)).    ){
28600 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
28610 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
28620 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
28630 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e  robe, nInMul+nIn
28640 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
28650 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61  New->prereq = sa
28660 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e  ved_prereq;.  pN
28670 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
28680 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70  = saved_nEq;.  p
28690 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
286a0 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
286b0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
286c0 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d  ed_nOut;.  pNew-
286d0 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
286e0 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e  nLTerm;.  return
286f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
28700 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20  turn True if it 
28710 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
28720 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65   pIndex might be
28730 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d   useful in.** im
28740 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
28750 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
28760 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  n pBuilder..**.*
28770 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69  * Return False i
28780 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20  f pBuilder does 
28790 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f  not contain an O
287a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
287b0 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
287c0 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64   no way for pInd
287d0 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  ex to be useful 
287e0 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  in implementing 
287f0 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59  that.** ORDER BY
28800 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
28810 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68  ic int indexMigh
28820 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
28830 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
28840 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
28850 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
28860 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29  .  int iCursor.)
28870 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
28880 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  B;.  int ii, jj;
28890 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ..  if( pIndex->
288a0 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74  bUnordered ) ret
288b0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f  urn 0;.  if( (pO
288c0 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
288d0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
288e0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
288f0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
28900 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  B->nExpr; ii++){
28910 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
28920 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
28930 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61  ipCollate(pOB->a
28940 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
28950 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
28960 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
28970 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45  rn 0;.    if( pE
28980 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75  xpr->iTable==iCu
28990 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66 6f  rsor ){.      fo
289a0 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
289b0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b 2b  x->nColumn; jj++
289c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
289d0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
289e0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
289f0 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  jj] ) return 1;.
28a00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28a10 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
28a20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
28a30 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73  bitmask where 1s
28a40 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
28a50 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
28a60 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
28a70 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20  e table is used 
28a80 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e  by an index.  On
28a90 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20  ly the first 63 
28aa0 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73  columns are cons
28ab0 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idered..*/.stati
28ac0 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e  c Bitmask column
28ad0 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  sInIndex(Index *
28ae0 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b  pIdx){.  Bitmask
28af0 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b   m = 0;.  int j;
28b00 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e  .  for(j=pIdx->n
28b10 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  Column-1; j>=0; 
28b20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  j--){.    int x 
28b30 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
28b40 5b 6a 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73  [j];.    testcas
28b50 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  e( x==BMS-1 );. 
28b60 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
28b70 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 69 66 28  BMS-2 );.    if(
28b80 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20   x<BMS-1 ) m |= 
28b90 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 7d 0a  MASKBIT(x);.  }.
28ba0 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 0a    return m;.}...
28bb0 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
28bc0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
28bd0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f  a single table o
28be0 66 20 74 68 65 20 6a 6f 69 6e 20 77 65 72 65 20  f the join were 
28bf0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
28c00 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69  idenfied by pBui
28c10 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
28c20 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
28c30 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
28c40 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61  e.** a b-tree ta
28c50 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75  ble, not a virtu
28c60 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
28c70 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
28c80 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
28c90 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
28ca0 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
28cb0 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
28cc0 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
28cd0 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
28ce0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
28cf0 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
28d00 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
28d10 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
28d20 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
28d30 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
28d40 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
28d50 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
28d60 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
28d70 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
28d80 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
28d90 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28db0 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
28dc0 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
28dd0 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
28de0 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74  tRowcnt aiRowEst
28df0 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54  Pk[2];      /* T
28e00 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61  he aiRowEst[] va
28e10 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
28e20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  index */.  int a
28e30 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20  iColumnPk = -1; 
28e40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43         /* The aC
28e50 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f  olumn[] value fo
28e60 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
28e70 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
28e80 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
28e90 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
28ea0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
28eb0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
28ec0 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc;  /* The FROM
28ed0 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65   clause btree te
28ee0 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57  rm to add */.  W
28ef0 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
28f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
28f10 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
28f20 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
28f30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28f40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
28f50 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
28f60 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20   iSortIdx = 1;  
28f70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
28f80 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  x number */.  in
28f90 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  t b;            
28fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62            /* A b
28fb0 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a  oolean value */.
28fc0 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 69 7a    WhereCost rSiz
28fd0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
28fe0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
28ff0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
29000 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f 67    WhereCost rLog
29010 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Size;         /*
29020 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   Logarithm of th
29030 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
29040 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
29050 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  .  .  pNew = pBu
29060 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
29070 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
29080 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62  ->pWInfo;.  pTab
29090 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
290a0 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20  TabList;.  pSrc 
290b0 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  = pTabList->a + 
290c0 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 61 73  pNew->iTab;.  as
290d0 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c  sert( !IsVirtual
290e0 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a  (pSrc->pTab) );.
290f0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e  .  if( pSrc->pIn
29100 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
29110 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
29120 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
29130 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
29140 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50  to use */.    pP
29150 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e  robe = pSrc->pIn
29160 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
29170 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
29180 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
29190 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
291a0 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
291b0 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
291c0 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
291d0 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
291e0 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
291f0 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
29200 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
29210 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
29220 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
29230 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
29240 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
29250 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
29260 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
29270 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29290 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
292a0 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
292b0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
292c0 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
292d0 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
292e0 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b  sPk.nColumn = 1;
292f0 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d  .    sPk.aiColum
29300 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b  n = &aiColumnPk;
29310 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73  .    sPk.aiRowEs
29320 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
29330 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
29340 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
29350 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
29360 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  Src->pTab;.    a
29370 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
29380 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45  Src->pTab->nRowE
29390 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  st;.    aiRowEst
293a0 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70  Pk[1] = 1;.    p
293b0 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54  First = pSrc->pT
293c0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
293d0 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
293e0 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  exed==0 ){.     
293f0 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64   /* The real ind
29400 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ices of the tabl
29410 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69  e are only consi
29420 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20  dered if the.   
29430 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45     ** NOT INDEXE
29440 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f  D qualifier is o
29450 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
29460 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
29470 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d       sPk.pNext =
29480 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20   pFirst;.    }. 
29490 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b     pProbe = &sPk
294a0 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20  ;.  }.  rSize = 
294b0 77 68 65 72 65 43 6f 73 74 28 70 53 72 63 2d 3e  whereCost(pSrc->
294c0 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a  pTab->nRowEst);.
294d0 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
294e0 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  Log(rSize);..  /
294f0 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
29500 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42  xes */.  if( !pB
29510 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 0a 20 20  uilder->pBest.  
29520 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61   && (pWInfo->pPa
29530 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
29540 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
29550 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63  x)!=0.   && pSrc
29560 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26  ->pIndex==0.   &
29570 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f  & !pSrc->viaCoro
29580 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72  utine.   && !pSr
29590 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20  c->notIndexed.  
295a0 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72   && !pSrc->isCor
295b0 72 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20 20  related.  ){.   
295c0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74   /* Generate aut
295d0 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f  o-index WhereLoo
295e0 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43  ps */.    WhereC
295f0 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75  lause *pWC = pBu
29600 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 20 20  ilder->pWC;.    
29610 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
29620 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
29630 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
29640 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
29650 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
29660 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
29670 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
29680 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
29690 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
296a0 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
296b0 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
296c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
296d0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
296e0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
296f0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
29700 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
29710 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
29720 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
29730 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
29740 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
29750 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
29760 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
29770 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  m;.        /* TU
29780 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63  NING: One-time c
29790 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e  ost for computin
297a0 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  g the automatic 
297b0 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20  index is.       
297c0 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74 65 6c   ** approximatel
297d0 79 20 36 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68  y 6*N*log2(N) wh
297e0 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
297f0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20  ber of rows in. 
29800 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61         ** the ta
29810 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
29820 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  d. */.        pN
29830 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f  ew->rSetup = rLo
29840 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20  gSize + rSize + 
29850 32 36 3b 20 20 61 73 73 65 72 74 28 20 32 36 3d  26;  assert( 26=
29860 3d 77 68 65 72 65 43 6f 73 74 28 36 29 20 29 3b  =whereCost(6) );
29870 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
29880 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c  NG: Each index l
29890 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 31 30 20  ookup yields 10 
298a0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
298b0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  e */.        pNe
298c0 77 2d 3e 6e 4f 75 74 20 3d 20 33 33 3b 20 20 61  w->nOut = 33;  a
298d0 73 73 65 72 74 28 20 33 33 3d 3d 77 68 65 72 65  ssert( 33==where
298e0 43 6f 73 74 28 31 30 29 20 29 3b 0a 20 20 20 20  Cost(10) );.    
298f0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
29900 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 4c   whereCostAdd(rL
29910 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75  ogSize,pNew->nOu
29920 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  t);.        pNew
29930 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
29940 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
29950 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
29960 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54  eq = mExtra | pT
29970 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
29980 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
29990 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
299a0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
299b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
299c0 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  }..  /* Loop ove
299d0 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20  r all indices.  
299e0 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53  */.  for(; rc==S
299f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f  QLITE_OK && pPro
29a00 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62  be; pProbe=pProb
29a10 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49  e->pNext, iSortI
29a20 64 78 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d  dx++){.    pNew-
29a30 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30  >u.btree.nEq = 0
29a40 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
29a50 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  rm = 0;.    pNew
29a60 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
29a70 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
29a80 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
29a90 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b  prereq = mExtra;
29aa0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
29ab0 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65  = rSize;.    pNe
29ac0 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  w->u.btree.pInde
29ad0 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20  x = pProbe;.    
29ae0 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65  b = indexMightHe
29af0 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 70 42  lpWithOrderBy(pB
29b00 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20  uilder, pProbe, 
29b10 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  pSrc->iCursor);.
29b20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41      /* The ONEPA
29b30 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73  SS_DESIRED flags
29b40 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f   never occurs to
29b50 67 65 74 68 65 72 20 77 69 74 68 20 4f 52 44 45  gether with ORDE
29b60 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65  R BY */.    asse
29b70 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  rt( (pWInfo->wct
29b80 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
29b90 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
29ba0 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20  ==0 || b==0 );. 
29bb0 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74     if( pProbe->t
29bc0 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  num<=0 ){.      
29bd0 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d 61  /* Integer prima
29be0 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a  ry key index */.
29bf0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
29c00 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b  ags = WHERE_IPK;
29c10 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  ..      /* Full 
29c20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20  table scan */.  
29c30 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
29c40 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64  dx = b ? iSortId
29c50 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20  x : 0;.      /* 
29c60 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
29c70 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
29c80 69 73 20 33 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e  is 3*(N + log2(N
29c90 29 29 2e 0a 20 20 20 20 20 20 2a 2a 20 20 2b 20  ))..      **  + 
29ca0 20 54 68 65 20 65 78 74 72 61 20 33 20 66 61 63   The extra 3 fac
29cb0 74 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f 75 72  tor is to encour
29cc0 61 67 65 20 74 68 65 20 75 73 65 20 6f 66 20 69  age the use of i
29cd0 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73 0a 20  ndexed lookups. 
29ce0 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 76 65 72       **     over
29cf0 20 66 75 6c 6c 20 73 63 61 6e 73 2e 20 20 41 20   full scans.  A 
29d00 73 6d 61 6c 6c 65 72 20 63 6f 6e 73 74 61 6e 74  smaller constant
29d10 20 32 20 69 73 20 75 73 65 64 20 66 6f 72 20 63   2 is used for c
29d20 6f 76 65 72 69 6e 67 0a 20 20 20 20 20 20 2a 2a  overing.      **
29d30 20 20 20 20 20 69 6e 64 65 78 20 73 63 61 6e 73       index scans
29d40 20 73 6f 20 74 68 61 74 20 61 20 63 6f 76 65 72   so that a cover
29d50 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 77  ing index scan w
29d60 69 6c 6c 20 62 65 20 66 61 76 6f 72 65 64 20 6f  ill be favored o
29d70 76 65 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ver.      **    
29d80 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 2a   a table scan. *
29d90 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  /.      pNew->rR
29da0 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64  un = whereCostAd
29db0 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65  d(rSize,rLogSize
29dc0 29 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 72 63  ) + 16;.      rc
29dd0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
29de0 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
29df0 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  w);.      if( rc
29e00 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65   ) break;.    }e
29e10 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
29e20 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  sk m = pSrc->col
29e30 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
29e40 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a  nIndex(pProbe);.
29e50 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
29e60 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28  ags = (m==0) ? (
29e70 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
29e80 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20  HERE_INDEXED) : 
29e90 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 0a  WHERE_INDEXED;..
29ea0 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63        /* Full sc
29eb0 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a  an via index */.
29ec0 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20 20        if( b.    
29ed0 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20     || ( m==0.   
29ee0 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d        && pProbe-
29ef0 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20  >bUnordered==0. 
29f00 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
29f10 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
29f20 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
29f30 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20  ESIRED)==0.     
29f40 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c      && sqlite3Gl
29f50 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43  obalConfig.bUseC
29f60 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  is.         && O
29f70 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
29f80 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  ed(pWInfo->pPars
29f90 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f  e->db, SQLITE_Co
29fa0 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20  verIdxScan).    
29fb0 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b        ).      ){
29fc0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
29fd0 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
29fe0 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20  ortIdx : 0;.    
29ff0 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a      if( m==0 ){.
2a000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
2a010 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 63  ING: Cost of a c
2a020 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63  overing index sc
2a030 61 6e 20 69 73 20 32 2a 28 4e 20 2b 20 6c 6f 67  an is 2*(N + log
2a040 32 28 4e 29 29 2e 0a 20 20 20 20 20 20 20 20 20  2(N))..         
2a050 20 2a 2a 20 20 2b 20 20 54 68 65 20 65 78 74 72   **  +  The extr
2a060 61 20 32 20 66 61 63 74 6f 72 20 69 73 20 74 6f  a 2 factor is to
2a070 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65 20 75   encourage the u
2a080 73 65 20 6f 66 20 69 6e 64 65 78 65 64 20 6c 6f  se of indexed lo
2a090 6f 6b 75 70 73 0a 20 20 20 20 20 20 20 20 20 20  okups.          
2a0a0 2a 2a 20 20 20 20 20 6f 76 65 72 20 69 6e 64 65  **     over inde
2a0b0 78 20 73 63 61 6e 73 2e 20 20 41 20 74 61 62 6c  x scans.  A tabl
2a0c0 65 20 73 63 61 6e 20 75 73 65 73 20 61 20 66 61  e scan uses a fa
2a0d0 63 74 6f 72 20 6f 66 20 33 20 73 6f 20 74 68 61  ctor of 3 so tha
2a0e0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  t.          **  
2a0f0 20 20 20 69 6e 64 65 78 20 73 63 61 6e 73 20 61     index scans a
2a100 72 65 20 66 61 76 6f 72 65 64 20 6f 76 65 72 20  re favored over 
2a110 74 61 62 6c 65 20 73 63 61 6e 73 2e 0a 20 20 20  table scans..   
2a120 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 49 66         **  +  If
2a130 20 74 68 69 73 20 63 6f 76 65 72 69 6e 67 20 69   this covering i
2a140 6e 64 65 78 20 6d 69 67 68 74 20 61 6c 73 6f 20  ndex might also 
2a150 68 65 6c 70 20 73 61 74 69 73 66 79 20 74 68 65  help satisfy the
2a160 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20   ORDER BY.      
2a170 20 20 20 20 2a 2a 20 20 20 20 20 63 6c 61 75 73      **     claus
2a180 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 73 74  e, then the cost
2a190 20 69 73 20 66 75 64 67 65 64 20 64 6f 77 6e 20   is fudged down 
2a1a0 73 6c 69 67 68 74 6c 79 20 73 6f 20 74 68 61 74  slightly so that
2a1b0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
2a1c0 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 69 73 20  **     index is 
2a1d0 66 61 76 6f 72 65 64 20 61 62 6f 76 65 20 6f 74  favored above ot
2a1e0 68 65 72 20 69 6e 64 69 63 65 73 20 74 68 61 74  her indices that
2a1f0 20 68 61 76 65 20 6e 6f 20 68 6f 70 65 20 6f 66   have no hope of
2a200 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
2a210 20 20 68 65 6c 70 69 6e 67 20 77 69 74 68 20 74    helping with t
2a220 68 65 20 4f 52 44 45 52 20 42 59 2e 20 2a 2f 0a  he ORDER BY. */.
2a230 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2a240 72 52 75 6e 20 3d 20 31 30 20 2b 20 77 68 65 72  rRun = 10 + wher
2a250 65 43 6f 73 74 41 64 64 28 72 53 69 7a 65 2c 72  eCostAdd(rSize,r
2a260 4c 6f 67 53 69 7a 65 29 20 2d 20 62 3b 0a 20 20  LogSize) - b;.  
2a270 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a280 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62         assert( b
2a290 21 3d 30 20 29 3b 20 0a 20 20 20 20 20 20 20 20  !=0 ); .        
2a2a0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
2a2b0 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 61 20  t of scanning a 
2a2c0 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
2a2d0 65 78 20 69 73 20 28 4e 2b 31 29 2a 6c 6f 67 32  ex is (N+1)*log2
2a2e0 28 4e 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  (N).          **
2a2f0 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20 73   which we will s
2a300 69 6d 70 6c 69 66 79 20 74 6f 20 6a 75 73 74 20  implify to just 
2a310 4e 2a 6c 6f 67 32 28 4e 29 20 2a 2f 0a 20 20 20  N*log2(N) */.   
2a320 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
2a330 6e 20 3d 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67  n = rSize + rLog
2a340 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Size;.        }.
2a350 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2a360 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2a370 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2a380 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
2a390 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2a3a0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 77 68 65    }.    rc = whe
2a3b0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
2a3c0 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
2a3d0 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a  rc, pProbe, 0);.
2a3e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
2a3f0 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
2a400 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
2a410 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e  only that one in
2a420 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  dex is.    ** co
2a430 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20  nsidered. */.   
2a440 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
2a450 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  x ) break;.  }. 
2a460 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2a470 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a480 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2a490 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
2a4a0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
2a4b0 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74  for a table of t
2a4c0 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69  he join identifi
2a4d0 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65  ed by.** pBuilde
2a4e0 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
2a4f0 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
2a500 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
2a510 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
2a520 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2a530 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
2a540 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  l(.  WhereLoopBu
2a550 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 20  ilder *pBuilder 
2a560 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
2a570 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
2a580 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
2a590 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
2a5a0 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c     /* WHERE anal
2a5b0 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ysis context */.
2a5c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
2a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a5e0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
2a5f0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
2a600 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
2a610 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2a620 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2a630 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2a640 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a  item *pSrc;   /*
2a650 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
2a660 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
2a670 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
2a680 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2a690 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
2a6a0 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
2a6b0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
2a6c0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
2a6d0 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
2a6e0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
2a6f0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
2a700 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
2a710 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2a720 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  m;.  int i, j;. 
2a730 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65   int iTerm, mxTe
2a740 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74  rm;.  int nConst
2a750 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65  raint;.  int see
2a760 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nIn = 0;        
2a770 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a780 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
2a790 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  is seen */.  int
2a7a0 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20   seenVar = 0;   
2a7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2a7c0 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74  e if a non-const
2a7d0 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  ant constraint i
2a7e0 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  s seen */.  int 
2a7f0 69 50 68 61 73 65 3b 20 20 20 20 20 20 20 20 20  iPhase;         
2a800 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63           /* 0: c
2a810 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20  onst w/o IN, 1: 
2a820 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c  const, 2: no IN,
2a830 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65    2: IN */.  Whe
2a840 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
2a850 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a860 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20  OK;..  pWInfo = 
2a870 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
2a880 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ;.  pParse = pWI
2a890 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
2a8a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2a8b0 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
2a8c0 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20  ->pWC;.  pNew = 
2a8d0 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
2a8e0 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f    pSrc = &pWInfo
2a8f0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e  ->pTabList->a[pN
2a900 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61  ew->iTab];.  pTa
2a910 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
2a920 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74    assert( IsVirt
2a930 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70  ual(pTab) );.  p
2a940 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61  IdxInfo = alloca
2a950 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
2a960 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70  se, pWC, pSrc, p
2a970 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42  Builder->pOrderB
2a980 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  y);.  if( pIdxIn
2a990 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  fo==0 ) return S
2a9a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70  QLITE_NOMEM;.  p
2a9b0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b  New->prereq = 0;
2a9c0 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20  .  pNew->rSetup 
2a9d0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46  = 0;.  pNew->wsF
2a9e0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52  lags = WHERE_VIR
2a9f0 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65  TUALTABLE;.  pNe
2aa00 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  w->nLTerm = 0;. 
2aa10 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
2aa20 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55  edFree = 0;.  pU
2aa30 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  sage = pIdxInfo-
2aa40 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
2aa50 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  e;.  nConstraint
2aa60 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   = pIdxInfo->nCo
2aa70 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20  nstraint;.  if( 
2aa80 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
2aa90 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74  db, pNew, nConst
2aaa0 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71  raint) ){.    sq
2aab0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2aac0 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72  pIdxInfo);.    r
2aad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2aae0 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  EM;.  }..  for(i
2aaf0 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c  Phase=0; iPhase<
2ab00 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20  =3; iPhase++){. 
2ab10 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26     if( !seenIn &
2ab20 26 20 28 69 50 68 61 73 65 26 31 29 21 3d 30 20  & (iPhase&1)!=0 
2ab30 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b  ){.      iPhase+
2ab40 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 68  +;.      if( iPh
2ab50 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20  ase>3 ) break;. 
2ab60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
2ab70 65 6e 56 61 72 20 26 26 20 69 50 68 61 73 65 3e  enVar && iPhase>
2ab80 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  1 ) break;.    p
2ab90 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
2aba0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
2abb0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
2abc0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
2abd0 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  aint;.    for(i=
2abe0 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
2abf0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
2ac00 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
2ac10 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
2ac20 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
2ac30 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
2ac40 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  C->a[j];.      s
2ac50 77 69 74 63 68 28 20 69 50 68 61 73 65 20 29 7b  witch( iPhase ){
2ac60 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a  .        case 0:
2ac70 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73      /* Constants
2ac80 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72   without IN oper
2ac90 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
2aca0 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
2acb0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  le = 0;.        
2acc0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2acd0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2ace0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2acf0 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20     seenIn = 1;. 
2ad00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ad10 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
2ad20 70 72 65 72 65 71 52 69 67 68 74 21 3d 30 20 29  prereqRight!=0 )
2ad30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
2ad40 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20  enVar = 1;.     
2ad50 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
2ad60 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2ad70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a   & WO_IN)==0 ){.
2ad80 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
2ad90 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31  Cons->usable = 1
2ada0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2adb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2adc0 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20         case 1:  
2add0 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77    /* Constants w
2ade0 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  ith IN operators
2adf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
2ae00 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a  sert( seenIn );.
2ae10 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2ae20 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54  ns->usable = (pT
2ae30 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
2ae40 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==0);.          
2ae50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
2ae60 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72  ase 2:    /* Var
2ae70 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49  iables without I
2ae80 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
2ae90 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 29  ssert( seenVar )
2aea0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
2aeb0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
2aec0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2aed0 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20   & WO_IN)==0;.  
2aee0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2aef0 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
2af00 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77    /* Variables w
2af10 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  ith IN */.      
2af20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
2af30 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b  Var && seenIn );
2af40 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
2af50 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
2af60 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2af70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2af80 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67      memset(pUsag
2af90 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73  e, 0, sizeof(pUs
2afa0 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f  age[0])*pIdxInfo
2afb0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  ->nConstraint);.
2afc0 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f      if( pIdxInfo
2afd0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2afe0 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
2aff0 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
2b000 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  tr);.    pIdxInf
2b010 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  o->idxStr = 0;. 
2b020 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
2b030 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Num = 0;.    pId
2b040 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2b050 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
2b060 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
2b070 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
2b080 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
2b090 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51  timatedCost = SQ
2b0a0 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28  LITE_BIG_DBL / (
2b0b0 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 72 63  double)2;.    rc
2b0c0 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65 78   = vtabBestIndex
2b0d0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
2b0e0 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  IdxInfo);.    if
2b0f0 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
2b100 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69  eLoopAddVtab_exi
2b110 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20  t;.    pIdxCons 
2b120 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
2b130 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
2b140 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
2b150 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
2b160 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
2b170 20 30 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d   0;.    mxTerm =
2b180 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
2b190 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e   pNew->nLSlot>=n
2b1a0 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20  Constraint );.  
2b1b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
2b1c0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70  nstraint; i++) p
2b1d0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d  New->aLTerm[i] =
2b1e0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e   0;.    pNew->u.
2b1f0 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20  vtab.omitMask = 
2b200 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
2b210 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
2b220 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
2b230 0a 20 20 20 20 20 20 69 66 28 20 28 69 54 65 72  .      if( (iTer
2b240 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72  m = pUsage[i].ar
2b250 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20  gvIndex - 1)>=0 
2b260 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70  ){.        j = p
2b270 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
2b280 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66  fset;.        if
2b290 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72  ( iTerm>=nConstr
2b2a0 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c  aint.         ||
2b2b0 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c   j<0.         ||
2b2c0 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20   j>=pWC->nTerm. 
2b2d0 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d          || pNew-
2b2e0 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d  >aLTerm[iTerm]!=
2b2f0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
2b300 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2b310 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
2b320 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2b330 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e  Msg(pParse, "%s.
2b340 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c  xBestIndex() mal
2b350 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d  function", pTab-
2b360 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
2b370 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f     goto whereLoo
2b380 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20  pAddVtab_exit;. 
2b390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b3a0 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
2b3b0 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20  ==nConstraint-1 
2b3c0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2b3d0 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20  ase( j==0 );.   
2b3e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
2b3f0 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29  ==pWC->nTerm-1 )
2b400 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
2b410 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
2b420 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
2b430 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65  eq |= pTerm->pre
2b440 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
2b450 20 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c    assert( iTerm<
2b460 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a  pNew->nLSlot );.
2b470 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
2b480 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54  Term[iTerm] = pT
2b490 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
2b4a0 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20   iTerm>mxTerm ) 
2b4b0 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a  mxTerm = iTerm;.
2b4c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2b4d0 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20  ( iTerm==15 );. 
2b4e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2b4f0 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20   iTerm==16 );.  
2b500 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c        if( iTerm<
2b510 31 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e  16 && pUsage[i].
2b520 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76  omit ) pNew->u.v
2b530 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20  tab.omitMask |= 
2b540 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  1<<iTerm;.      
2b550 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2b560 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
2b570 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2b580 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f   if( pUsage[i].o
2b590 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
2b5a0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2b5b0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
2b5c0 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20  n IN constraint 
2b5d0 69 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  if the virtual t
2b5e0 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
2b5f0 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20 74 68   ** says that th
2b600 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20  e equivalent EQ 
2b610 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
2b620 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74  t be safely omit
2b630 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ted..           
2b640 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74   ** If we do att
2b650 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75 63 68  empt to use such
2b660 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73   a constraint, s
2b670 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62  ome rows might b
2b680 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
2b690 20 72 65 70 65 61 74 65 64 20 69 6e 20 74 68 65   repeated in the
2b6a0 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20   output. */.    
2b6b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b6c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b6d0 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61       /* A virtua
2b6e0 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  l table that is 
2b6f0 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61  constrained by a
2b700 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20  n IN clause may 
2b710 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  not.          **
2b720 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44   consume the ORD
2b730 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63  ER BY clause bec
2b740 61 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64  ause (1) the ord
2b750 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20  er of IN terms. 
2b760 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
2b770 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72  ot necessarily r
2b780 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72  elated to the or
2b790 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65  der of output te
2b7a0 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20  rms and.        
2b7b0 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c    ** (2) Multipl
2b7c0 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61  e outputs from a
2b7d0 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65   single IN value
2b7e0 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a   will not merge.
2b7f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67            ** tog
2b800 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20  ether.  */.     
2b810 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f       pIdxInfo->o
2b820 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
2b830 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
2b840 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2b850 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69  if( i>=nConstrai
2b860 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  nt ){.      pNew
2b870 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72  ->nLTerm = mxTer
2b880 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  m+1;.      asser
2b890 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c  t( pNew->nLTerm<
2b8a0 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b  =pNew->nLSlot );
2b8b0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
2b8c0 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64  tab.idxNum = pId
2b8d0 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20  xInfo->idxNum;. 
2b8e0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2b8f0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64  b.needFree = pId
2b900 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2b910 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70  eIdxStr;.      p
2b920 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2b930 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
2b940 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2b950 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78 49  b.idxStr = pIdxI
2b960 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20  nfo->idxStr;.   
2b970 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2b980 69 73 4f 72 64 65 72 65 64 20 3d 20 28 75 38 29  isOrdered = (u8)
2b990 28 28 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  ((pIdxInfo->nOrd
2b9a0 65 72 42 79 21 3d 30 29 0a 20 20 20 20 20 20 20  erBy!=0).       
2b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2b9d0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
2b9e0 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20  ByConsumed);.   
2b9f0 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
2ba00 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
2ba10 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73  >rRun = whereCos
2ba20 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78  tFromDouble(pIdx
2ba30 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
2ba40 6f 73 74 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  ost);.      /* T
2ba50 55 4e 49 4e 47 3a 20 45 76 65 72 79 20 76 69 72  UNING: Every vir
2ba60 74 75 61 6c 20 74 61 62 6c 65 20 71 75 65 72 79  tual table query
2ba70 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
2ba80 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
2ba90 6e 4f 75 74 20 3d 20 34 36 3b 20 20 61 73 73 65  nOut = 46;  asse
2baa0 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73  rt( 46==whereCos
2bab0 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 77  t(25) );.      w
2bac0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2bad0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2bae0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
2baf0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
2bb00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2bb10 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e  e3_free(pNew->u.
2bb20 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20  vtab.idxStr);.  
2bb30 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
2bb40 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
2bb50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2bb60 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41   }  ..whereLoopA
2bb70 64 64 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69  ddVtab_exit:.  i
2bb80 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
2bb90 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20  dToFreeIdxStr ) 
2bba0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
2bbb0 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
2bbc0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2bbd0 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  db, pIdxInfo);. 
2bbe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
2bbf0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2bc00 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2bc10 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57   */../*.** Add W
2bc20 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73  hereLoop entries
2bc30 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65   to handle OR te
2bc40 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  rms.  This works
2bc50 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62   for either.** b
2bc60 74 72 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c  trees or virtual
2bc70 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
2bc80 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
2bc90 41 64 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42  AddOr(WhereLoopB
2bca0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
2bcb0 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61  , Bitmask mExtra
2bcc0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
2bcd0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
2bce0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65  r->pWInfo;.  Whe
2bcf0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
2bd00 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
2bd10 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
2bd20 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20  Term, *pWCEnd;. 
2bd30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2bd40 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b  _OK;.  int iCur;
2bd50 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74  .  WhereClause t
2bd60 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f  empWC;.  WhereLo
2bd70 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75  opBuilder sSubBu
2bd80 69 6c 64 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ild;.  WhereLoop
2bd90 20 73 42 65 73 74 3b 0a 20 20 73 74 72 75 63 74   sBest;.  struct
2bda0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2bdb0 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d  Item;.  .  pWC =
2bdc0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
2bdd0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
2bde0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2bdf0 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75  _AND_ONLY ) retu
2be00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2be10 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
2be20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
2be30 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2be40 3e 70 4e 65 77 3b 0a 0a 20 20 66 6f 72 28 70 54  >pNew;..  for(pT
2be50 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
2be60 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d  m<pWCEnd && rc==
2be70 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d  SQLITE_OK; pTerm
2be80 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
2be90 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2bea0 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20   WO_OR)!=0.     
2beb0 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
2bec0 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
2bed0 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
2bee0 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
2bef0 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
2bf00 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26   const pOrWC = &
2bf10 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
2bf20 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72  ->wc;.      Wher
2bf30 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f  eTerm * const pO
2bf40 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d  rWCEnd = &pOrWC-
2bf50 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d  >a[pOrWC->nTerm]
2bf60 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
2bf70 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20  m *pOrTerm;.    
2bf80 20 20 57 68 65 72 65 43 6f 73 74 20 72 54 6f 74    WhereCost rTot
2bf90 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 57 68  al = 0;.      Wh
2bfa0 65 72 65 43 6f 73 74 20 6e 52 6f 77 20 3d 20 30  ereCost nRow = 0
2bfb0 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
2bfc0 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b  prereq = mExtra;
2bfd0 0a 20 20 20 20 0a 20 20 20 20 20 20 77 68 65 72  .    .      wher
2bfe0 65 4c 6f 6f 70 49 6e 69 74 28 26 73 42 65 73 74  eLoopInit(&sBest
2bff0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 20 3d  );.      pItem =
2c000 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2c010 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
2c020 62 3b 0a 20 20 20 20 20 20 69 43 75 72 20 3d 20  b;.      iCur = 
2c030 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
2c040 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 20        sSubBuild 
2c050 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20  = *pBuilder;.   
2c060 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
2c070 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
2c080 20 73 53 75 62 42 75 69 6c 64 2e 70 42 65 73 74   sSubBuild.pBest
2c090 20 3d 20 26 73 42 65 73 74 3b 0a 0a 20 20 20 20   = &sBest;..    
2c0a0 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f    for(pOrTerm=pO
2c0b0 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c  rWC->a; pOrTerm<
2c0c0 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72  pOrWCEnd; pOrTer
2c0d0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
2c0e0 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
2c0f0 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
2c100 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c110 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
2c120 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
2c130 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
2c140 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
2c150 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
2c160 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
2c170 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f     tempWC.pWInfo
2c180 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
2c190 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
2c1a0 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
2c1b0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2c1c0 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
2c1d0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54         tempWC.nT
2c1e0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
2c1f0 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
2c200 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
2c210 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
2c220 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20   &tempWC;.      
2c230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c240 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2c250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
2c260 42 65 73 74 2e 6d 61 73 6b 53 65 6c 66 20 3d 20  Best.maskSelf = 
2c270 30 3b 0a 20 20 20 20 20 20 20 20 73 42 65 73 74  0;.        sBest
2c280 2e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  .rSetup = 0;.   
2c290 20 20 20 20 20 73 42 65 73 74 2e 72 52 75 6e 20       sBest.rRun 
2c2a0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
2c2b0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2c2c0 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66  TABLE.        if
2c2d0 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
2c2e0 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
2c2f0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2c300 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26  LoopAddVirtual(&
2c310 73 53 75 62 42 75 69 6c 64 29 3b 0a 20 20 20 20  sSubBuild);.    
2c320 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2c330 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
2c340 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2c350 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75  oopAddBtree(&sSu
2c360 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
2c370 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c380 20 20 20 2f 2a 20 73 42 65 73 74 2e 6d 61 73 6b     /* sBest.mask
2c390 53 65 6c 66 20 69 73 20 61 6c 77 61 79 73 20 7a  Self is always z
2c3a0 65 72 6f 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ero if an error 
2c3b0 6f 63 63 75 72 73 20 2a 2f 0a 20 20 20 20 20 20  occurs */.      
2c3c0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2c3d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 42 65 73 74  LITE_OK || sBest
2c3e0 2e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 29 3b 0a  .maskSelf==0 );.
2c3f0 20 20 20 20 20 20 20 20 69 66 28 20 73 42 65 73          if( sBes
2c400 74 2e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 29 20  t.maskSelf==0 ) 
2c410 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61  break;.        a
2c420 73 73 65 72 74 28 20 73 42 65 73 74 2e 72 53 65  ssert( sBest.rSe
2c430 74 75 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tup==0 );.      
2c440 20 20 72 54 6f 74 61 6c 20 3d 20 77 68 65 72 65    rTotal = where
2c450 43 6f 73 74 41 64 64 28 72 54 6f 74 61 6c 2c 20  CostAdd(rTotal, 
2c460 73 42 65 73 74 2e 72 52 75 6e 29 3b 0a 20 20 20  sBest.rRun);.   
2c470 20 20 20 20 20 6e 52 6f 77 20 3d 20 77 68 65 72       nRow = wher
2c480 65 43 6f 73 74 41 64 64 28 6e 52 6f 77 2c 20 73  eCostAdd(nRow, s
2c490 42 65 73 74 2e 6e 4f 75 74 29 3b 0a 20 20 20 20  Best.nOut);.    
2c4a0 20 20 20 20 70 72 65 72 65 71 20 7c 3d 20 73 42      prereq |= sB
2c4b0 65 73 74 2e 70 72 65 72 65 71 3b 0a 20 20 20 20  est.prereq;.    
2c4c0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2c4d0 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d  ( pNew->nLSlot>=
2c4e0 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  1 );.      if( s
2c4f0 42 65 73 74 2e 6d 61 73 6b 53 65 6c 66 20 29 7b  Best.maskSelf ){
2c500 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
2c510 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
2c520 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2c530 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
2c540 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
2c550 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s = WHERE_MULTI_
2c560 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  OR;.        pNew
2c570 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
2c580 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2c590 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 33 2e 35   Multiple by 3.5
2c5a0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 61   for the seconda
2c5b0 72 79 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20  ry table lookup 
2c5c0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
2c5d0 3e 72 52 75 6e 20 3d 20 72 54 6f 74 61 6c 20 2b  >rRun = rTotal +
2c5e0 20 31 38 3b 20 61 73 73 65 72 74 28 20 31 38 3d   18; assert( 18=
2c5f0 3d 77 68 65 72 65 43 6f 73 74 28 37 29 2d 77 68  =whereCost(7)-wh
2c600 65 72 65 43 6f 73 74 28 32 29 20 29 3b 0a 20 20  ereCost(2) );.  
2c610 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2c620 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20   = nRow;.       
2c630 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
2c640 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20  prereq;.        
2c650 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c  memset(&pNew->u,
2c660 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d   0, sizeof(pNew-
2c670 3e 75 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  >u));.        rc
2c680 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
2c690 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
2c6a0 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
2c6b0 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
2c6c0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
2c6d0 3e 64 62 2c 20 26 73 42 65 73 74 29 3b 0a 20 20  >db, &sBest);.  
2c6e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2c6f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
2c700 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
2c710 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20  objects for all 
2c720 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69  tables .*/.stati
2c730 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
2c740 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42  ddAll(WhereLoopB
2c750 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
2c760 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
2c770 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
2c780 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74  r->pWInfo;.  Bit
2c790 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b  mask mExtra = 0;
2c7a0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f  .  Bitmask mPrio
2c7b0 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  r = 0;.  int iTa
2c7c0 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  b;.  SrcList *pT
2c7d0 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
2c7e0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  >pTabList;.  str
2c7f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2c800 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
2c810 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
2c820 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69  >pParse->db;.  i
2c830 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57  nt nTabList = pW
2c840 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
2c850 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c860 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f  OK;.  u8 priorJo
2c870 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68  inType = 0;.  Wh
2c880 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a  ereLoop *pNew;..
2c890 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74    /* Loop over t
2c8a0 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
2c8b0 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74   join, from left
2c8c0 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70   to right */.  p
2c8d0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
2c8e0 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  pNew;.  whereLoo
2c8f0 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66  pInit(pNew);.  f
2c900 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d  or(iTab=0, pItem
2c910 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54  =pTabList->a; iT
2c920 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61  ab<nTabList; iTa
2c930 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  b++, pItem++){. 
2c940 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20     pNew->iTab = 
2c950 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  iTab;.    pNew->
2c960 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61  maskSelf = getMa
2c970 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
2c980 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
2c990 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
2c9a0 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  (pItem->jointype
2c9b0 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20  |priorJoinType) 
2c9c0 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
2c9d0 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  OSS))!=0 ){.    
2c9e0 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f    mExtra = mPrio
2c9f0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  r;.    }.    pri
2ca00 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74  orJoinType = pIt
2ca10 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
2ca20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
2ca30 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
2ca40 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2ca50 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70  LoopAddVirtual(p
2ca60 42 75 69 6c 64 65 72 29 3b 0a 20 20 20 20 7d 65  Builder);.    }e
2ca70 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2ca80 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
2ca90 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  e(pBuilder, mExt
2caa0 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ra);.    }.    i
2cab0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cac0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
2cad0 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42  hereLoopAddOr(pB
2cae0 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
2caf0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f  .    }.    mPrio
2cb00 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  r |= pNew->maskS
2cb10 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20  elf;.    if( rc 
2cb20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2cb30 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  led ) break;.  }
2cb40 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
2cb50 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72  r(db, pNew);.  r
2cb60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2cb70 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65  ** Examine a Whe
2cb80 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65  rePath (with the
2cb90 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65   addition of the
2cba0 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70   extra WhereLoop
2cbb0 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70   of the 5th.** p
2cbc0 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65  arameters) to se
2cbd0 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20  e if it outputs 
2cbe0 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
2cbf0 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a  ested ORDER BY.*
2cc00 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  * (or GROUP BY) 
2cc10 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e  without requirin
2cc20 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 75  g a separate sou
2cc30 72 63 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  rce operation.  
2cc40 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20  Return:.** .**  
2cc50 20 20 30 3a 20 20 4f 52 44 45 52 20 42 59 20 69    0:  ORDER BY i
2cc60 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2e  s not satisfied.
2cc70 20 20 53 6f 72 74 69 6e 67 20 72 65 71 75 69 72    Sorting requir
2cc80 65 64 0a 2a 2a 20 20 20 20 31 3a 20 20 4f 52 44  ed.**    1:  ORD
2cc90 45 52 20 42 59 20 69 73 20 73 61 74 69 73 66 69  ER BY is satisfi
2cca0 65 64 2e 20 20 20 20 20 20 4f 6d 69 74 20 73 6f  ed.      Omit so
2ccb0 72 74 69 6e 67 0a 2a 2a 20 20 20 2d 31 3a 20 20  rting.**   -1:  
2ccc0 55 6e 6b 6e 6f 77 6e 20 61 74 20 74 68 69 73 20  Unknown at this 
2ccd0 74 69 6d 65 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  time.**.*/.stati
2cce0 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53  c int wherePathS
2ccf0 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
2cd00 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2cd10 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20  Info,    /* The 
2cd20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2cd30 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
2cd40 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52  erBy,   /* ORDER
2cd50 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
2cd60 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75  or DISTINCT clau
2cd70 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  se to check */. 
2cd80 20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74   WherePath *pPat
2cd90 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  h,     /* The Wh
2cda0 65 72 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b  erePath to check
2cdb0 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
2cdc0 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d  lags,       /* M
2cdd0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45  ight contain WHE
2cde0 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48  RE_GROUPBY or WH
2cdf0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a  ERE_DISTINCTBY *
2ce00 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20  /.  u16 nLoop,  
2ce10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ce20 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2ce30 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  n pPath->aLoop[]
2ce40 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2ce50 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pLast,     /* A
2ce60 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f  dd this WhereLoo
2ce70 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
2ce80 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a  pPath->aLoop[] *
2ce90 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65  /.  Bitmask *pRe
2cea0 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54  vMask     /* OUT
2ceb0 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c  : Mask of WhereL
2cec0 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72  oops to run in r
2ced0 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
2cee0 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20  ){.  u8 revSet; 
2cef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2cf00 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f  ue if rev is kno
2cf10 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20  wn */.  u8 rev; 
2cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cf30 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20   Composite sort 
2cf40 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  order */.  u8 re
2cf50 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  vIdx;           
2cf60 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f   /* Index sort o
2cf70 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f  rder */.  u8 isO
2cf80 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20  rderDistinct;   
2cf90 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65  /* All prior Whe
2cfa0 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65  reLoops are orde
2cfb0 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  r-distinct */.  
2cfc0 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  u8 distinctColum
2cfd0 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ns;   /* True if
2cfe0 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e   the loop has UN
2cff0 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  IQUE NOT NULL co
2d000 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73  lumns */.  u8 is
2d010 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  Match;          
2d020 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63   /* iColumn matc
2d030 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  hes a term of th
2d040 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2d050 65 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75  e */.  u16 nColu
2d060 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
2d070 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
2d080 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20  s in pIndex */. 
2d090 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20   u16 nOrderBy;  
2d0a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2d0b0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
2d0c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2d0d0 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
2d0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2d0f0 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69  x of WhereLoop i
2d100 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70 72  n pPath being pr
2d110 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ocessed */.  int
2d120 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
2d130 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2d140 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ers */.  int iCu
2d150 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
2d160 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
2d170 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65 72  for current Wher
2d180 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69  eLoop */.  int i
2d190 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
2d1a0 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d   /* A column num
2d1b0 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65  ber within table
2d1c0 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65   iCur */.  Where
2d1d0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b  Loop *pLoop = 0;
2d1e0 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72   /* Current Wher
2d1f0 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63  eLoop being proc
2d200 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72  essed. */.  Wher
2d210 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
2d220 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
2d230 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
2d240 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
2d250 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20   *pOBExpr;      
2d260 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
2d270 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45  on from the ORDE
2d280 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2d290 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
2d2a0 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54         /* COLLAT
2d2b0 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20  E function from 
2d2c0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2d2d0 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64  se term */.  Ind
2d2e0 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
2d2f0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
2d300 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2d310 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74  pLoop */.  sqlit
2d320 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
2d330 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a  >pParse->db;  /*
2d340 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
2d350 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
2d360 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20  k obSat = 0;    
2d370 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52  /* Mask of ORDER
2d380 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66   BY terms satisf
2d390 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  ied so far */.  
2d3a0 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20  Bitmask obDone; 
2d3b0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
2d3c0 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65   all ORDER BY te
2d3d0 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
2d3e0 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
2d3f0 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  sk;  /* Mask of 
2d400 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64  all well-ordered
2d410 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d   loops */.  Bitm
2d420 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20  ask ready;      
2d430 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
2d440 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a  of inner loops *
2d450 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20  /..  /*.  ** We 
2d460 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
2d470 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69  p is "one-row" i
2d480 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e  f it generates n
2d490 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a  o more than one.
2d4a0 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70    ** row of outp
2d4b0 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70  ut.  A WhereLoop
2d4c0 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61   is one-row if a
2d4d0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
2d4e0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
2d4f0 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65  **  (a) All inde
2d500 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20  x columns match 
2d510 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d  with WHERE_COLUM
2d520 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20  N_EQ..  **  (b) 
2d530 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69  The index is uni
2d540 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65  que.  ** Any Whe
2d550 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57  reLoop with an W
2d560 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63  HERE_COLUMN_EQ c
2d570 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65  onstraint on the
2d580 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f   rowid is one-ro
2d590 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e  w..  ** Every on
2d5a0 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
2d5b0 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48  will have the WH
2d5c0 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73  ERE_ONEROW bit s
2d5d0 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20  et in wsFlags.. 
2d5e0 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   **.  ** We say 
2d5f0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
2d600 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74   "order-distinct
2d610 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20  " if the set of 
2d620 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a  columns from.  *
2d630 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70  * that WhereLoop
2d640 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2d650 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2d660 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66   are different f
2d670 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f  or every.  ** ro
2d680 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  w of the WhereLo
2d690 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72  op.  Every one-r
2d6a0 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ow WhereLoop is 
2d6b0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20  automatically.  
2d6c0 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ** order-distinc
2d6d0 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70  t.   A WhereLoop
2d6e0 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c   that has no col
2d6f0 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45  umns in the ORDE
2d700 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a  R BY clause.  **
2d710 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69   is not order-di
2d720 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72  stinct. To be or
2d730 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20  der-distinct is 
2d740 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61  not quite the sa
2d750 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a  me as being.  **
2d760 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20   UNIQUE since a 
2d770 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72  UNIQUE column or
2d780 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20   index can have 
2d790 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68  multiple rows th
2d7a0 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  at .  ** are NUL
2d7b0 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65  L and NULL value
2d7c0 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  s are equivalent
2d7d0 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   for the purpose
2d7e0 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   of order-distin
2d7f0 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f  ct..  ** To be o
2d800 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74  rder-distinct, t
2d810 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20  he columns must 
2d820 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  be UNIQUE and NO
2d830 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a  T NULL..  **.  *
2d840 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
2d850 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79  a table is alway
2d860 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54  s UNIQUE and NOT
2d870 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65   NULL so wheneve
2d880 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64  r the.  ** rowid
2d890 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
2d8a0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
2d8b0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2d8c0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a  ng WhereLoop is.
2d8d0 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
2d8e0 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ly order-distinc
2d8f0 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72  t..  */..  asser
2d900 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
2d910 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c  ;..  /* Sortabil
2d920 69 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20 74  ity of virtual t
2d930 61 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d 69  ables is determi
2d940 6e 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  ned by the xBest
2d950 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a  Index method.  *
2d960 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  * of the virtual
2d970 20 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f   table itself */
2d980 0a 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77 73  .  if( pLast->ws
2d990 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
2d9a0 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
2d9b0 20 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f 6f    testcase( nLoo
2d9c0 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65 20  p>0 );  /* True 
2d9d0 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  when outer loops
2d9e0 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e 64   are one-row and
2d9f0 20 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20 20   match .        
2da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da10 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42 59    ** no ORDER BY
2da20 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72 65   terms */.    re
2da30 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74  turn pLast->u.vt
2da40 61 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20  ab.isOrdered;.  
2da50 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26  }.  if( nLoop &&
2da60 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
2da70 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2da80 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29  _OrderByIdxJoin)
2da90 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
2daa0 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
2dab0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65  rBy->nExpr;.  te
2dac0 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79  stcase( nOrderBy
2dad0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28  ==BMS-1 );.  if(
2dae0 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20   nOrderBy>BMS-1 
2daf0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
2db00 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20  Cannot optimize 
2db10 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44  overly large ORD
2db20 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72  ER BYs */.  isOr
2db30 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b  derDistinct = 1;
2db40 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b  .  obDone = MASK
2db50 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b  BIT(nOrderBy)-1;
2db60 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  .  orderDistinct
2db70 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64  Mask = 0;.  read
2db80 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f  y = 0;.  for(iLo
2db90 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73  op=0; isOrderDis
2dba0 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f  tinct && obSat<o
2dbb0 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d  bDone && iLoop<=
2dbc0 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
2dbd0 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30  .    if( iLoop>0
2dbe0 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f   ) ready |= pLoo
2dbf0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
2dc00 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e   pLoop = iLoop<n
2dc10 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c  Loop ? pPath->aL
2dc20 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61  oop[iLoop] : pLa
2dc30 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
2dc40 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2dc50 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
2dc60 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ABLE)==0 );.    
2dc70 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
2dc80 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
2dc90 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
2dca0 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
2dcb0 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
2dcc0 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
2dcd0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
2dce0 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
2dcf0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
2dd00 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
2dd10 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
2dd20 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
2dd30 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
2dd40 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
2dd50 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
2dd60 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
2dd70 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
2dd80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
2dd90 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
2dda0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
2ddb0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
2ddc0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
2ddd0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
2dde0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
2ddf0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2de00 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
2de10 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
2de20 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
2de30 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
2de40 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
2de50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2de60 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
2de70 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  erm(&pWInfo->sWC
2de80 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d  , iCur, pOBExpr-
2de90 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >iColumn,.      
2dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2deb0 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57   ~ready, WO_EQ|W
2dec0 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  O_ISNULL, 0);.  
2ded0 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
2dee0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2def0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
2df00 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21  Operator&WO_EQ)!
2df10 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69  =0 && pOBExpr->i
2df20 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
2df30 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2df40 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20  *z1, *z2;.      
2df50 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2df60 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
2df70 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
2df80 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2df90 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
2dfa0 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
2dfb0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
2dfc0 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f          z1 = pCo
2dfd0 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
2dfe0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2dff0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2e000 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54  Info->pParse, pT
2e010 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  erm->pExpr);.   
2e020 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
2e030 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
2e040 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
2e050 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   z2 = pColl->zNa
2e060 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
2e070 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2e080 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74  1, z2)!=0 ) cont
2e090 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
2e0a0 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
2e0b0 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a  KBIT(i);.    }..
2e0c0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
2e0d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2e0e0 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20  ONEROW)==0 ){.  
2e0f0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
2e100 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2e110 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  PK ){.        pI
2e120 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
2e130 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20    nColumn = 0;. 
2e140 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
2e150 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e  pIndex = pLoop->
2e160 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d  u.btree.pIndex)=
2e170 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55  =0 || pIndex->bU
2e180 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  nordered ){.    
2e190 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2e1a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e1b0 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     nColumn = pIn
2e1c0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
2e1d0 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2e1e0 74 69 6e 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e  tinct = pIndex->
2e1f0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
2e200 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2e210 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
2e220 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
2e230 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65  the index and de
2e240 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73  al with the ones
2e250 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61  .      ** that a
2e260 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e  re not constrain
2e270 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a  ed by == or IN..
2e280 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2e290 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b  ev = revSet = 0;
2e2a0 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43  .      distinctC
2e2b0 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20  olumns = 0;.    
2e2c0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 3d 6e 43    for(j=0; j<=nC
2e2d0 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
2e2e0 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20       u8 bOnce;  
2e2f0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20   /* True to run 
2e300 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61  the ORDER BY sea
2e310 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  rch loop */..   
2e320 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65       /* Skip ove
2e330 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c  r == and IS NULL
2e340 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
2e350 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75    if( j<pLoop->u
2e360 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20  .btree.nEq.     
2e370 20 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f      && ((i = pLo
2e380 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65  op->aLTerm[j]->e
2e390 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f  Operator) & (WO_
2e3a0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d  EQ|WO_ISNULL))!=
2e3b0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
2e3c0 20 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57         if( i & W
2e3d0 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
2e3e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2e3f0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2e400 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t );.           
2e410 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2e420 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2e430 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  }.          cont
2e440 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20  inue;  .        
2e450 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  }..        /* Ge
2e460 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  t the column num
2e470 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ber in the table
2e480 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73   (iColumn) and s
2e490 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ort order.      
2e4a0 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f    ** (revIdx) fo
2e4b0 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  r the j-th colum
2e4c0 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a  n of the index..
2e4d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e4e0 20 20 20 69 66 28 20 6a 3c 6e 43 6f 6c 75 6d 6e     if( j<nColumn
2e4f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2e500 20 4e 6f 72 6d 61 6c 20 69 6e 64 65 78 20 63 6f   Normal index co
2e510 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  lumns */.       
2e520 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     iColumn = pIn
2e530 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  dex->aiColumn[j]
2e540 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49  ;.          revI
2e550 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f  dx = pIndex->aSo
2e560 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20  rtOrder[j];.    
2e570 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
2e580 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  n==pIndex->pTabl
2e590 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75  e->iPKey ) iColu
2e5a0 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
2e5b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e5c0 20 20 2f 2a 20 54 68 65 20 52 4f 57 49 44 20 63    /* The ROWID c
2e5d0 6f 6c 75 6d 6e 20 61 74 20 74 68 65 20 65 6e 64  olumn at the end
2e5e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
2e5f0 73 65 72 74 28 20 6a 3d 3d 6e 43 6f 6c 75 6d 6e  sert( j==nColumn
2e600 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43   );.          iC
2e610 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
2e620 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30        revIdx = 0
2e630 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2e640 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e       /* An uncon
2e650 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20  strained column 
2e660 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55  that might be NU
2e670 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  LL means that th
2e680 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68  is.        ** Wh
2e690 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77  ereLoop is not w
2e6a0 65 6c 6c 2d 6f 72 64 65 72 65 64 20 0a 20 20 20  ell-ordered .   
2e6b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2e6c0 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
2e6d0 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  nct.         && 
2e6e0 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20  iColumn>=0.     
2e6f0 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d      && j>=pLoop-
2e700 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
2e710 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d        && pIndex-
2e720 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
2e730 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
2e740 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
2e750 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2e760 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2e770 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2e780 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52  * Find the ORDER
2e790 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f   BY term that co
2e7a0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
2e7b0 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20   j-th column.   
2e7c0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69       ** of the i
2e7d0 6e 64 65 78 20 61 6e 64 20 61 6e 64 20 6d 61 72  ndex and and mar
2e7e0 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20  k that ORDER BY 
2e7f0 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20  term off .      
2e800 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e    */.        bOn
2e810 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
2e820 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  isMatch = 0;.   
2e830 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f       for(i=0; bO
2e840 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42  nce && i<nOrderB
2e850 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
2e860 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
2e870 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
2e880 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2e890 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
2e8a0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
2e8b0 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
2e8c0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2e8d0 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
2e8e0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
2e8f0 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20  ROUPBY );.      
2e900 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63      testcase( wc
2e910 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2e920 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20  _DISTINCTBY );. 
2e930 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63           if( (wc
2e940 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52  trlFlags & (WHER
2e950 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f  E_GROUPBY|WHERE_
2e960 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20  DISTINCTBY))==0 
2e970 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20  ) bOnce = 0;.   
2e980 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
2e990 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
2e9a0 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
2e9b0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
2e9c0 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75  xpr->iTable!=iCu
2e9d0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
2e9e0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
2e9f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  xpr->iColumn!=iC
2ea00 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
2ea10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ea20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
2ea30 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
2ea40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2ea50 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
2ea60 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
2ea70 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
2ea80 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
2ea90 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
2eaa0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
2eab0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2eac0 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
2ead0 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d  ->zName, pIndex-
2eae0 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29  >azColl[j])!=0 )
2eaf0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2eb00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2eb10 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20   isMatch = 1;.  
2eb20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2eb30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2eb40 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a   if( isMatch ){.
2eb50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
2eb60 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
2eb70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2eb80 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
2eb90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2eba0 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
2ebb0 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ns = 1;.        
2ebc0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62    }.          ob
2ebd0 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
2ebe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2ebf0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
2ec00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
2ec10 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  UPBY)==0 ){.    
2ec20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
2ec30 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72  sure the sort or
2ec40 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c  der is compatibl
2ec50 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  e in an ORDER BY
2ec60 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20   clause..       
2ec70 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64       ** Sort ord
2ec80 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74  er is irrelevant
2ec90 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20   for a GROUP BY 
2eca0 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20  clause. */.     
2ecb0 20 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65         if( revSe
2ecc0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
2ecd0 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65     if( (rev ^ re
2ece0 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d  vIdx)!=pOrderBy-
2ecf0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
2ed00 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
2ed10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76               rev
2ed30 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64   = revIdx ^ pOrd
2ed40 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
2ed50 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rder;.          
2ed60 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70      if( rev ) *p
2ed70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42  RevMask |= MASKB
2ed80 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  IT(iLoop);.     
2ed90 20 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20           revSet 
2eda0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2edb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2edc0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2edd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61          /* No ma
2ede0 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20  tch found */.   
2edf0 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20         if( j==0 
2ee00 7c 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  || j<nColumn ){.
2ee10 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2ee20 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
2ee30 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  tinct!=0 );.    
2ee40 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
2ee50 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
2ee60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ee70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2ee80 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65    }.      } /* e
2ee90 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  nd Loop over all
2eea0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a   index columns *
2eeb0 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73 74  /.      if( dist
2eec0 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20  inctColumns ){. 
2eed0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2eee0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2eef0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
2ef00 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2ef10 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2ef20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20  } /* end-if not 
2ef30 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20  one-row */..    
2ef40 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20  /* Mark off any 
2ef50 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20 74  other ORDER BY t
2ef60 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72 65  erms that refere
2ef70 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20  nce pLoop */.   
2ef80 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
2ef90 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72  inct ){.      or
2efa0 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20  derDistinctMask 
2efb0 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
2efc0 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  lf;.      for(i=
2efd0 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
2efe0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
2eff0 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69 66  r *p;.        if
2f000 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
2f010 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
2f020 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72  .        p = pOr
2f030 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2f040 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  r;.        if( (
2f050 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 26  exprTableUsage(&
2f060 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
2f070 2c 20 70 29 26 7e 6f 72 64 65 72 44 69 73 74 69  , p)&~orderDisti
2f080 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  nctMask)==0 ){. 
2f090 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
2f0a0 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
2f0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f0c0 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64      }.  } /* End
2f0d0 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61   the loop over a
2f0e0 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72  ll WhereLoops fr
2f0f0 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f  om outer-most do
2f100 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74  wn to inner-most
2f110 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d   */.  if( obSat=
2f120 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e  =obDone ) return
2f130 20 31 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64   1;.  if( !isOrd
2f140 65 72 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  erDistinct ) ret
2f150 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
2f160 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48  -1;.}..#ifdef WH
2f170 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2f180 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e  ./* For debuggin
2f190 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73  g use only: */.s
2f1a0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2f1b0 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28   *wherePathName(
2f1c0 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
2f1d0 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65  , int nLoop, Whe
2f1e0 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a  reLoop *pLast){.
2f1f0 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e    static char zN
2f200 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69  ame[65];.  int i
2f210 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2f220 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d  Loop; i++){ zNam
2f230 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c  e[i] = pPath->aL
2f240 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20  oop[i]->cId; }. 
2f250 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61   if( pLast ) zNa
2f260 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d  me[i++] = pLast-
2f270 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d  >cId;.  zName[i]
2f280 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
2f290 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
2f2a0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
2f2b0 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   list of WhereLo
2f2c0 6f 70 20 6f 62 6a 65 63 74 73 20 6f 6e 20 70 57  op objects on pW
2f2d0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68  Info->pLoops, th
2f2e0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74  is routine.** at
2f2f0 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74  tempts to find t
2f300 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
2f310 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20  ath that visits 
2f320 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a  each WhereLoop.*
2f330 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61  * once.  This pa
2f340 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65  th is then loade
2f350 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66  d into the pWInf
2f360 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69  o->a[].pWLoop fi
2f370 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75  elds..**.** Assu
2f380 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61  me that the tota
2f390 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  l number of outp
2f3a0 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  ut rows that wil
2f3b0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72  l need to be sor
2f3c0 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e  ted.** will be n
2f3d0 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31  RowEst (in the 1
2f3e0 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74  0*log2 represent
2f3f0 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e  ation).  Or, ign
2f400 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63  ore sorting.** c
2f410 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d  osts if nRowEst=
2f420 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  =0..**.** Return
2f430 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
2f440 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f  ccess or SQLITE_
2f450 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72  NOMEM of a memor
2f460 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  y allocation.** 
2f470 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
2f480 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2f490 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72  ePathSolver(Wher
2f4a0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 57  eInfo *pWInfo, W
2f4b0 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 45 73 74  hereCost nRowEst
2f4c0 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63  ){.  int mxChoic
2f4d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2f4e0 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
2f4f0 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73   of simultaneous
2f500 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a   paths tracked *
2f510 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20  /.  int nLoop;  
2f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f530 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
2f540 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   in the join */.
2f550 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
2f560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2f570 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2f580 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
2f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f5a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
2f5b0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
2f5c0 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
2f5d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2f5e0 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65  counter over the
2f5f0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f   terms of the jo
2f600 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20  in */.  int ii, 
2f610 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  jj;             
2f620 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2f630 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  rs */.  WhereCos
2f640 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20  t rCost;        
2f650 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
2f660 61 20 70 61 74 68 20 2a 2f 0a 20 20 57 68 65 72  a path */.  Wher
2f670 65 43 6f 73 74 20 6d 78 43 6f 73 74 20 3d 20 30  eCost mxCost = 0
2f680 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  ;        /* Maxi
2f690 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65  mum cost of a se
2f6a0 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20  t of paths */.  
2f6b0 57 68 65 72 65 43 6f 73 74 20 72 53 6f 72 74 43  WhereCost rSortC
2f6c0 6f 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ost;         /* 
2f6d0 43 6f 73 74 20 74 6f 20 64 6f 20 61 20 73 6f 72  Cost to do a sor
2f6e0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20  t */.  int nTo, 
2f6f0 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20  nFrom;          
2f700 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
2f710 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
2f720 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d  To[] and aFrom[]
2f730 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2f740 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20  *aFrom;         
2f750 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74  /* All nFrom pat
2f760 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f  hs at the previo
2f770 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  us level */.  Wh
2f780 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20  erePath *aTo;   
2f790 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
2f7a0 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74  To best paths at
2f7b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76   the current lev
2f7c0 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  el */.  WherePat
2f7d0 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20  h *pFrom;       
2f7e0 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
2f7f0 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20  of aFrom[] that 
2f800 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
2f810 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  n */.  WherePath
2f820 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *pTo;          
2f830 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
2f840 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20  f aTo[] that we 
2f850 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
2f860 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
2f870 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a  WLoop;        /*
2f880 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72   One of the Wher
2f890 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
2f8a0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
2f8b0 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  X;           /* 
2f8c0 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20  Used to divy up 
2f8d0 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72  the pSpace memor
2f8e0 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  y */.  char *pSp
2f8f0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
2f900 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65   /* Temporary me
2f910 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69  mory used by thi
2f920 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  s routine */..  
2f930 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
2f940 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
2f950 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c  pParse->db;.  nL
2f960 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  oop = pWInfo->nL
2f970 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e  evel;.  /* TUNIN
2f980 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75  G: For simple qu
2f990 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20  eries, only the 
2f9a0 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61  best path is tra
2f9b0 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32  cked..  ** For 2
2f9c0 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20  -way joins, the 
2f9d0 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65  5 best paths are
2f9e0 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20   followed..  ** 
2f9f0 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f  For joins of 3 o
2fa00 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74  r more tables, t
2fa10 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74  rack the 10 best
2fa20 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68   paths */.  mxCh
2fa30 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31  oice = (nLoop==1
2fa40 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d  ) ? 1 : (nLoop==
2fa50 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61  2 ? 5 : 10);.  a
2fa60 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57  ssert( nLoop<=pW
2fa70 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2fa80 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54  nSrc );.  WHERET
2fa90 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d  RACE(0x002, ("--
2faa0 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 5c  -- begin solver\
2fab0 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  n"));..  /* Allo
2fac0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
2fad0 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54  ize space for aT
2fae0 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20  o and aFrom */. 
2faf0 20 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57 68   ii = (sizeof(Wh
2fb00 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28  erePath)+sizeof(
2fb10 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f  WhereLoop*)*nLoo
2fb20 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20  p)*mxChoice*2;. 
2fb30 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65   pSpace = sqlite
2fb40 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
2fb50 20 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70 61   ii);.  if( pSpa
2fb60 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
2fb70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61  QLITE_NOMEM;.  a
2fb80 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a  To = (WherePath*
2fb90 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d  )pSpace;.  aFrom
2fba0 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b   = aTo+mxChoice;
2fbb0 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c  .  memset(aFrom,
2fbc0 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d   0, sizeof(aFrom
2fbd0 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57  [0]));.  pX = (W
2fbe0 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f  hereLoop**)(aFro
2fbf0 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66  m+mxChoice);.  f
2fc00 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32  or(ii=mxChoice*2
2fc10 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e  , pFrom=aTo; ii>
2fc20 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b  0; ii--, pFrom++
2fc30 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a  , pX += nLoop){.
2fc40 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70      pFrom->aLoop
2fc50 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = pX;.  }..  /*
2fc60 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68   Seed the search
2fc70 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57   with a single W
2fc80 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e  herePath contain
2fc90 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f  ing zero WhereLo
2fca0 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ops..  **.  ** T
2fcb0 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65  UNING: Do not le
2fcc0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2fcd0 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62  iterations go ab
2fce0 6f 76 65 20 32 35 2e 20 20 49 66 20 74 68 65 20  ove 25.  If the 
2fcf0 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d  cost.  ** of com
2fd00 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61  puting an automa
2fd10 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  tic index is not
2fd20 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69   paid back withi
2fd30 6e 20 74 68 65 20 66 69 72 73 74 20 32 35 0a 20  n the first 25. 
2fd40 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64   ** rows, then d
2fd50 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75  o not use the au
2fd60 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a  tomatic index. *
2fd70 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f  /.  aFrom[0].nRo
2fd80 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e  w = MIN(pParse->
2fd90 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29 3b  nQueryLoop, 46);
2fda0 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77 68    assert( 46==wh
2fdb0 65 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a 20  ereCost(25) );. 
2fdc0 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f   nFrom = 1;..  /
2fdd0 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68 65  * Precompute the
2fde0 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
2fdf0 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c   the final resul
2fe00 74 20 73 65 74 2c 20 69 66 20 74 68 65 20 63 61  t set, if the ca
2fe10 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c  ller.  ** to sql
2fe20 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2fe30 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20 61   was concerned a
2fe40 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a  bout sorting */.
2fe50 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b    rSortCost = 0;
2fe60 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
2fe70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52  OrderBy==0 || nR
2fe80 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  owEst==0 ){.    
2fe90 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
2fea0 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d  edValid = 1;.  }
2feb0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 55 4e  else{.    /* TUN
2fec0 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
2fed0 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 69  ost of sorting i
2fee0 73 20 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72  s N*log2(N) wher
2fef0 65 20 4e 20 69 73 20 74 68 65 0a 20 20 20 20 2a  e N is the.    *
2ff00 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  * number of outp
2ff10 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20  ut rows. */.    
2ff20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77  rSortCost = nRow
2ff30 45 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f  Est + estLog(nRo
2ff40 77 45 73 74 29 3b 0a 20 20 20 20 57 48 45 52 45  wEst);.    WHERE
2ff50 54 52 41 43 45 28 30 78 30 30 32 2c 28 22 2d 2d  TRACE(0x002,("--
2ff60 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33  -- sort cost=%-3
2ff70 64 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73 74 29  d\n", rSortCost)
2ff80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
2ff90 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c  pute successivel
2ffa0 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61  y longer WherePa
2ffb0 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72  ths using the pr
2ffc0 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f  evious generatio
2ffd0 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50  n.  ** of WhereP
2ffe0 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69  aths as the basi
2fff0 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20  s for the next. 
30000 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
30010 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a  he mxChoice.  **
30020 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65   best paths at e
30030 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ach generation *
30040 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
30050 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
30060 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20  oop++){.    nTo 
30070 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
30080 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20  0, pFrom=aFrom; 
30090 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20  ii<nFrom; ii++, 
300a0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
300b0 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66  for(pWLoop=pWInf
300c0 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f  o->pLoops; pWLoo
300d0 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70  p; pWLoop=pWLoop
300e0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
300f0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61        Bitmask ma
30100 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 42  skNew;.        B
30110 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
30120 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69   0;.        u8 i
30130 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
30140 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
30150 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 75  Valid;.        u
30160 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46  8 isOrdered = pF
30170 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a  rom->isOrdered;.
30180 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
30190 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70  oop->prereq & ~p
301a0 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21  From->maskLoop)!
301b0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
301c0 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
301d0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70  op->maskSelf & p
301e0 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21  From->maskLoop)!
301f0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
30200 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
30210 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20  s point, pWLoop 
30220 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  is a candidate t
30230 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f  o be the next lo
30240 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  op. .        ** 
30250 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74  Compute its cost
30260 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f 73   */.        rCos
30270 74 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64  t = whereCostAdd
30280 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
30290 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
302a0 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
302b0 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68 65       rCost = whe
302c0 72 65 43 6f 73 74 41 64 64 28 72 43 6f 73 74 2c  reCostAdd(rCost,
302d0 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a   pFrom->rCost);.
302e0 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20          maskNew 
302f0 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  = pFrom->maskLoo
30300 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b  p | pWLoop->mask
30310 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66  Self;.        if
30320 28 20 21 69 73 4f 72 64 65 72 65 64 56 61 6c 69  ( !isOrderedVali
30330 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
30340 77 69 74 63 68 28 20 77 68 65 72 65 50 61 74 68  witch( wherePath
30350 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
30360 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20  (pWInfo,.       
30370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30380 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
30390 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d  , pFrom, pWInfo-
303a0 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20  >wctrlFlags,.   
303b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303c0 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f      iLoop, pWLoo
303d0 70 2c 20 26 72 65 76 4d 61 73 6b 29 20 29 7b 0a  p, &revMask) ){.
303e0 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
303f0 20 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70 46   1:  /* Yes.  pF
30400 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20  rom+pWLoop does 
30410 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
30420 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
30430 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
30440 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  rdered = 1;.    
30450 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
30460 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  redValid = 1;.  
30470 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
30480 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  k;.            c
30490 61 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20  ase 0:  /* No.  
304a0 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c  pFrom+pWLoop wil
304b0 6c 20 72 65 71 75 69 72 65 20 61 20 73 65 70 61  l require a sepa
304c0 72 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20  rate sort */.   
304d0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
304e0 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  ered = 0;.      
304f0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
30500 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  dValid = 1;.    
30510 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
30520 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72  = whereCostAdd(r
30530 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73 74 29  Cost, rSortCost)
30540 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
30550 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
30560 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20 43     default: /* C
30570 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74 2e 20  annot tell yet. 
30580 20 54 72 79 20 61 67 61 69 6e 20 6f 6e 20 74 68   Try again on th
30590 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
305a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
305b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
305c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
305d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
305e0 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
305f0 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  evLoop;.        
30600 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  }.        /* Che
30610 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c  ck to see if pWL
30620 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64  oop should be ad
30630 64 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68 6f  ded to the mxCho
30640 69 63 65 20 62 65 73 74 20 73 6f 20 66 61 72 20  ice best so far 
30650 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  */.        for(j
30660 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a  j=0, pTo=aTo; jj
30670 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  <nTo; jj++, pTo+
30680 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
30690 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d  ( pTo->maskLoop=
306a0 3d 6d 61 73 6b 4e 65 77 20 26 26 20 70 54 6f 2d  =maskNew && pTo-
306b0 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3d  >isOrderedValid=
306c0 3d 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  =isOrderedValid 
306d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
306e0 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f  estcase( jj==nTo
306f0 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
30700 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
30710 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
30720 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e         if( jj>=n
30730 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  To ){.          
30740 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63  if( nTo>=mxChoic
30750 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f  e && rCost>=mxCo
30760 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  st ){.#ifdef WHE
30770 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
30780 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30790 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
307a0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
307b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
307c0 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20  bugPrintf("Skip 
307d0 20 20 25 73 20 63 6f 73 74 3d 25 33 64 20 6f 72    %s cost=%3d or
307e0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
307f0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
30800 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
30810 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
30820 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20  , rCost,.       
30830 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
30840 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f  eredValid ? (isO
30850 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
30860 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
30870 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
30880 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
30890 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
308a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   }.          /* 
308b0 41 64 64 20 61 20 6e 65 77 20 50 61 74 68 20 74  Add a new Path t
308c0 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74 20  o the aTo[] set 
308d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
308e0 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b   nTo<mxChoice ){
308f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
30900 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  Increase the siz
30910 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74  e of the aTo set
30920 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20   by one */.     
30930 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b         jj = nTo+
30940 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
30950 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
30960 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c  /* New path repl
30970 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77  aces the prior w
30980 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75  orst to keep cou
30990 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63  nt below mxChoic
309a0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
309b0 20 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31 3b 20 61   for(jj=nTo-1; a
309c0 54 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c 6d 78 43  To[jj].rCost<mxC
309d0 6f 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61 73 73 65  ost; jj--){ asse
309e0 72 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20 20 20 20  rt(jj>0); }.    
309f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30a00 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d    pTo = &aTo[jj]
30a10 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
30a20 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
30a30 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
30a40 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
30a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
30a60 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
30a70 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73  f("New    %s cos
30a80 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c  t=%-3d order=%c\
30a90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
30aa0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
30ab0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
30ac0 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a  pWLoop), rCost,.
30ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ae0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
30af0 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59   (isOrdered ? 'Y
30b00 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
30b10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
30b20 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  dif.        }els
30b30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
30b40 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f   pTo->rCost<=rCo
30b50 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  st ){.#ifdef WHE
30b60 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
30b70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30b80 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
30b90 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
30ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
30bb0 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
30bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b               "Sk
30bd0 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  ip   %s cost=%-3
30be0 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
30bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
30c00 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
30c10 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
30c20 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20  p), rCost,.     
30c30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
30c40 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69  rderedValid ? (i
30c50 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
30c60 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
30c70 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
30c80 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
30c90 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d     vs %s cost=%-
30ca0 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
30cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cc0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
30cd0 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
30ce0 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20  , pTo->rCost,.  
30cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d00 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
30d10 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72  lid ? (pTo->isOr
30d20 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
30d30 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
30d40 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
30d50 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
30d60 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74  case( pTo->rCost
30d70 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20  ==rCost );.     
30d80 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
30d90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30da0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
30db0 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
30dc0 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  st+1 );.        
30dd0 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e 64 20 62    /* A new and b
30de0 65 74 74 65 72 20 73 63 6f 72 65 20 66 6f 72 20  etter score for 
30df0 61 20 70 72 65 76 69 6f 75 73 6c 79 20 63 72 65  a previously cre
30e00 61 74 65 64 20 65 71 75 69 76 61 6c 65 6e 74 20  ated equivalent 
30e10 70 61 74 68 20 2a 2f 0a 23 69 66 64 65 66 20 57  path */.#ifdef W
30e20 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
30e30 44 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  D.          if( 
30e40 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
30e50 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
30e60 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
30e70 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
30e80 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65           "Update
30e90 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72   %s cost=%-3d or
30ea0 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
30eb0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
30ec0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
30ed0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
30ee0 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ost,.           
30ef0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
30f00 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64  lid ? (isOrdered
30f10 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
30f20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
30f30 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
30f40 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63  intf("  was %s c
30f50 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  ost=%-3d order=%
30f60 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
30f70 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
30f80 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
30f90 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
30fa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30fb0 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
30fc0 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73  Valid ? (pTo->is
30fd0 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
30fe0 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
30ff0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
31000 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31010 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61    /* pWLoop is a
31020 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74   winner.  Add it
31030 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
31040 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  est so far */.  
31050 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c        pTo->maskL
31060 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73  oop = pFrom->mas
31070 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e  kLoop | pWLoop->
31080 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20  maskSelf;.      
31090 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d    pTo->revLoop =
310a0 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20   revMask;.      
310b0 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 70 46    pTo->nRow = pF
310c0 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f  rom->nRow + pWLo
310d0 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  op->nOut;.      
310e0 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72    pTo->rCost = r
310f0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54  Cost;.        pT
31100 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
31110 64 20 3d 20 69 73 4f 72 64 65 72 65 64 56 61 6c  d = isOrderedVal
31120 69 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d  id;.        pTo-
31130 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f  >isOrdered = isO
31140 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20  rdered;.        
31150 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f  memcpy(pTo->aLoo
31160 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c  p, pFrom->aLoop,
31170 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
31180 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  p*)*iLoop);.    
31190 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69      pTo->aLoop[i
311a0 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a  Loop] = pWLoop;.
311b0 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e          if( nTo>
311c0 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20  =mxChoice ){.   
311d0 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
311e0 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20  aTo[0].rCost;.  
311f0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31          for(jj=1
31200 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a  , pTo=&aTo[1]; j
31210 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b  j<mxChoice; jj++
31220 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
31230 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72        if( pTo->r
31240 43 6f 73 74 3e 6d 78 43 6f 73 74 20 29 20 6d 78  Cost>mxCost ) mx
31250 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73  Cost = pTo->rCos
31260 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
31270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31280 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57  .    }..#ifdef W
31290 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
312a0 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
312b0 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29  3WhereTrace>=2 )
312c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
312d0 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
312e0 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20   after round %d 
312f0 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b  ----\n", iLoop);
31300 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c  .      for(ii=0,
31310 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f   pTo=aTo; ii<nTo
31320 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; ii++, pTo++){.
31330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
31340 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20  ebugPrintf(" %s 
31350 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25  cost=%-3d nrow=%
31360 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  -3d order=%c",. 
31370 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
31380 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
31390 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
313a0 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
313b0 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d  .           pTo-
313c0 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20  >isOrderedValid 
313d0 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  ? (pTo->isOrdere
313e0 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
313f0 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69   '?');.        i
31400 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  f( pTo->isOrdere
31410 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e 69  dValid && pTo->i
31420 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  sOrdered ){.    
31430 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
31440 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30  ugPrintf(" rev=0
31450 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72  x%llx\n", pTo->r
31460 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  evLoop);.       
31470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31480 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
31490 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
314a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
314b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
314c0 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65  /* Swap the role
314d0 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61  s of aFrom and a
314e0 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  To for the next 
314f0 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
31500 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20    pFrom = aTo;. 
31510 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a     aTo = aFrom;.
31520 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f      aFrom = pFro
31530 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e  m;.    nFrom = n
31540 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  To;.  }..  if( n
31550 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  From==0 ){.    s
31560 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
31570 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79  Parse, "no query
31580 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20   solution");.   
31590 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
315a0 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20  b, pSpace);.    
315b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
315c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ROR;.  }.  .  /*
315d0 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   Find the lowest
315e0 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72   cost path.  pFr
315f0 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  om will be left 
31600 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74  pointing to that
31610 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d   path */.  pFrom
31620 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 61 73 73 65   = aFrom;.  asse
31630 72 74 28 20 6e 46 72 6f 6d 3d 3d 31 20 29 3b 0a  rt( nFrom==1 );.
31640 23 69 66 20 30 20 2f 2a 20 54 68 65 20 66 6f 6c  #if 0 /* The fol
31650 6c 6f 77 69 6e 67 20 69 73 20 6e 65 65 64 65 64  lowing is needed
31660 20 69 66 20 6e 46 72 6f 6d 20 69 73 20 65 76 65   if nFrom is eve
31670 72 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 2a 2f  r more than 1 */
31680 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c  .  for(ii=1; ii<
31690 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nFrom; ii++){.  
316a0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f    if( pFrom->rCo
316b0 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f  st>aFrom[ii].rCo
316c0 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46  st ) pFrom = &aF
316d0 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 23 65 6e  rom[ii];.  }.#en
316e0 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 57  dif.  assert( pW
316f0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c  Info->nLevel==nL
31700 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64  oop );.  /* Load
31710 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
31720 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66   path into pWInf
31730 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  o */.  for(iLoop
31740 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
31750 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57   iLoop++){.    W
31760 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
31770 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20  l = pWInfo->a + 
31780 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65  iLoop;.    pLeve
31790 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f  l->pWLoop = pWLo
317a0 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  op = pFrom->aLoo
317b0 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c  p[iLoop];.    pL
317c0 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57  evel->iFrom = pW
317d0 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20  Loop->iTab;.    
317e0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
317f0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
31800 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
31810 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  rom].iCursor;.  
31820 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  }.  if( (pWInfo-
31830 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57  >wctrlFlags & (W
31840 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 7c  HERE_DISTINCTBY|
31850 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
31860 4e 43 54 29 29 0a 20 20 20 20 20 20 20 20 20 20  NCT)).          
31870 20 20 20 20 20 20 3d 3d 57 48 45 52 45 5f 57 41        ==WHERE_WA
31880 4e 54 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 26  NT_DISTINCT.   &
31890 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20  & nRowEst.  ){. 
318a0 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73     Bitmask notUs
318b0 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
318c0 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
318d0 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
318e0 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  o, pWInfo->pResu
318f0 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20  ltSet, pFrom,.  
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
31910 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c  HERE_DISTINCTBY,
31920 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
31930 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
31940 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
31950 69 66 28 20 72 63 3d 3d 31 20 29 20 70 57 49 6e  if( rc==1 ) pWIn
31960 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
31970 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
31980 52 44 45 52 45 44 3b 0a 20 20 7d 0a 20 20 69 66  RDERED;.  }.  if
31990 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  ( pFrom->isOrder
319a0 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57  ed ){.    if( pW
319b0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
319c0 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
319d0 54 42 59 20 29 7b 0a 20 20 20 20 20 20 70 57 49  TBY ){.      pWI
319e0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
319f0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
31a00 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 65 6c  ORDERED;.    }el
31a10 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  se{.      pWInfo
31a20 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20  ->bOBSat = 1;.  
31a30 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
31a40 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76  ask = pFrom->rev
31a50 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Loop;.    }.  }.
31a60 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
31a70 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b  t = pFrom->nRow;
31a80 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70  ..  /* Free temp
31a90 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64  orary memory and
31aa0 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 20   return success 
31ab0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
31ac0 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
31ad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31ae0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73  OK;.}../*.** Mos
31af0 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e  t queries use on
31b00 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
31b10 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20  e (they are not 
31b20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a  joins) and have.
31b30 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e  ** simple == con
31b40 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74  straints against
31b50 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e   indexed fields.
31b60 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
31b70 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c  ttempts.** to pl
31b80 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20  an those simple 
31b90 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68  cases using much
31ba0 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74   less ceremony t
31bb0 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72  han the.** gener
31bc0 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79  al-purpose query
31bd0 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68   planner, and th
31be0 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73 74  ereby yield fast
31bf0 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  er sqlite3_prepa
31c00 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f  re().** times fo
31c10 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
31c20 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
31c30 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63  non-zero on succ
31c40 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75 65  ess, if this que
31c50 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65  ry can be handle
31c60 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d  d by this.** no-
31c70 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61  frills query pla
31c80 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65  nner.  Return ze
31c90 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72 79  ro if this query
31ca0 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67   needs the .** g
31cb0 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
31cc0 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f  uery planner..*/
31cd0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
31ce0 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c  eShortCut(WhereL
31cf0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
31d00 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
31d10 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74  fo *pWInfo;.  st
31d20 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
31d30 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72  m *pItem;.  Wher
31d40 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20  eClause *pWC;.  
31d50 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
31d60 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
31d70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72  Loop;.  int iCur
31d80 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62  ;.  int j;.  Tab
31d90 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
31da0 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70 57  x *pIdx;.  .  pW
31db0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
31dc0 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  >pWInfo;.  if( p
31dd0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
31de0 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f  s & WHERE_FORCE_
31df0 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20 30  TABLE ) return 0
31e00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
31e10 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
31e20 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d  rc>=1 );.  pItem
31e30 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
31e40 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d  ist->a;.  pTab =
31e50 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
31e60 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
31e70 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
31e80 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e    if( pItem->zIn
31e90 64 65 78 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  dex ) return 0;.
31ea0 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
31eb0 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d  iCursor;.  pWC =
31ec0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
31ed0 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65   pLoop = pBuilde
31ee0 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70  r->pNew;.  pLoop
31ef0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ->wsFlags = 0;. 
31f00 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
31f10 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
31f20 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20   0, WO_EQ, 0);. 
31f30 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
31f40 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
31f50 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
31f60 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  EQ|WHERE_IPK|WHE
31f70 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70  RE_ONEROW;.    p
31f80 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  Loop->aLTerm[0] 
31f90 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f  = pTerm;.    pLo
31fa0 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  op->nLTerm = 1;.
31fb0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
31fc0 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
31fd0 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
31fe0 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75  of a rowid looku
31ff0 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70  p is 10 */.    p
32000 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b  Loop->rRun = 33;
32010 20 20 2f 2a 20 33 33 3d 3d 77 68 65 72 65 43 6f    /* 33==whereCo
32020 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73  st(10) */.  }els
32030 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  e{.    for(pIdx=
32040 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
32050 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
32060 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
32070 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
32080 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e  OE_None ) contin
32090 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ue;.      for(j=
320a0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
320b0 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
320c0 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
320d0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70 49  rm(pWC, iCur, pI
320e0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c  dx->aiColumn[j],
320f0 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29   0, WO_EQ, pIdx)
32100 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
32110 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
32120 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
32130 70 52 65 73 69 7a 65 28 70 57 49 6e 66 6f 2d 3e  pResize(pWInfo->
32140 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f  pParse->db, pLoo
32150 70 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 70  p, j);.        p
32160 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20  Loop->aLTerm[j] 
32170 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
32180 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49  .      if( j!=pI
32190 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f  dx->nColumn ) co
321a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c  ntinue;.      pL
321b0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
321c0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
321d0 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52  HERE_ONEROW|WHER
321e0 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
321f0 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 63 6f 6c   if( (pItem->col
32200 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
32210 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30  nIndex(pIdx))==0
32220 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   ){.        pLoo
32230 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
32240 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
32250 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f      }.      pLoo
32260 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20  p->nLTerm = j;. 
32270 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
32280 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20  ree.nEq = j;.   
32290 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
322a0 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
322b0 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
322c0 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71  : Cost of a uniq
322d0 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ue index lookup 
322e0 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70  is 15 */.      p
322f0 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b  Loop->rRun = 39;
32300 20 20 2f 2a 20 33 39 3d 3d 77 68 65 72 65 43 6f    /* 39==whereCo
32310 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20  st(15) */.      
32320 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
32330 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
32340 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f  Flags ){.    pLo
32350 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 57 68 65 72  op->nOut = (Wher
32360 65 43 6f 73 74 29 31 3b 0a 20 20 20 20 70 57 49  eCost)1;.    pWI
32370 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
32380 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   = pLoop;.    pL
32390 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20  oop->maskSelf = 
323a0 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
323b0 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >sMaskSet, iCur)
323c0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
323d0 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75  0].iTabCur = iCu
323e0 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e  r;.    pWInfo->n
323f0 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  RowOut = 1;.    
32400 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
32410 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62  erBy ) pWInfo->b
32420 4f 42 53 61 74 20 3d 20 20 31 3b 0a 20 20 20 20  OBSat =  1;.    
32430 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
32440 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
32450 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
32460 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
32470 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
32480 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
32490 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
324a0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70  LITE_DEBUG.    p
324b0 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b  Loop->cId = '0';
324c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
324d0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
324e0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
324f0 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69  enerate the begi
32500 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
32510 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45  p used for WHERE
32520 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
32530 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ng..** The retur
32540 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
32550 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75  nter to an opaqu
32560 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
32570 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66   contains.** inf
32580 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ormation needed 
32590 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
325a0 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74   loop.  Later, t
325b0 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
325c0 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76  ne.** should inv
325d0 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  oke sqlite3Where
325e0 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72  End() with the r
325f0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
32600 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
32610 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
32620 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63  lete the WHERE c
32630 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
32640 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
32650 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
32660 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
32670 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
32680 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74   basic idea is t
32690 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f  o do a nested lo
326a0 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72  op, one loop for
326b0 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a   each table in.*
326c0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
326d0 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  e of a select.  
326e0 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41  (INSERT and UPDA
326f0 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
32700 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  e the.** same as
32710 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f   a SELECT with o
32720 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
32730 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
32740 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20  lause.)  For.** 
32750 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
32760 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a  SQL is this:.**.
32770 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  **       SELECT 
32780 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
32790 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a  3 WHERE ...;.**.
327a0 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65  ** Then the code
327b0 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f   generated is co
327c0 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20  nceptually like 
327d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
327e0 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  *.**      foreac
327f0 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20  h row1 in t1 do 
32800 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
32810 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
32820 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
32830 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c   in t2 do      |
32840 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
32850 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20  reBegin().**    
32860 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
32870 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a  w3 in t3 do   /.
32880 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  **            ..
32890 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e  ..**          en
328a0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
328b0 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
328c0 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
328d0 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
328e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
328f0 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
32900 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20  reEnd().**      
32910 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
32920 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
32930 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
32940 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f  e loops might no
32950 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74  t be nested in t
32960 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
32970 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72  h they.** appear
32980 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
32990 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65  use if a differe
329a0 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74  nt order is bett
329b0 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a  er able to make.
329c0 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ** use of indice
329d0 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  s.  Note also th
329e0 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f  at when the IN o
329f0 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20  perator appears 
32a00 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
32a10 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74  clause, it might
32a20 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74   result in addit
32a30 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f  ional nested loo
32a40 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69  ps for.** scanni
32a50 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76  ng through all v
32a60 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67  alues on the rig
32a70 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
32a80 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  the IN..**.** Th
32a90 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75  ere are Btree cu
32aa0 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
32ab0 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65   with each table
32ac0 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f  .  t1 uses curso
32ad0 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62  r.** number pTab
32ae0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
32af0 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65  or.  t2 uses the
32b00 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74   cursor pTabList
32b10 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a  ->a[1].iCursor..
32b20 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** And so forth.
32b30 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67    This routine g
32b40 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
32b50 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45   open those VDBE
32b60 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20   cursors.** and 
32b70 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
32b80 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  ) generates the 
32b90 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  code to close th
32ba0 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  em..**.** The co
32bb0 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57  de that sqlite3W
32bc0 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65  hereBegin() gene
32bd0 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65  rates leaves the
32be0 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a   cursors named.*
32bf0 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f  * in pTabList po
32c00 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20  inting at their 
32c10 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
32c20 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20  ies.  The [...] 
32c30 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20  code.** can use 
32c40 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50  OP_Column and OP
32c50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f  _Rowid opcodes o
32c60 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20  n these cursors 
32c70 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61  to extract.** da
32c80 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69  ta from the vari
32c90 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ous tables of th
32ca0 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  e loop..**.** If
32cb0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
32cc0 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
32cd0 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75  foreach loops mu
32ce0 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65  st each scan the
32cf0 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62  ir.** entire tab
32d00 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72  les.  Thus a thr
32d10 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61  ee-way join is a
32d20 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69  n O(N^3) operati
32d30 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74  on.  But if.** t
32d40 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  he tables have i
32d50 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
32d60 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68   are terms in th
32d70 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
32d80 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20  hat.** refer to 
32d90 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61  those indices, a
32da0 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20   complete table 
32db0 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69  scan can be avoi
32dc0 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  ded and the.** c
32dd0 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63  ode will run muc
32de0 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20  h faster.  Most 
32df0 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  of the work of t
32e00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
32e10 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65  hecking.** to se
32e20 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  e if there are i
32e30 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20  ndices that can 
32e40 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64  be used to speed
32e50 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   up the loop..**
32e60 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65  .** Terms of the
32e70 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72   WHERE clause ar
32e80 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c  e also used to l
32e90 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20  imit which rows 
32ea0 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  actually.** make
32eb0 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22   it to the "..."
32ec0 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
32ed0 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74  f the loop.  Aft
32ee0 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68  er each "foreach
32ef0 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74  ",.** terms of t
32f00 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
32f10 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65  that use only te
32f20 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70  rms in that loop
32f30 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f   and outer.** lo
32f40 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65  ops are evaluate
32f50 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61  d and if false a
32f60 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72   jump is made ar
32f70 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75  ound all subsequ
32f80 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f  ent.** inner loo
32f90 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68  ps (or around th
32fa0 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74  e "..." if the t
32fb0 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  est occurs withi
32fc0 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20  n the inner-.** 
32fd0 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a  most loop).**.**
32fe0 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a   OUTER JOINS.**.
32ff0 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  ** An outer join
33000 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e   of tables t1 an
33010 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61  d t2 is concepta
33020 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c  lly coded as fol
33030 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  lows:.**.**    f
33040 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
33050 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61  1 do.**      fla
33060 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f  g = 0.**      fo
33070 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
33080 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74   do.**        st
33090 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  art:.**         
330a0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
330b0 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20   flag = 1.**    
330c0 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66    end.**      if
330d0 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a   flag==0 then.**
330e0 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65          move the
330f0 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20   row2 cursor to 
33100 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20  a null row.**   
33110 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a       goto start.
33120 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20  **      fi.**   
33130 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52   end.**.** ORDER
33140 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45   BY CLAUSE PROCE
33150 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64  SSING.**.** pOrd
33160 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65  erBy is a pointe
33170 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  r to the ORDER B
33180 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  Y clause of a SE
33190 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a  LECT statement,.
331a0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
331b0 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ne.  If there is
331c0 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
331d0 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  use or if this r
331e0 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
331f0 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41  led from an UPDA
33200 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
33210 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72  tement, then pOr
33220 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
33230 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
33240 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
33250 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
33260 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
33270 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
33280 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
33290 4c 69 73 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d  List,    /* FROM
332a0 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74 20   clause: A list 
332b0 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  of all tables to
332c0 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
332d0 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
332e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
332f0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
33300 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
33310 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45  By,   /* An ORDE
33320 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20  R BY clause, or 
33330 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
33340 73 74 20 2a 70 52 65 73 75 6c 74 53 65 74 2c 20  st *pResultSet, 
33350 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20 6f 66  /* Result set of
33360 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
33370 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
33380 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
33390 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67  the WHERE_* flag
333a0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
333b0 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e  iteInt.h */.  in
333c0 74 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20  t iIdxCur       
333d0 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f      /* If WHERE_
333e0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73  ONETABLE_ONLY is
333f0 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73   set, index curs
33400 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  or number */.){.
33410 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f    int nByteWInfo
33420 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
33430 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63  Num. bytes alloc
33440 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e  ated for WhereIn
33450 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69  fo struct */.  i
33460 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20  nt nTabList;    
33470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
33480 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
33490 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  in pTabList */. 
334a0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
334b0 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
334c0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
334d0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
334e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
334f0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
33500 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
33510 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
33520 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
33530 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
33540 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  y;          /* C
33550 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
33560 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e  not yet position
33570 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ed */.  WhereLoo
33580 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20  pBuilder sWLB;  
33590 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
335a0 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20  oop builder */. 
335b0 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
335c0 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54  MaskSet;    /* T
335d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
335e0 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
335f0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
33600 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
33610 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e  le level in pWIn
33620 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  fo->a[] */.  int
33630 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
33640 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
33650 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  counter */.  sql
33660 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
33670 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
33680 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
33690 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
336a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
336b0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
336c0 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  ...  /* Variable
336d0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
336e0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c  */.  memset(&sWL
336f0 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c  B, 0, sizeof(sWL
33700 42 29 29 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64  B));.  sWLB.pOrd
33710 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
33720 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
33730 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
33740 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
33750 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
33760 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
33770 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
33780 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  k .  */.  testca
33790 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  se( pTabList->nS
337a0 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28  rc==BMS );.  if(
337b0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
337c0 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  BMS ){.    sqlit
337d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
337e0 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74  e, "at most %d t
337f0 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22  ables in a join"
33800 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75  , BMS);.    retu
33810 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
33820 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  This function no
33830 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73  rmally generates
33840 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66   a nested loop f
33850 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  or all tables in
33860 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e   .  ** pTabList.
33870 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45    But if the WHE
33880 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
33890 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
338a0 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a  en we should.  *
338b0 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * only generate 
338c0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72  code for the fir
338d0 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  st table in pTab
338e0 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20  List and assume 
338f0 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75  that.  ** any cu
33900 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
33910 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74   with subsequent
33920 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e   tables are unin
33930 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
33940 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63    nTabList = (wc
33950 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
33960 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
33970 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e  ? 1 : pTabList->
33980 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  nSrc;..  /* Allo
33990 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
339a0 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
339b0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
339c0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
339d0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
339e0 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c  ue. A single all
339f0 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ocation is used 
33a00 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65  to store the Whe
33a10 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75  reInfo.  ** stru
33a20 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ct, the contents
33a30 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b   of WhereInfo.a[
33a40 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ], the WhereClau
33a50 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
33a60 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d  * and the WhereM
33a70 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
33a80 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61  . Since WhereCla
33a90 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  use contains an 
33aa0 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c  8-byte.  ** fiel
33ab0 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29  d (type Bitmask)
33ac0 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67   it must be alig
33ad0 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65  ned on an 8-byte
33ae0 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a   boundary on.  *
33af0 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74  * some architect
33b00 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ures. Hence the 
33b10 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a  ROUND8() below..
33b20 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72    */.  db = pPar
33b30 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57  se->db;.  nByteW
33b40 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69  Info = ROUND8(si
33b50 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b  zeof(WhereInfo)+
33b60 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a  (nTabList-1)*siz
33b70 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
33b80 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
33b90 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
33ba0 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20  (db, nByteWInfo 
33bb0 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  + sizeof(WhereLo
33bc0 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  op));.  if( db->
33bd0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
33be0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
33bf0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
33c00 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
33c10 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
33c20 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
33c30 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20  WInfo->nLevel = 
33c40 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  nTabList;.  pWIn
33c50 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
33c60 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
33c70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
33c80 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f  st;.  pWInfo->pO
33c90 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
33ca0 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65  y;.  pWInfo->pRe
33cb0 73 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c  sultSet = pResul
33cc0 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  tSet;.  pWInfo->
33cd0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
33ce0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
33cf0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  ;.  pWInfo->wctr
33d00 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c  lFlags = wctrlFl
33d10 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73  ags;.  pWInfo->s
33d20 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
33d30 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
33d40 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20  oop;.  pMaskSet 
33d50 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  = &pWInfo->sMask
33d60 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e  Set;.  sWLB.pWIn
33d70 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73  fo = pWInfo;.  s
33d80 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66  WLB.pWC = &pWInf
33d90 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70  o->sWC;.  sWLB.p
33da0 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70  New = (WhereLoop
33db0 2a 29 26 70 57 49 6e 66 6f 2d 3e 61 5b 6e 54 61  *)&pWInfo->a[nTa
33dc0 62 4c 69 73 74 5d 3b 0a 20 20 77 68 65 72 65 4c  bList];.  whereL
33dd0 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65  oopInit(sWLB.pNe
33de0 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  w);.#ifdef SQLIT
33df0 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70  E_DEBUG.  sWLB.p
33e00 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a  New->cId = '*';.
33e10 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 69 73  #endif..  /* Dis
33e20 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43  able the DISTINC
33e30 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  T optimization i
33e40 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  f SQLITE_Distinc
33e50 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61 0a  tOpt is set via.
33e60 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
33e70 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45  t_ctrl(SQLITE_TE
33e80 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
33e90 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69  IONS,...) */.  i
33ea0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
33eb0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
33ec0 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20  TE_DistinctOpt) 
33ed0 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67  ){.    wctrlFlag
33ee0 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54  s &= ~WHERE_WANT
33ef0 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a  _DISTINCT;.  }..
33f00 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
33f10 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
33f20 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
33f30 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
33f40 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
33f50 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
33f60 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
33f70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
33f80 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
33f90 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61  Set);.  whereCla
33fa0 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d  useInit(&pWInfo-
33fb0 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  >sWC, pWInfo);. 
33fc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
33fd0 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65  Constants(pParse
33fe0 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65  , pWhere);.  whe
33ff0 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d  reSplit(&pWInfo-
34000 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b  >sWC, pWhere, TK
34010 5f 41 4e 44 29 3b 20 20 20 2f 2a 20 49 4d 50 3a  _AND);   /* IMP:
34020 20 52 2d 31 35 38 34 32 2d 35 33 32 39 36 20 2a   R-15842-53296 *
34030 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63  /.    .  /* Spec
34040 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52  ial case: a WHER
34050 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
34060 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c   constant.  Eval
34070 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78  uate the.  ** ex
34080 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74  pression and eit
34090 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c  her jump over al
340a0 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72  l of the code or
340b0 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f   fall thru..  */
340c0 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26 26  .  if( pWhere &&
340d0 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c   (nTabList==0 ||
340e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
340f0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57  nstantNotJoin(pW
34100 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71  here)) ){.    sq
34110 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
34120 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c  (pParse, pWhere,
34130 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
34140 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
34150 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20  LL);.    pWhere 
34160 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  = 0;.  }..  /* S
34170 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20  pecial case: No 
34180 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
34190 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d  .  if( nTabList=
341a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  =0 ){.    if( pO
341b0 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d  rderBy ) pWInfo-
341c0 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20 20  >bOBSat = 1;.   
341d0 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
341e0 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
341f0 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70  TINCT ){.      p
34200 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
34210 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
34220 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  T_UNIQUE;.    }.
34230 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e    }..  /* Assign
34240 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20   a bit from the 
34250 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79  bitmask to every
34260 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
34270 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
34280 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69   ** When assigni
34290 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65  ng bitmask value
342a0 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  s to FROM clause
342b0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73   cursors, it mus
342c0 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61  t be.  ** the ca
342d0 73 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20  se that if X is 
342e0 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
342f0 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c  the N-th FROM cl
34300 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20  ause term then. 
34310 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20   ** the bitmask 
34320 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61  for all FROM cla
34330 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65  use terms to the
34340 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74   left of the N-t
34350 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28  h term.  ** is (
34360 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65  X-1).   An expre
34370 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
34380 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
34390 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a  FT JOIN can use.
343a0 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52    ** its Expr.iR
343b0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61  ightJoinTable va
343c0 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  lue to find the 
343d0 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72  bitmask of the r
343e0 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ight table.  ** 
343f0 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75  of the join.  Su
34400 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72  btracting one fr
34410 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62  om the right tab
34420 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73  le bitmask gives
34430 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20   a.  ** bitmask 
34440 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
34450 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
34460 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67  e join.  Knowing
34470 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a   the bitmask.  *
34480 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  * for all tables
34490 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
344a0 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69  a left join is i
344b0 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65  mportant.  Ticke
344c0 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20  t #3015..  **.  
344d0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74  ** Note that bit
344e0 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65  masks are create
344f0 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69  d for all pTabLi
34500 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20  st->nSrc tables 
34510 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  in.  ** pTabList
34520 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66  , not just the f
34530 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61  irst nTabList ta
34540 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20  bles.  nTabList 
34550 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a  is normally.  **
34560 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69   equal to pTabLi
34570 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67  st->nSrc but mig
34580 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20  ht be shortened 
34590 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a  to 1 if the.  **
345a0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
345b0 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
345c0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
345d0 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
345e0 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
345f0 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
34600 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
34610 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
34620 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
34630 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61  UG.  {.    Bitma
34640 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30  sk toTheLeft = 0
34650 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
34660 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
34670 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
34680 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d  Bitmask m = getM
34690 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
346a0 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
346b0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73  ursor);.      as
346c0 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54  sert( (m-1)==toT
346d0 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  heLeft );.      
346e0 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a  toTheLeft |= m;.
346f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
34700 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ..  /* Analyze a
34710 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70  ll of the subexp
34720 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20  ressions.  Note 
34730 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65  that exprAnalyze
34740 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64  () might.  ** ad
34750 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  d new virtual te
34760 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  rms onto the end
34770 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
34780 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ause.  We do not
34790 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e  .  ** want to an
347a0 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74  alyze these virt
347b0 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74  ual terms, so st
347c0 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74  art analyzing at
347d0 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e   the end.  ** an
347e0 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73  d work forward s
347f0 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64  o that the added
34800 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61   virtual terms a
34810 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73  re never process
34820 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41  ed..  */.  exprA
34830 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69  nalyzeAll(pTabLi
34840 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  st, &pWInfo->sWC
34850 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
34860 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
34870 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
34880 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Error;.  }..  /*
34890 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
348a0 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63   (or GROUP BY) c
348b0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 72  lause contains r
348c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 67 65 6e  eferences to gen
348d0 65 72 61 6c 0a 20 20 2a 2a 20 65 78 70 72 65 73  eral.  ** expres
348e0 73 69 6f 6e 73 2c 20 74 68 65 6e 20 77 65 20 77  sions, then we w
348f0 6f 6e 27 74 20 62 65 20 61 62 6c 65 20 74 6f 20  on't be able to 
34900 73 61 74 69 73 66 79 20 69 74 20 75 73 69 6e 67  satisfy it using
34910 20 69 6e 64 69 63 65 73 2c 20 73 6f 0a 20 20 2a   indices, so.  *
34920 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  * go ahead and d
34930 69 73 61 62 6c 65 20 69 74 20 6e 6f 77 2e 0a 20  isable it now.. 
34940 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
34950 42 79 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67  By && (wctrlFlag
34960 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
34970 49 53 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a 20  ISTINCT)!=0 ){. 
34980 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
34990 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
349a0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78   ii++){.      Ex
349b0 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69  pr *pExpr = sqli
349c0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
349d0 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  te(pOrderBy->a[i
349e0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
349f0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
34a00 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
34a10 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
34a20 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
34a30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
34a40 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
34a50 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
34a60 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
34a70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
34a80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
34a90 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
34aa0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
34ab0 54 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44  T ){.    if( isD
34ac0 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74  istinctRedundant
34ad0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
34ae0 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  t, &pWInfo->sWC,
34af0 20 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a   pResultSet) ){.
34b00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53        /* The DIS
34b10 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73  TINCT marking is
34b20 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e   pointless.  Ign
34b30 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ore it. */.     
34b40 20 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e   wctrlFlags &= ~
34b50 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
34b60 4e 43 54 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  NCT;.      pWInf
34b70 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
34b80 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
34b90 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  IQUE;.    }else 
34ba0 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
34bb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
34bc0 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20  to ORDER BY the 
34bd0 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61  result set to ma
34be0 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63  ke distinct proc
34bf0 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f  essing easier */
34c00 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77  .      pWInfo->w
34c10 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45  ctrlFlags |= WHE
34c20 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20  RE_DISTINCTBY;. 
34c30 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
34c40 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53  derBy = pResultS
34c50 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  et;.    }.  }.. 
34c60 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
34c70 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
34c80 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52  cts */.  WHERETR
34c90 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a  ACE(0xffff,("***
34ca0 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74   Optimizer Start
34cb0 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66 28   ***\n"));.  if(
34cc0 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20   nTabList!=1 || 
34cd0 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73  whereShortCut(&s
34ce0 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  WLB)==0 ){.    r
34cf0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
34d00 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20  All(&sWLB);.    
34d10 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
34d20 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
34d30 20 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79   .    /* Display
34d40 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72   all of the Wher
34d50 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 66  eLoop objects if
34d60 20 77 68 65 72 65 74 72 61 63 65 20 69 73 20 65   wheretrace is e
34d70 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64 65 66  nabled */.#ifdef
34d80 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
34d90 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
34da0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
34db0 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  .      WhereLoop
34dc0 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   *p;.      int i
34dd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 74   = 0;.      stat
34de0 69 63 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d  ic char zLabel[]
34df0 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62   = "0123456789ab
34e00 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
34e10 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20  stuvwyxz".      
34e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e40 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
34e50 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20  OPQRSTUVWYXZ";. 
34e60 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66       for(p=pWInf
34e70 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 3b 20 70 3d  o->pLoops; p; p=
34e80 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
34e90 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20         p->cId = 
34ea0 7a 4c 61 62 65 6c 5b 28 69 2b 2b 29 25 73 69 7a  zLabel[(i++)%siz
34eb0 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20  eof(zLabel)];.  
34ec0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
34ed0 72 69 6e 74 28 70 2c 20 70 54 61 62 4c 69 73 74  rint(p, pTabList
34ee0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
34ef0 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77  .#endif.  .    w
34f00 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70  herePathSolver(p
34f10 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69  WInfo, 0);.    i
34f20 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
34f30 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
34f40 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
34f50 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
34f60 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77  erBy ){.       w
34f70 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70  herePathSolver(p
34f80 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e  WInfo, pWInfo->n
34f90 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20  RowOut+1);.     
34fa0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
34fb0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
34fc0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
34fd0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
34fe0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d  WInfo->pOrderBy=
34ff0 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73  =0 && (db->flags
35000 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73   & SQLITE_Revers
35010 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20  eOrder)!=0 ){.  
35020 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
35030 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d  sk = (Bitmask)(-
35040 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  1);.  }.  if( pP
35050 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45  arse->nErr || NE
35060 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  VER(db->mallocFa
35070 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  iled) ){.    got
35080 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
35090 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48  r;.  }.#ifdef WH
350a0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
350b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
350c0 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
350d0 69 6e 74 20 69 69 3b 0a 20 20 20 20 73 71 6c 69  int ii;.    sqli
350e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
350f0 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52  ---- Solution nR
35100 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e  ow=%d", pWInfo->
35110 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66  nRowOut);.    if
35120 28 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74  ( pWInfo->bOBSat
35130 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
35140 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f  3DebugPrintf(" O
35150 52 44 45 52 42 59 3d 30 78 25 6c 6c 78 22 2c 20  RDERBY=0x%llx", 
35160 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29  pWInfo->revMask)
35170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
35180 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  ch( pWInfo->eDis
35190 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63  tinct ){.      c
351a0 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
351b0 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20  CT_UNIQUE: {.   
351c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
351d0 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49  gPrintf("  DISTI
351e0 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20  NCT=unique");.  
351f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35200 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
35210 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
35220 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
35230 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
35240 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
35250 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  =ordered");.    
35260 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
35270 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
35280 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
35290 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
352a0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
352b0 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
352c0 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  =unordered");.  
352d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
352e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
352f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
35300 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  f("\n");.    for
35310 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69  (ii=0; ii<nTabLi
35320 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  st; ii++){.     
35330 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
35340 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57  pWInfo->a[ii].pW
35350 4c 6f 6f 70 2c 20 70 54 61 62 4c 69 73 74 29 3b  Loop, pTabList);
35360 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
35370 66 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  f.  WHERETRACE(0
35380 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69  xffff,("*** Opti
35390 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a  mizer Finished *
353a0 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66  **\n"));.  pWInf
353b0 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  o->pParse->nQuer
353c0 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d  yLoop += pWInfo-
353d0 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20  >nRowOut;..  /* 
353e0 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
353f0 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
35400 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
35410 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
35420 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
35430 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
35440 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
35450 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
35460 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f  iate..  ** The o
35470 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
35480 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  m only works if 
35490 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
354a0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
354b0 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
354c0 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67  to update a sing
354d0 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61  le row..  */.  a
354e0 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
354f0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
35500 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
35510 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
35520 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
35530 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
35540 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
35550 29 21 3d 30 20 0a 20 20 20 26 26 20 28 70 57 49  )!=0 .   && (pWI
35560 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
35570 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
35580 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 20 29 7b 0a  E_ONEROW)!=0 ){.
35590 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e      pWInfo->okOn
355a0 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70  ePass = 1;.    p
355b0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
355c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e  op->wsFlags &= ~
355d0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
355e0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
355f0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
35600 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e   pTabList and an
35610 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74  y indices select
35620 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72  ed for.  ** sear
35630 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c  ching those tabl
35640 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
35650 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
35660 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20  ma(pParse, -1); 
35670 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f  /* Insert the co
35680 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f  okie verifier Go
35690 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  to */.  notReady
356a0 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
356b0 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76    for(ii=0, pLev
356c0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69  el=pWInfo->a; ii
356d0 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c  <nTabList; ii++,
356e0 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
356f0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
35700 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
35710 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
35720 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
35730 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
35740 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
35750 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72  index */.    str
35760 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
35770 20 2a 70 54 61 62 49 74 65 6d 3b 0a 20 20 20 20   *pTabItem;.    
35780 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
35790 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  ;..    pTabItem 
357a0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
357b0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
357c0 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74     pTab = pTabIt
357d0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44  em->pTab;.    iD
357e0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
357f0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
35800 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
35810 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
35820 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  >pWLoop;.    if(
35830 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
35840 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
35850 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
35860 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lect ){.      /*
35870 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
35880 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66     }else.#ifndef
35890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
358a0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
358b0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
358c0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
358d0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
358e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
358f0 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
35900 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
35910 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
35920 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  ;.      int iCur
35930 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
35940 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
35950 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
35960 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
35970 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34   0, 0, pVTab, P4
35980 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
35990 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
359a0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  pTab) ){.      /
359b0 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65  * noop */.    }e
359c0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
359d0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
359e0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
359f0 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
35a00 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
35a10 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
35a20 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20  N_CLOSE)==0 ){. 
35a30 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57       int op = pW
35a40 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
35a50 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a  ? OP_OpenWrite :
35a60 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
35a70 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
35a80 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
35a90 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
35aa0 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a  iDb, pTab, op);.
35ab0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
35ac0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
35ad0 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
35ae0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
35af0 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e   testcase( !pWIn
35b00 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
35b10 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
35b20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
35b30 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
35b40 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42   && pTab->nCol<B
35b50 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69  MS ){.        Bi
35b60 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74  tmask b = pTabIt
35b70 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  em->colUsed;.   
35b80 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
35b90 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b          for(; b;
35ba0 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a   b=b>>1, n++){}.
35bb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
35bc0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73  dbeChangeP4(v, s
35bd0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
35be0 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20  tAddr(v)-1, .   
35bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c00 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
35c10 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50  INT_TO_PTR(n), P
35c20 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
35c30 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
35c40 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
35c50 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
35c60 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
35c70 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
35c80 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
35c90 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
35ca0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
35cb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
35cc0 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28  IC_INDEX.    if(
35cd0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
35ce0 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
35cf0 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
35d00 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
35d10 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
35d20 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70   &pWInfo->sWC, p
35d30 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64  TabItem, notRead
35d40 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  y, pLevel);.    
35d50 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
35d60 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
35d70 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
35d80 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  XED ){.      Ind
35d90 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d  ex *pIx = pLoop-
35da0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
35db0 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
35dc0 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
35dd0 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
35de0 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 2f  e, pIx);.      /
35df0 2a 20 46 49 58 4d 45 3a 20 20 41 73 20 61 6e 20  * FIXME:  As an 
35e00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 65  optimization use
35e10 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
35e20 6f 72 20 69 66 20 57 48 45 52 45 5f 49 44 58 5f  or if WHERE_IDX_
35e30 4f 4e 4c 59 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ONLY */.      in
35e40 74 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c  t iIndexCur = pL
35e50 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
35e60 69 49 64 78 43 75 72 20 3f 20 69 49 64 78 43 75  iIdxCur ? iIdxCu
35e70 72 20 3a 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r : pParse->nTab
35e80 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
35e90 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
35ea0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
35eb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
35ec0 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
35ed0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35ee0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
35ef0 6e 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75 72  nRead, iIndexCur
35f00 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  , pIx->tnum, iDb
35f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35f20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
35f30 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
35f40 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
35f50 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
35f60 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61  , "%s", pIx->zNa
35f70 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  me));.    }.    
35f80 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
35f90 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
35fa0 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  iDb);.    notRea
35fb0 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26  dy &= ~getMask(&
35fc0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
35fd0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
35fe0 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  sor);.  }.  pWIn
35ff0 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
36000 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
36010 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
36020 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
36030 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
36040 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
36050 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
36060 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
36070 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
36080 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
36090 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
360a0 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
360b0 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
360c0 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
360d0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
360e0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
360f0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
36100 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
36110 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65  ; ii++){.    pLe
36120 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
36130 5b 69 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69  [ii];.    explai
36140 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c  nOneScan(pParse,
36150 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
36160 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  l, ii, pLevel->i
36170 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73  From, wctrlFlags
36180 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
36190 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  = codeOneLoopSta
361a0 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e  rt(pWInfo, ii, n
361b0 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
361c0 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
361d0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
361e0 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  nt;.  }..  /* Do
361f0 6e 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ne. */.  return 
36200 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
36210 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
36220 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
36230 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
36240 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
36250 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
36260 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
36270 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
36280 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
36290 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
362a0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
362b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
362c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
362d0 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
362e0 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
362f0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
36300 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
36310 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
36320 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
36330 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
36340 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
36350 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
36360 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
36370 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
36380 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
36390 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
363a0 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f  Level;.  WhereLo
363b0 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63  op *pLoop;.  Src
363c0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
363d0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
363e0 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
363f0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
36400 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
36410 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
36420 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ode..  */.  sqli
36430 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
36440 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
36450 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  (i=pWInfo->nLeve
36460 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
36470 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
36480 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
36490 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
364a0 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c  >pWLoop;.    sql
364b0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
364c0 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
364d0 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69  addrCont);.    i
364e0 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f  f( pLevel->op!=O
364f0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
36500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36510 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  2(v, pLevel->op,
36520 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
36530 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20  vel->p2);.      
36540 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
36550 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
36560 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  5);.    }.    if
36570 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
36580 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
36590 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   && pLevel->u.in
365a0 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  .nIn>0 ){.      
365b0 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
365c0 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  In;.      int j;
365d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
365e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
365f0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  , pLevel->addrNx
36600 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
36610 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
36620 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75  , pIn=&pLevel->u
36630 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d  .in.aInLoop[j-1]
36640 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d  ; j>0; j--, pIn-
36650 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -){.        sqli
36660 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
36670 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
36680 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  p+1);.        sq
36690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
366a0 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
366b0 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  Op, pIn->iCur, p
366c0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
366d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
366e0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
366f0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
36700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36710 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
36720 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
36730 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
36740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
36750 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
36760 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
36770 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
36780 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
36790 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
367a0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
367b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
367c0 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d  P_IfPos, pLevel-
367d0 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
367e0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
367f0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
36800 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
36810 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
36820 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
36830 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
36840 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
36850 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
36860 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
36870 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
36880 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
36890 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
368a0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
368b0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
368c0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
368d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
368e0 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
368f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36900 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
36910 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
36920 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
36930 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
36940 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20  ->op==OP_Return 
36950 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
36960 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
36970 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c  OP_Gosub, pLevel
36980 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  ->p1, pLevel->ad
36990 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
369a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
369b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
369c0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
369d0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
369e0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
369f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
36a00 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
36a10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
36a20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e  The "break" poin
36a30 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20  t is here, just 
36a40 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
36a50 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
36a60 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a    ** Set it..  *
36a70 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
36a80 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
36a90 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
36aa0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
36ab0 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
36ac0 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20  hat were opened 
36ad0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
36ae0 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  egin..  */.  ass
36af0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ert( pWInfo->nLe
36b00 76 65 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f  vel==1 || pWInfo
36b10 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69  ->nLevel==pTabLi
36b20 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f  st->nSrc );.  fo
36b30 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
36b40 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66  Info->a; i<pWInf
36b50 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20  o->nLevel; i++, 
36b60 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49  pLevel++){.    I
36b70 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a  ndex *pIdx = 0;.
36b80 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
36b90 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
36ba0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
36bb0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
36bc0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
36bd0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
36be0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
36bf0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c  Tab!=0 );.    pL
36c00 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
36c10 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70  Loop;.    if( (p
36c20 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
36c30 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
36c40 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70  .     && pTab->p
36c50 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26  Select==0.     &
36c60 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
36c70 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
36c80 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
36c90 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
36ca0 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  nt ws = pLoop->w
36cb0 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66  sFlags;.      if
36cc0 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
36cd0 50 61 73 73 20 26 26 20 28 77 73 20 26 20 57 48  Pass && (ws & WH
36ce0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
36cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
36d00 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
36d10 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49   OP_Close, pTabI
36d20 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
36d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
36d40 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44   (ws & WHERE_IND
36d50 45 58 45 44 29 21 3d 30 20 26 26 20 28 77 73 20  EXED)!=0 && (ws 
36d60 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  & (WHERE_IPK|WHE
36d70 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 29 3d  RE_TEMP_INDEX))=
36d80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
36d90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
36da0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65  v, OP_Close, pLe
36db0 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
36dc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
36dd0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61    /* If this sca
36de0 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c  n uses an index,
36df0 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65 20   make VDBE code 
36e00 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f  substitutions to
36e10 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a   read data.    *
36e20 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  * from the index
36e30 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f 6d   instead of from
36e40 20 74 68 65 20 74 61 62 6c 65 20 77 68 65 72 65   the table where
36e50 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20 73   possible.  In s
36e60 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a 2a  ome cases.    **
36e70 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
36e80 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  on prevents the 
36e90 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72 20  table from ever 
36ea0 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69 63  being read, whic
36eb0 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65  h can.    ** yie
36ec0 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74  ld a significant
36ed0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
36ee0 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  st..    ** .    
36ef0 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20  ** Calls to the 
36f00 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
36f10 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65  n between sqlite
36f20 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a  3WhereBegin and.
36f30 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68      ** sqlite3Wh
36f40 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65  ereEnd will have
36f50 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68   created code th
36f60 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  at references th
36f70 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64  e table.    ** d
36f80 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c  irectly.  This l
36f90 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68  oop scans all th
36fa0 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20  at code looking 
36fb0 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20  for opcodes.    
36fc0 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ** that referenc
36fd0 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  e the table and 
36fe0 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e  converts them in
36ff0 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a  to opcodes that.
37000 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
37010 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
37020 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  */.    if( pLoop
37030 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
37040 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45  RE_INDEXED|WHERE
37050 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20  _IDX_ONLY) ){.  
37060 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70      pIdx = pLoop
37070 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
37080 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
37090 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
370a0 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
370b0 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  ){.      pIdx = 
370c0 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
370d0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
370e0 20 70 49 64 78 20 26 26 20 21 64 62 2d 3e 6d 61   pIdx && !db->ma
370f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
37100 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61      int k, j, la
37110 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  st;.      VdbeOp
37120 20 2a 70 4f 70 3b 0a 0a 20 20 20 20 20 20 70 4f   *pOp;..      pO
37130 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
37140 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  etOp(v, pWInfo->
37150 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73  iTop);.      las
37160 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
37170 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
37180 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66       for(k=pWInf
37190 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b  o->iTop; k<last;
371a0 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   k++, pOp++){.  
371b0 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
371c0 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  1!=pLevel->iTabC
371d0 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
371e0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
371f0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
37200 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  n ){.          f
37210 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
37220 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
37230 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
37240 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69  Op->p2==pIdx->ai
37250 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20  Column[j] ){.   
37260 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
37270 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  p2 = j;.        
37280 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
37290 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
372a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
372b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
372c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
372d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
372e0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
372f0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
37300 4c 59 29 3d 3d 30 20 7c 7c 20 6a 3c 70 49 64 78  LY)==0 || j<pIdx
37310 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ->nColumn );.   
37320 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
37330 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
37340 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
37350 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
37360 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
37370 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
37380 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
37390 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
373a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
373b0 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75   /* Final cleanu
373c0 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  p.  */.  pParse-
373d0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
373e0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
373f0 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e  yLoop;.  whereIn
37400 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
37410 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  o);.  return;.}.