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

Artifact 7d406cca2f60afbbfb57470f0d4981798bccf6e8:


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 64 0a 2a 2a 20 6c 6f 6f 70 20  e nestd.** loop 
09f0: 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  in WHERE clause.
0a00: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 74 72 61 73 74 20  .**.** Contrast 
0a10: 74 68 69 73 20 6f 62 6a 65 63 74 20 77 69 74 68  this object with
0a20: 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 54 68 69   WhereLoop.  Thi
0a30: 73 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62  s object describ
0a40: 65 73 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  es the.** implem
0a50: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
0a60: 6c 6f 6f 70 2e 20 20 57 68 65 72 65 4c 6f 6f 70  loop.  WhereLoop
0a70: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 61   describes the a
0a80: 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 20 54 68 69  lgorithm..** Thi
0a90: 73 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  s object contain
0aa0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
0ab0: 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 61 6c 67  he WhereLoop alg
0ac0: 6f 72 69 74 68 6d 20 61 73 20 6f 6e 65 20 6f 66  orithm as one of
0ad0: 0a 2a 2a 20 69 74 73 20 65 6c 65 6d 65 6e 74 73  .** its elements
0ae0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 57 68 65 72  ..**.** The Wher
0af0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e  eInfo object con
0b00: 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 69  tains a single i
0b10: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
0b20: 6f 62 6a 65 63 74 20 66 6f 72 0a 2a 2a 20 65 61  object for.** ea
0b30: 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ch term in the F
0b40: 52 4f 4d 20 63 6c 61 75 73 65 20 28 77 68 69 63  ROM clause (whic
0b50: 68 20 69 73 20 74 6f 20 73 61 79 2c 20 66 6f 72  h is to say, for
0b60: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
0b70: 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 61 73 20  nested loops as 
0b80: 69 6d 70 6c 65 6d 65 6e 74 65 64 29 2e 20 20 54  implemented).  T
0b90: 68 65 20 6f 72 64 65 72 20 6f 66 20 57 68 65 72  he order of Wher
0ba0: 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20 64  eLevel objects d
0bb0: 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 74 68 65  etermines.** the
0bc0: 20 6c 6f 6f 70 20 6e 65 73 74 65 64 20 6f 72 64   loop nested ord
0bd0: 65 72 2c 20 77 69 74 68 20 57 68 65 72 65 49 6e  er, with WhereIn
0be0: 66 6f 2e 61 5b 30 5d 20 62 65 69 6e 67 20 74 68  fo.a[0] being th
0bf0: 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 61 6e 64  e outer loop and
0c00: 0a 2a 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b  .** WhereInfo.a[
0c10: 57 68 65 72 65 49 6e 66 6f 2e 6e 4c 65 76 65 6c  WhereInfo.nLevel
0c20: 2d 31 5d 20 62 65 69 6e 67 20 74 68 65 20 69 6e  -1] being the in
0c30: 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74 72  ner loop..*/.str
0c40: 75 63 74 20 57 68 65 72 65 4c 65 76 65 6c 20 7b  uct WhereLevel {
0c50: 0a 20 20 69 6e 74 20 69 4c 65 66 74 4a 6f 69 6e  .  int iLeftJoin
0c60: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f  ;        /* Memo
0c70: 72 79 20 63 65 6c 6c 20 75 73 65 64 20 74 6f 20  ry cell used to 
0c80: 69 6d 70 6c 65 6d 65 6e 74 20 4c 45 46 54 20 4f  implement LEFT O
0c90: 55 54 45 52 20 4a 4f 49 4e 20 2a 2f 0a 20 20 69  UTER JOIN */.  i
0ca0: 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20 20  nt iTabCur;     
0cb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
0cc0: 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   cursor used to 
0cd0: 61 63 63 65 73 73 20 74 68 65 20 74 61 62 6c 65  access the table
0ce0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
0cf0: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r;          /* T
0d00: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 75  he VDBE cursor u
0d10: 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 70 49  sed to access pI
0d20: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  dx */.  int addr
0d30: 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Brk;          /*
0d40: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
0d50: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  eak out of the l
0d60: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
0d70: 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 20 2f  rNxt;          /
0d80: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
0d90: 74 61 72 74 20 74 68 65 20 6e 65 78 74 20 49 4e  tart the next IN
0da0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 2a 2f 0a   combination */.
0db0: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20    int addrCont; 
0dc0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
0dd0: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
0de0: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 6c   with the next l
0df0: 6f 6f 70 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  oop cycle */.  i
0e00: 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20 20  nt addrFirst;   
0e10: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e       /* First in
0e20: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 69 6e 74  struction of int
0e30: 65 72 69 6f 72 20 6f 66 20 74 68 65 20 6c 6f 6f  erior of the loo
0e40: 70 20 2a 2f 0a 20 20 75 38 20 69 46 72 6f 6d 3b  p */.  u8 iFrom;
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0e60: 57 68 69 63 68 20 65 6e 74 72 79 20 69 6e 20 74  Which entry in t
0e70: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
0e80: 2f 0a 20 20 75 38 20 6f 70 2c 20 70 35 3b 20 20  /.  u8 op, p5;  
0e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
0ea0: 6f 64 65 20 61 6e 64 20 50 35 20 6f 66 20 74 68  ode and P5 of th
0eb0: 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 65 6e  e opcode that en
0ec0: 64 73 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  ds the loop */. 
0ed0: 20 69 6e 74 20 70 31 2c 20 70 32 3b 20 20 20 20   int p1, p2;    
0ee0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 6e         /* Operan
0ef0: 64 73 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  ds of the opcode
0f00: 20 75 73 65 64 20 74 6f 20 65 6e 64 73 20 74 68   used to ends th
0f10: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 6e 69 6f  e loop */.  unio
0f20: 6e 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  n {             
0f30: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
0f40: 20 74 68 61 74 20 64 65 70 65 6e 64 73 20 6f 6e   that depends on
0f50: 20 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   pWLoop->wsFlags
0f60: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 7b   */.    struct {
0f70: 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 6e 3b 20  .      int nIn; 
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f90: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
0fa0: 73 20 69 6e 20 61 49 6e 4c 6f 6f 70 5b 5d 20 2a  s in aInLoop[] *
0fb0: 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49  /.      struct I
0fc0: 6e 4c 6f 6f 70 20 7b 0a 20 20 20 20 20 20 20 20  nLoop {.        
0fd0: 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
0fe0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
0ff0: 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 20 62  BE cursor used b
1000: 79 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74  y this IN operat
1010: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  or */.        in
1020: 74 20 61 64 64 72 49 6e 54 6f 70 3b 20 20 20 20  t addrInTop;    
1030: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
1040: 68 65 20 49 4e 20 6c 6f 6f 70 20 2a 2f 0a 20 20  he IN loop */.  
1050: 20 20 20 20 20 20 75 38 20 65 45 6e 64 4c 6f 6f        u8 eEndLoo
1060: 70 4f 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  pOp;         /* 
1070: 49 4e 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  IN Loop terminat
1080: 6f 72 2e 20 4f 50 5f 4e 65 78 74 20 6f 72 20 4f  or. OP_Next or O
1090: 50 5f 50 72 65 76 20 2a 2f 0a 20 20 20 20 20 20  P_Prev */.      
10a0: 7d 20 2a 61 49 6e 4c 6f 6f 70 3b 20 20 20 20 20  } *aInLoop;     
10b0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
10c0: 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20  tion about each 
10d0: 6e 65 73 74 65 64 20 49 4e 20 6f 70 65 72 61 74  nested IN operat
10e0: 6f 72 20 2a 2f 0a 20 20 20 20 7d 20 69 6e 3b 20  or */.    } in; 
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 2f 2a 20 55 73 65 64 20 77 68 65 6e 20 70 57 4c  /* Used when pWL
1110: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
1120: 52 45 5f 49 4e 5f 41 42 4c 45 20 2a 2f 0a 20 20  RE_IN_ABLE */.  
1130: 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 69 64 78    Index *pCovidx
1140: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69  ;       /* Possi
1150: 62 6c 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ble covering ind
1160: 65 78 20 66 6f 72 20 57 48 45 52 45 5f 4d 55 4c  ex for WHERE_MUL
1170: 54 49 5f 4f 52 20 2a 2f 0a 20 20 7d 20 75 3b 0a  TI_OR */.  } u;.
1180: 20 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f    struct WhereLo
1190: 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 2f 2a 20  op *pWLoop;  /* 
11a0: 54 68 65 20 73 65 6c 65 63 74 65 64 20 57 68 65  The selected Whe
11b0: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
11c0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .};../*.** Each 
11d0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
11e0: 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
11f0: 74 73 20 61 6e 20 61 6c 67 6f 72 69 74 68 6d 20  ts an algorithm 
1200: 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 6f  for evaluating o
1210: 6e 65 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 61 20  ne.** term of a 
1220: 6a 6f 69 6e 2e 20 20 45 76 65 72 79 20 74 65 72  join.  Every ter
1230: 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
1240: 61 75 73 65 20 77 69 6c 6c 20 68 61 76 65 20 61  ause will have a
1250: 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63  t least.** one c
1260: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
1270: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 28 75  reLoop object (u
1280: 6e 6c 65 73 73 20 49 4e 44 45 58 45 44 20 42 59  nless INDEXED BY
1290: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
12a0: 70 72 65 76 65 6e 74 20 61 20 71 75 65 72 79 20  prevent a query 
12b0: 73 6f 6c 75 74 69 6f 6e 20 2d 20 77 68 69 63 68  solution - which
12c0: 20 69 73 20 61 6e 20 65 72 72 6f 72 29 20 61 6e   is an error) an
12d0: 64 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  d many terms of 
12e0: 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
12f0: 73 65 20 77 69 6c 6c 20 68 61 76 65 20 6d 75 6c  se will have mul
1300: 74 69 70 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20  tiple WhereLoop 
1310: 6f 62 6a 65 63 74 73 2c 20 65 61 63 68 20 64 65  objects, each de
1320: 73 63 72 69 62 69 6e 67 20 61 0a 2a 2a 20 70 6f  scribing a.** po
1330: 74 65 6e 74 69 61 6c 20 77 61 79 20 6f 66 20 69  tential way of i
1340: 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74  mplementing that
1350: 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
1360: 6d 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  m, together with
1370: 0a 2a 2a 20 64 65 70 65 6e 64 65 6e 63 69 65 73  .** dependencies
1380: 20 61 6e 64 20 63 6f 73 74 20 65 73 74 69 6d 61   and cost estima
1390: 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68  tes for using th
13a0: 65 20 63 68 6f 73 65 6e 20 61 6c 67 6f 72 69 74  e chosen algorit
13b0: 68 6d 2e 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20  hm..**.** Query 
13c0: 70 6c 61 6e 6e 69 6e 67 20 63 6f 6e 73 69 73 74  planning consist
13d0: 73 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 75 70  s of building up
13e0: 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66   a collection of
13f0: 20 74 68 65 73 65 20 57 68 65 72 65 4c 6f 6f 70   these WhereLoop
1400: 0a 2a 2a 20 6f 62 6a 65 63 74 73 2c 20 74 68 65  .** objects, the
1410: 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61 20 70 61  n computing a pa
1420: 72 74 69 63 75 6c 61 72 20 73 65 71 75 65 6e 63  rticular sequenc
1430: 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  e of WhereLoop o
1440: 62 6a 65 63 74 73 2c 20 77 69 74 68 0a 2a 2a 20  bjects, with.** 
1450: 6f 6e 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  one WhereLoop ob
1460: 6a 65 63 74 20 70 65 72 20 46 52 4f 4d 20 63 6c  ject per FROM cl
1470: 61 75 73 65 20 74 65 72 6d 2c 20 74 68 61 74 20  ause term, that 
1480: 73 61 74 69 73 66 79 20 61 6c 6c 20 64 65 70 65  satisfy all depe
1490: 6e 64 65 6e 63 69 65 73 0a 2a 2a 20 61 6e 64 20  ndencies.** and 
14a0: 74 68 61 74 20 6d 69 6e 69 6d 69 7a 65 20 74 68  that minimize th
14b0: 65 20 6f 76 65 72 61 6c 6c 20 63 6f 73 74 2e 0a  e overall cost..
14c0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4c  */.struct WhereL
14d0: 6f 6f 70 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20  oop {.  Bitmask 
14e0: 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 2f 2a  prereq;       /*
14f0: 20 42 69 74 6d 61 73 6b 20 6f 66 20 6f 74 68 65   Bitmask of othe
1500: 72 20 6c 6f 6f 70 73 20 74 68 61 74 20 6d 75 73  r loops that mus
1510: 74 20 72 75 6e 20 66 69 72 73 74 20 2a 2f 0a 20  t run first */. 
1520: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 65 6c   Bitmask maskSel
1530: 66 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  f;     /* Bitmas
1540: 6b 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74 61  k identifying ta
1550: 62 6c 65 20 69 54 61 62 20 2a 2f 0a 23 69 66 64  ble iTab */.#ifd
1560: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1570: 20 20 63 68 61 72 20 63 49 64 3b 20 20 20 20 20    char cId;     
1580: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f          /* Symbo
1590: 6c 69 63 20 49 44 20 6f 66 20 74 68 69 73 20 6c  lic ID of this l
15a0: 6f 6f 70 20 66 6f 72 20 64 65 62 75 67 67 69 6e  oop for debuggin
15b0: 67 20 75 73 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  g use */.#endif.
15c0: 20 20 75 38 20 69 54 61 62 3b 20 20 20 20 20 20    u8 iTab;      
15d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
15e0: 69 6f 6e 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  ion in FROM clau
15f0: 73 65 20 6f 66 20 74 61 62 6c 65 20 66 6f 72 20  se of table for 
1600: 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75  this loop */.  u
1610: 38 20 69 53 6f 72 74 49 64 78 3b 20 20 20 20 20  8 iSortIdx;     
1620: 20 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20       /* Sorting 
1630: 69 6e 64 65 78 20 6e 75 6d 62 65 72 2e 20 20 30  index number.  0
1640: 3d 3d 4e 6f 6e 65 20 2a 2f 0a 20 20 57 68 65 72  ==None */.  Wher
1650: 65 43 6f 73 74 20 72 53 65 74 75 70 3b 20 20 20  eCost rSetup;   
1660: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 73 65    /* One-time se
1670: 74 75 70 20 63 6f 73 74 20 28 65 78 3a 20 63 72  tup cost (ex: cr
1680: 65 61 74 65 20 74 72 61 6e 73 69 65 6e 74 20 69  eate transient i
1690: 6e 64 65 78 29 20 2a 2f 0a 20 20 57 68 65 72 65  ndex) */.  Where
16a0: 43 6f 73 74 20 72 52 75 6e 3b 20 20 20 20 20 20  Cost rRun;      
16b0: 20 2f 2a 20 43 6f 73 74 20 6f 66 20 72 75 6e 6e   /* Cost of runn
16c0: 69 6e 67 20 65 61 63 68 20 6c 6f 6f 70 20 2a 2f  ing each loop */
16d0: 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e 4f 75  .  WhereCost nOu
16e0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69  t;       /* Esti
16f0: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
1700: 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20  output rows */. 
1710: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72   union {.    str
1720: 75 63 74 20 7b 20 20 20 20 20 20 20 20 20 20 20  uct {           
1730: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1740: 6f 6e 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  on for internal 
1750: 62 74 72 65 65 20 74 61 62 6c 65 73 20 2a 2f 0a  btree tables */.
1760: 20 20 20 20 20 20 69 6e 74 20 6e 45 71 3b 20 20        int nEq;  
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1780: 4e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  Number of equali
1790: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ty constraints *
17a0: 2f 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  /.      Index *p
17b0: 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 2f  Index;         /
17c0: 2a 20 49 6e 64 65 78 20 75 73 65 64 2c 20 6f 72  * Index used, or
17d0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 7d 20 62   NULL */.    } b
17e0: 74 72 65 65 3b 0a 20 20 20 20 73 74 72 75 63 74  tree;.    struct
17f0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
1800: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
1810: 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  for virtual tabl
1820: 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
1830: 69 64 78 4e 75 6d 3b 20 20 20 20 20 20 20 20 20  idxNum;         
1840: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62     /* Index numb
1850: 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6e  er */.      u8 n
1860: 65 65 64 46 72 65 65 3b 20 20 20 20 20 20 20 20  eedFree;        
1870: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 71     /* True if sq
1880: 6c 69 74 65 33 5f 66 72 65 65 28 69 64 78 53 74  lite3_free(idxSt
1890: 72 29 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a  r) is needed */.
18a0: 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72        u8 isOrder
18b0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
18c0: 54 72 75 65 20 69 66 20 73 61 74 69 73 66 69 65  True if satisfie
18d0: 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  s ORDER BY */.  
18e0: 20 20 20 20 75 31 36 20 6f 6d 69 74 4d 61 73 6b      u16 omitMask
18f0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
1900: 72 6d 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  rms that may be 
1910: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 20 20 20  omitted */.     
1920: 20 63 68 61 72 20 2a 69 64 78 53 74 72 3b 20 20   char *idxStr;  
1930: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1940: 20 69 64 65 6e 74 69 66 69 65 72 20 73 74 72 69   identifier stri
1950: 6e 67 20 2a 2f 0a 20 20 20 20 7d 20 76 74 61 62  ng */.    } vtab
1960: 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 77  ;.  } u;.  u32 w
1970: 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
1980: 20 2f 2a 20 57 48 45 52 45 5f 2a 20 66 6c 61 67   /* WHERE_* flag
1990: 73 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  s describing the
19a0: 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20 6e   plan */.  u16 n
19b0: 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  LTerm;          
19c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
19d0: 74 72 69 65 73 20 69 6e 20 61 4c 54 65 72 6d 5b  tries in aLTerm[
19e0: 5d 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a 20 77 68 65  ] */.  /**** whe
19f0: 72 65 4c 6f 6f 70 58 66 65 72 28 29 20 63 6f 70  reLoopXfer() cop
1a00: 69 65 73 20 66 69 65 6c 64 73 20 61 62 6f 76 65  ies fields above
1a10: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1a20: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 20 64 65 66 69  ********/.# defi
1a30: 6e 65 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46  ne WHERE_LOOP_XF
1a40: 45 52 5f 53 5a 20 6f 66 66 73 65 74 6f 66 28 57  ER_SZ offsetof(W
1a50: 68 65 72 65 4c 6f 6f 70 2c 6e 4c 53 6c 6f 74 29  hereLoop,nLSlot)
1a60: 0a 20 20 75 31 36 20 6e 4c 53 6c 6f 74 3b 20 20  .  u16 nLSlot;  
1a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a80: 65 72 20 6f 66 20 73 6c 6f 74 73 20 61 6c 6c 6f  er of slots allo
1a90: 63 61 74 65 64 20 66 6f 72 20 61 4c 54 65 72 6d  cated for aLTerm
1aa0: 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  [] */.  WhereTer
1ab0: 6d 20 2a 2a 61 4c 54 65 72 6d 3b 20 20 20 2f 2a  m **aLTerm;   /*
1ac0: 20 57 68 65 72 65 54 65 72 6d 73 20 75 73 65 64   WhereTerms used
1ad0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
1ae0: 2a 70 4e 65 78 74 4c 6f 6f 70 3b 20 2f 2a 20 4e  *pNextLoop; /* N
1af0: 65 78 74 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ext WhereLoop ob
1b00: 6a 65 63 74 20 69 6e 20 74 68 65 20 57 68 65 72  ject in the Wher
1b10: 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65  eClause */.  Whe
1b20: 72 65 54 65 72 6d 20 2a 61 4c 54 65 72 6d 53 70  reTerm *aLTermSp
1b30: 61 63 65 5b 34 5d 3b 20 20 2f 2a 20 49 6e 69 74  ace[4];  /* Init
1b40: 69 61 6c 20 61 4c 54 65 72 6d 5b 5d 20 73 70 61  ial aLTerm[] spa
1b50: 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 46 6f 72  ce */.};../* For
1b60: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1b70: 20 6f 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73   of methods */.s
1b80: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1b90: 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65  oopResize(sqlite
1ba0: 33 2a 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20  3*, WhereLoop*, 
1bb0: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  int);../*.** Eac
1bc0: 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
1bd0: 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20  is object holds 
1be0: 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 57 68  a sequence of Wh
1bf0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 0a  ereLoop objects.
1c00: 2a 2a 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ** that implemen
1c10: 74 20 73 6f 6d 65 20 6f 72 20 61 6c 6c 20 6f 66  t some or all of
1c20: 20 61 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a   a query plan..*
1c30: 2a 0a 2a 2a 20 54 68 69 6e 6b 20 6f 66 20 65 61  *.** Think of ea
1c40: 63 68 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ch WhereLoop obj
1c50: 65 63 74 73 20 61 73 20 61 20 6e 6f 64 65 20 69  ects as a node i
1c60: 6e 20 61 20 67 72 61 70 68 2c 20 77 68 69 63 68  n a graph, which
1c70: 20 61 72 63 73 0a 2a 2a 20 73 68 6f 77 69 6e 67   arcs.** showing
1c80: 20 64 65 70 65 6e 64 65 6e 63 65 73 20 61 6e 64   dependences and
1c90: 20 63 6f 73 74 73 20 66 6f 72 20 74 72 61 76 65   costs for trave
1ca0: 6c 6c 69 6e 67 20 62 65 74 77 65 65 6e 20 6e 6f  lling between no
1cb0: 64 65 73 2e 20 20 28 54 68 61 74 20 69 73 0a 2a  des.  (That is.*
1cc0: 2a 20 6e 6f 74 20 61 20 63 6f 6d 70 6c 65 74 65  * not a complete
1cd0: 6c 79 20 61 63 63 75 72 61 74 65 20 64 65 73 63  ly accurate desc
1ce0: 72 69 70 74 69 6f 6e 20 62 65 63 61 75 73 65 20  ription because 
1cf0: 57 68 65 72 65 4c 6f 6f 70 20 63 6f 73 74 73 20  WhereLoop costs 
1d00: 61 72 65 20 61 0a 2a 2a 20 76 65 63 74 6f 72 2c  are a.** vector,
1d10: 20 6e 6f 74 20 61 20 73 63 61 6c 61 72 2c 20 61   not a scalar, a
1d20: 6e 64 20 62 65 63 61 75 73 65 20 64 65 70 65 6e  nd because depen
1d30: 64 65 6e 63 65 73 20 61 72 65 20 6d 61 6e 79 2d  dences are many-
1d40: 74 6f 2d 6f 6e 65 2c 20 6e 6f 74 0a 2a 2a 20 6f  to-one, not.** o
1d50: 6e 65 2d 74 6f 2d 6f 6e 65 20 61 73 20 61 72 65  ne-to-one as are
1d60: 20 67 72 61 70 68 20 6e 6f 64 65 73 2e 20 20 42   graph nodes.  B
1d70: 75 74 20 69 74 20 69 73 20 61 20 75 73 65 66 75  ut it is a usefu
1d80: 6c 20 76 69 73 75 61 6c 69 7a 61 74 69 6f 6e 20  l visualization 
1d90: 61 69 64 2e 29 0a 2a 2a 20 54 68 65 6e 20 61 20  aid.).** Then a 
1da0: 57 68 65 72 65 50 61 74 68 20 6f 62 6a 65 63 74  WherePath object
1db0: 20 69 73 20 61 20 70 61 74 68 20 74 68 72 6f 75   is a path throu
1dc0: 67 68 20 74 68 65 20 67 72 61 70 68 20 74 68 61  gh the graph tha
1dd0: 74 20 76 69 73 69 74 73 20 73 6f 6d 65 0a 2a 2a  t visits some.**
1de0: 20 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 57   or all of the W
1df0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1e00: 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   once..**.** The
1e10: 20 22 73 6f 6c 76 65 72 22 20 77 6f 72 6b 73 20   "solver" works 
1e20: 62 79 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  by creating the 
1e30: 4e 20 62 65 73 74 20 57 68 65 72 65 50 61 74 68  N best WherePath
1e40: 20 6f 62 6a 65 63 74 73 20 6f 66 20 6c 65 6e 67   objects of leng
1e50: 74 68 0a 2a 2a 20 31 2e 20 20 54 68 65 6e 20 75  th.** 1.  Then u
1e60: 73 69 6e 67 20 74 68 6f 73 65 20 61 73 20 61 20  sing those as a 
1e70: 62 61 73 69 73 20 74 6f 20 63 6f 6d 70 75 74 65  basis to compute
1e80: 20 74 68 65 20 4e 20 62 65 73 74 20 57 68 65 72   the N best Wher
1e90: 65 50 61 74 68 20 6f 62 6a 65 63 74 73 0a 2a 2a  ePath objects.**
1ea0: 20 6f 66 20 6c 65 6e 67 74 68 20 32 2e 20 20 41   of length 2.  A
1eb0: 6e 64 20 73 6f 20 66 6f 72 74 68 20 75 6e 74 69  nd so forth unti
1ec0: 6c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  l the length of 
1ed0: 57 68 65 72 65 50 61 74 68 73 20 65 71 75 61 6c  WherePaths equal
1ee0: 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
1ef0: 6f 66 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20  of nodes in the 
1f00: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
1f10: 65 20 62 65 73 74 20 28 6c 6f 77 65 73 74 20 63  e best (lowest c
1f20: 6f 73 74 29 20 57 68 65 72 65 50 61 74 68 0a 2a  ost) WherePath.*
1f30: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 69 73 20  * at the end is 
1f40: 74 68 65 20 63 68 6f 6f 73 65 6e 20 71 75 65 72  the choosen quer
1f50: 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 73 74 72 75 63  y plan..*/.struc
1f60: 74 20 57 68 65 72 65 50 61 74 68 20 7b 0a 20 20  t WherePath {.  
1f70: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4c 6f 6f 70  Bitmask maskLoop
1f80: 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b  ;     /* Bitmask
1f90: 20 6f 66 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f   of all WhereLoo
1fa0: 70 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 69  p objects in thi
1fb0: 73 20 70 61 74 68 20 2a 2f 0a 20 20 42 69 74 6d  s path */.  Bitm
1fc0: 61 73 6b 20 72 65 76 4c 6f 6f 70 3b 20 20 20 20  ask revLoop;    
1fd0: 20 20 2f 2a 20 61 4c 6f 6f 70 5b 5d 73 20 74 68    /* aLoop[]s th
1fe0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 76  at should be rev
1ff0: 65 72 73 65 64 20 66 6f 72 20 4f 52 44 45 52 20  ersed for ORDER 
2000: 42 59 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  BY */.  WhereCos
2010: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 2f 2a  t nRow;       /*
2020: 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
2030: 72 20 6f 66 20 72 6f 77 73 20 67 65 6e 65 72 61  r of rows genera
2040: 74 65 64 20 62 79 20 74 68 69 73 20 70 61 74 68  ted by this path
2050: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
2060: 72 43 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20 54  rCost;      /* T
2070: 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 74 68 69  otal cost of thi
2080: 73 20 70 61 74 68 20 2a 2f 0a 20 20 75 38 20 69  s path */.  u8 i
2090: 73 4f 72 64 65 72 65 64 3b 20 20 20 20 20 20 20  sOrdered;       
20a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
20b0: 73 20 70 61 74 68 20 73 61 74 69 73 66 69 65 73  s path satisfies
20c0: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 75   ORDER BY */.  u
20d0: 38 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  8 isOrderedValid
20e0: 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ;    /* True if 
20f0: 74 68 65 20 69 73 4f 72 64 65 72 65 64 20 66 69  the isOrdered fi
2100: 65 6c 64 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  eld is valid */.
2110: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 61 4c    WhereLoop **aL
2120: 6f 6f 70 3b 20 20 20 20 2f 2a 20 41 72 72 61 79  oop;    /* Array
2130: 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
2140: 6a 65 63 74 73 20 69 6d 70 6c 65 6d 65 6e 74 69  jects implementi
2150: 6e 67 20 74 68 69 73 20 70 61 74 68 20 2a 2f 0a  ng this path */.
2160: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75  };../*.** The qu
2170: 65 72 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73  ery generator us
2180: 65 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69  es an array of i
2190: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73  nstances of this
21a0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a   structure to.**
21b0: 20 68 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65   help it analyze
21c0: 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
21d0: 6f 6e 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  ons of the WHERE
21e0: 20 63 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57   clause.  Each W
21f0: 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73  HERE.** clause s
2200: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
2210: 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74  separated from t
2220: 68 65 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44  he others by AND
2230: 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75   operators,.** u
2240: 73 75 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74  sually, or somet
2250: 69 6d 65 73 20 73 75 62 65 78 70 72 65 73 73 69  imes subexpressi
2260: 6f 6e 73 20 73 65 70 61 72 61 74 65 64 20 62 79  ons separated by
2270: 20 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57   OR..**.** All W
2280: 68 65 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f  hereTerms are co
2290: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73  llected into a s
22a0: 69 6e 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73  ingle WhereClaus
22b0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a  e structure.  .*
22c0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
22d0: 69 64 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a  identity holds:.
22e0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65  **.**        Whe
22f0: 72 65 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68  reTerm.pWC->a[Wh
2300: 65 72 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20  ereTerm.idx] == 
2310: 57 68 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20  WhereTerm.**.** 
2320: 57 68 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f  When a term is o
2330: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
2340: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 58  *              X
2350: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a   <op> <expr>.**.
2360: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
2370: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20  column name and 
2380: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63  <op> is one of c
2390: 65 72 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73  ertain operators
23a0: 2c 0a 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54  ,.** then WhereT
23b0: 65 72 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61  erm.leftCursor a
23c0: 6e 64 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c  nd WhereTerm.u.l
23d0: 65 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64  eftColumn record
23e0: 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e   the.** cursor n
23f0: 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e  umber and column
2400: 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20   number for X.  
2410: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
2420: 74 6f 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  tor records.** t
2430: 68 65 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20  he <op> using a 
2440: 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67  bitmask encoding
2450: 20 64 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78   defined by WO_x
2460: 78 78 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a  xx below.  The.*
2470: 2a 20 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61  * use of a bitma
2480: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20  sk encoding for 
2490: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c  the operator all
24a0: 6f 77 73 20 75 73 20 74 6f 20 73 65 61 72 63 68  ows us to search
24b0: 0a 2a 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20  .** quickly for 
24c0: 74 65 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68  terms that match
24d0: 20 61 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20   any of several 
24e0: 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74  different operat
24f0: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65  ors..**.** A Whe
2500: 72 65 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73  reTerm might als
2510: 6f 20 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65  o be two or more
2520: 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63   subterms connec
2530: 74 65 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a  ted by OR:.**.**
2540: 20 20 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c           (t1.X <
2550: 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28  op> <expr>) OR (
2560: 74 31 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  t1.Y <op> <expr>
2570: 29 20 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  ) OR .....**.** 
2580: 49 6e 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63  In this second c
2590: 61 73 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74  ase, wtFlag as t
25a0: 68 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73  he TERM_ORINFO s
25b0: 65 74 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72  et and eOperator
25c0: 3d 3d 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74  ==WO_OR.** and t
25d0: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
25e0: 4f 72 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69  OrInfo field poi
25f0: 6e 74 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79  nts to auxiliary
2600: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
2610: 74 0a 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65  t.** is collecte
2620: 64 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a  d about the.**.*
2630: 2a 20 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74  * If a term in t
2640: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2650: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65  does not match e
2660: 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  ither of the two
2670: 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74   previous.** cat
2680: 65 67 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f  egories, then eO
2690: 70 65 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65  perator==0.  The
26a0: 20 57 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72   WhereTerm.pExpr
26b0: 20 66 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20   field is still 
26c0: 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72  set.** to the or
26d0: 69 67 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73  iginal subexpres
26e0: 73 69 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64  sion content and
26f0: 20 77 74 46 6c 61 67 73 20 69 73 20 73 65 74 20   wtFlags is set 
2700: 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  up appropriately
2710: 0a 2a 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72  .** but no other
2720: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57   fields in the W
2730: 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20  hereTerm object 
2740: 61 72 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a  are meaningful..
2750: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72  **.** When eOper
2760: 61 74 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52  ator!=0, prereqR
2770: 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71 41  ight and prereqA
2780: 6c 6c 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f  ll record sets o
2790: 66 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  f cursor numbers
27a0: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f  ,.** but they do
27b0: 20 73 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20   so indirectly. 
27c0: 20 41 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d   A single WhereM
27d0: 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
27e0: 20 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63   translates.** c
27f0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74  ursor number int
2800: 6f 20 62 69 74 73 20 61 6e 64 20 74 68 65 20 74  o bits and the t
2810: 72 61 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73  ranslated bit is
2820: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70   stored in the p
2830: 72 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e  rereq.** fields.
2840: 20 20 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f    The translatio
2850: 6e 20 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64  n is used in ord
2860: 65 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74  er to maximize t
2870: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
2880: 62 69 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66  bits that will f
2890: 69 74 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e  it in a Bitmask.
28a0: 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f    The VDBE curso
28b0: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
28c0: 62 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74  be.** spread out
28d0: 20 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65   over the non-ne
28e0: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e  gative integers.
28f0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
2900: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  he cursor.** num
2910: 62 65 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c  bers might be 3,
2920: 20 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32   8, 9, 10, 20, 2
2930: 33 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20  3, 41, and 45.  
2940: 54 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  The WhereMaskSet
2950: 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74  .** translates t
2960: 68 65 73 65 20 73 70 61 72 73 65 20 63 75 72 73  hese sparse curs
2970: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
2980: 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65  consecutive inte
2990: 67 65 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e  gers.** beginnin
29a0: 67 20 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65  g with 0 in orde
29b0: 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65  r to make the be
29c0: 73 74 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20  st possible use 
29d0: 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  of the available
29e0: 0a 2a 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20  .** bits in the 
29f0: 42 69 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e  Bitmask.  So, in
2a00: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
2a10: 76 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ve, the cursor n
2a20: 75 6d 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20  umbers.** would 
2a30: 62 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69  be mapped into i
2a40: 6e 74 65 67 65 72 73 20 30 20 74 68 72 6f 75 67  ntegers 0 throug
2a50: 68 20 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  h 7..**.** The n
2a60: 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
2a70: 6e 20 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69  n a join is limi
2a80: 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
2a90: 72 20 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20  r of bits.** in 
2aa0: 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20  prereqRight and 
2ab0: 70 72 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20  prereqAll.  The 
2ac0: 64 65 66 61 75 6c 74 20 69 73 20 36 34 20 62 69  default is 64 bi
2ad0: 74 73 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65  ts, hence SQLite
2ae0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65  .** is only able
2af0: 20 74 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e   to process join
2b00: 73 20 77 69 74 68 20 36 34 20 6f 72 20 66 65 77  s with 64 or few
2b10: 65 72 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  er tables..*/.st
2b20: 72 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b  ruct WhereTerm {
2b30: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20  .  Expr *pExpr; 
2b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2b50: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62  inter to the sub
2b60: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
2b70: 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a  is this term */.
2b80: 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20    int iParent;  
2b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
2ba0: 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72  able pWC->a[iPar
2bb0: 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74  ent] when this t
2bc0: 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a  erm disabled */.
2bd0: 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72    int leftCursor
2be0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
2bf0: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20  sor number of X 
2c00: 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  in "X <op> <expr
2c10: 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a  >" */.  union {.
2c20: 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75      int leftColu
2c30: 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  mn;         /* C
2c40: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
2c50: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
2c60: 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72  pr>" */.    Wher
2c70: 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f  eOrInfo *pOrInfo
2c80: 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66  ;   /* Extra inf
2c90: 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70  ormation if (eOp
2ca0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21  erator & WO_OR)!
2cb0: 3d 30 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 41  =0 */.    WhereA
2cc0: 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f  ndInfo *pAndInfo
2cd0: 3b 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 72  ; /* Extra infor
2ce0: 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70 65 72  mation if (eOper
2cf0: 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21 3d 30  ator& WO_AND)!=0
2d00: 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 31 36   */.  } u;.  u16
2d10: 20 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 20 20   eOperator;     
2d20: 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78 20       /* A WO_xx 
2d30: 76 61 6c 75 65 20 64 65 73 63 72 69 62 69 6e 67  value describing
2d40: 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 77 74   <op> */.  u8 wt
2d50: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
2d60: 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78 20 62     /* TERM_xxx b
2d70: 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65 20 62  it flags.  See b
2d80: 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e 43 68  elow */.  u8 nCh
2d90: 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
2da0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2db0: 68 69 6c 64 72 65 6e 20 74 68 61 74 20 6d 75 73  hildren that mus
2dc0: 74 20 64 69 73 61 62 6c 65 20 75 73 20 2a 2f 0a  t disable us */.
2dd0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2de0: 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  WC;       /* The
2df0: 20 63 6c 61 75 73 65 20 74 68 69 73 20 74 65 72   clause this ter
2e00: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a 2f 0a  m is part of */.
2e10: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
2e20: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42 69 74  Right;    /* Bit
2e30: 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 75  mask of tables u
2e40: 73 65 64 20 62 79 20 70 45 78 70 72 2d 3e 70 52  sed by pExpr->pR
2e50: 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ight */.  Bitmas
2e60: 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20  k prereqAll;    
2e70: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
2e80: 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65  tables reference
2e90: 64 20 62 79 20 70 45 78 70 72 20 2a 2f 0a 7d 3b  d by pExpr */.};
2ea0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
2eb0: 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72 65 54  values of WhereT
2ec0: 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a 2f 0a 23  erm.wtFlags.*/.#
2ed0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e 41  define TERM_DYNA
2ee0: 4d 49 43 20 20 20 20 30 78 30 31 20 20 20 2f 2a  MIC    0x01   /*
2ef0: 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   Need to call sq
2f00: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2f10: 64 62 2c 20 70 45 78 70 72 29 20 2a 2f 0a 23 64  db, pExpr) */.#d
2f20: 65 66 69 6e 65 20 54 45 52 4d 5f 56 49 52 54 55  efine TERM_VIRTU
2f30: 41 4c 20 20 20 20 30 78 30 32 20 20 20 2f 2a 20  AL    0x02   /* 
2f40: 41 64 64 65 64 20 62 79 20 74 68 65 20 6f 70 74  Added by the opt
2f50: 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f 74 20  imizer.  Do not 
2f60: 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  code */.#define 
2f70: 54 45 52 4d 5f 43 4f 44 45 44 20 20 20 20 20 20  TERM_CODED      
2f80: 30 78 30 34 20 20 20 2f 2a 20 54 68 69 73 20 74  0x04   /* This t
2f90: 65 72 6d 20 69 73 20 61 6c 72 65 61 64 79 20 63  erm is already c
2fa0: 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  oded */.#define 
2fb0: 54 45 52 4d 5f 43 4f 50 49 45 44 20 20 20 20 20  TERM_COPIED     
2fc0: 30 78 30 38 20 20 20 2f 2a 20 48 61 73 20 61 20  0x08   /* Has a 
2fd0: 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69 6e 65  child */.#define
2fe0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 20 20 20   TERM_ORINFO    
2ff0: 20 30 78 31 30 20 20 20 2f 2a 20 4e 65 65 64 20   0x10   /* Need 
3000: 74 6f 20 66 72 65 65 20 74 68 65 20 57 68 65 72  to free the Wher
3010: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20  eTerm.u.pOrInfo 
3020: 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65 66 69 6e  object */.#defin
3030: 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 20  e TERM_ANDINFO  
3040: 20 20 30 78 32 30 20 20 20 2f 2a 20 4e 65 65 64    0x20   /* Need
3050: 20 74 6f 20 66 72 65 65 20 74 68 65 20 57 68 65   to free the Whe
3060: 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64 49 6e 66  reTerm.u.pAndInf
3070: 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66 69 6e 65  o obj */.#define
3080: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20 20 20   TERM_OR_OK     
3090: 20 30 78 34 30 20 20 20 2f 2a 20 55 73 65 64 20   0x40   /* Used 
30a0: 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65  during OR-clause
30b0: 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23   processing */.#
30c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
30d0: 42 4c 45 5f 53 54 41 54 33 0a 23 20 20 64 65 66  BLE_STAT3.#  def
30e0: 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20  ine TERM_VNULL  
30f0: 20 20 30 78 38 30 20 20 20 2f 2a 20 4d 61 6e 75    0x80   /* Manu
3100: 66 61 63 74 75 72 65 64 20 78 3e 4e 55 4c 4c 20  factured x>NULL 
3110: 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74 65 72 6d 20  or x<=NULL term 
3120: 2a 2f 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  */.#else.#  defi
3130: 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20 20  ne TERM_VNULL   
3140: 20 30 78 30 30 20 20 20 2f 2a 20 44 69 73 61 62   0x00   /* Disab
3150: 6c 65 64 20 69 66 20 6e 6f 74 20 75 73 69 6e 67  led if not using
3160: 20 73 74 61 74 33 20 2a 2f 0a 23 65 6e 64 69 66   stat3 */.#endif
3170: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
3180: 6e 63 65 20 6f 66 20 74 68 65 20 57 68 65 72 65  nce of the Where
3190: 53 63 61 6e 20 6f 62 6a 65 63 74 20 69 73 20 75  Scan object is u
31a0: 73 65 64 20 61 73 20 61 6e 20 69 74 65 72 61 74  sed as an iterat
31b0: 6f 72 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 0a  or for locating.
31c0: 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  ** terms in the 
31d0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
31e0: 74 20 61 72 65 20 75 73 65 66 75 6c 20 74 6f 20  t are useful to 
31f0: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
3200: 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  r..*/.struct Whe
3210: 72 65 53 63 61 6e 20 7b 0a 20 20 57 68 65 72 65  reScan {.  Where
3220: 43 6c 61 75 73 65 20 2a 70 4f 72 69 67 57 43 3b  Clause *pOrigWC;
3230: 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
3240: 6c 2c 20 69 6e 6e 65 72 6d 6f 73 74 20 57 68 65  l, innermost Whe
3250: 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  reClause */.  Wh
3260: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
3270: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
3280: 65 43 6c 61 75 73 65 20 63 75 72 72 65 6e 74 6c  eClause currentl
3290: 79 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20  y being scanned 
32a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  */.  char *zColl
32b0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
32c0: 2f 2a 20 52 65 71 75 69 72 65 64 20 63 6f 6c 6c  /* Required coll
32d0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20  ating sequence, 
32e0: 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20  if not NULL */. 
32f0: 20 63 68 61 72 20 69 64 78 61 66 66 3b 20 20 20   char idxaff;   
3300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
3310: 75 73 74 20 6d 61 74 63 68 20 74 68 69 73 20 61  ust match this a
3320: 66 66 69 6e 69 74 79 2c 20 69 66 20 7a 43 6f 6c  ffinity, if zCol
3330: 6c 4e 61 6d 65 21 3d 4e 55 4c 4c 20 2a 2f 0a 20  lName!=NULL */. 
3340: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6e   unsigned char n
3350: 45 71 75 69 76 3b 20 20 20 20 20 20 2f 2a 20 4e  Equiv;      /* N
3360: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3370: 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a   in aEquiv[] */.
3380: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3390: 69 45 71 75 69 76 3b 20 20 20 20 20 20 2f 2a 20  iEquiv;      /* 
33a0: 4e 65 78 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  Next unused slot
33b0: 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a   in aEquiv[] */.
33c0: 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20 20 20    u32 opMask;   
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33e0: 41 63 63 65 70 74 61 62 6c 65 20 6f 70 65 72 61  Acceptable opera
33f0: 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b  tors */.  int k;
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3410: 20 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73       /* Resume s
3420: 63 61 6e 6e 69 6e 67 20 61 74 20 74 68 69 73 2d  canning at this-
3430: 3e 70 57 43 2d 3e 61 5b 74 68 69 73 2d 3e 6b 5d  >pWC->a[this->k]
3440: 20 2a 2f 0a 20 20 69 6e 74 20 61 45 71 75 69 76   */.  int aEquiv
3450: 5b 32 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [22];           
3460: 20 2f 2a 20 43 75 72 73 6f 72 2c 43 6f 6c 75 6d   /* Cursor,Colum
3470: 6e 20 70 61 69 72 73 20 66 6f 72 20 65 71 75 69  n pairs for equi
3480: 76 61 6c 65 6e 63 65 20 63 6c 61 73 73 65 73 20  valence classes 
3490: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
34a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
34b0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
34c0: 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e  ure holds all in
34d0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
34e0: 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  a.** WHERE claus
34f0: 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20  e.  Mostly this 
3500: 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66  is a container f
3510: 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  or one or more W
3520: 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  hereTerms..**.**
3530: 20 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   Explanation of 
3540: 70 4f 75 74 65 72 3a 20 20 46 6f 72 20 61 20 57  pOuter:  For a W
3550: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
3560: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
3570: 20 20 20 20 20 20 20 20 61 20 41 4e 44 20 28 28          a AND ((
3580: 62 20 41 4e 44 20 63 29 20 4f 52 20 28 64 20 41  b AND c) OR (d A
3590: 4e 44 20 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a  ND e)) AND f.**.
35a0: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 70  ** There are sep
35b0: 61 72 61 74 65 20 57 68 65 72 65 43 6c 61 75 73  arate WhereClaus
35c0: 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 74 68  e objects for th
35d0: 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 20 61  e whole clause a
35e0: 6e 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75  nd for.** the su
35f0: 62 63 6c 61 75 73 65 73 20 22 28 62 20 41 4e 44  bclauses "(b AND
3600: 20 63 29 22 20 61 6e 64 20 22 28 64 20 41 4e 44   c)" and "(d AND
3610: 20 65 29 22 2e 20 20 54 68 65 20 70 4f 75 74 65   e)".  The pOute
3620: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a  r field of the.*
3630: 2a 20 73 75 62 63 6c 61 75 73 65 73 20 70 6f 69  * subclauses poi
3640: 6e 74 73 20 74 6f 20 74 68 65 20 57 68 65 72 65  nts to the Where
3650: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 66 6f  Clause object fo
3660: 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75  r the whole clau
3670: 73 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  se..*/.struct Wh
3680: 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 57 68  ereClause {.  Wh
3690: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
36a0: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
36b0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
36c0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
36d0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 75 74  hereClause *pOut
36e0: 65 72 3b 20 20 20 20 20 2f 2a 20 4f 75 74 65 72  er;     /* Outer
36f0: 20 63 6f 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a   conjunction */.
3700: 20 20 75 38 20 6f 70 3b 20 20 20 20 20 20 20 20    u8 op;        
3710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
3720: 6c 69 74 20 6f 70 65 72 61 74 6f 72 2e 20 20 54  lit operator.  T
3730: 4b 5f 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a  K_AND or TK_OR *
3740: 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20  /.  int nTerm;  
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3760: 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
3770: 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20  */.  int nSlot; 
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3790: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
37a0: 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57  es in a[] */.  W
37b0: 68 65 72 65 54 65 72 6d 20 2a 61 3b 20 20 20 20  hereTerm *a;    
37c0: 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20          /* Each 
37d0: 61 5b 5d 20 64 65 73 63 72 69 62 65 73 20 61 20  a[] describes a 
37e0: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
37f0: 45 20 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66 20  E cluase */.#if 
3800: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53  defined(SQLITE_S
3810: 4d 41 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57 68  MALL_STACK).  Wh
3820: 65 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b  ereTerm aStatic[
3830: 31 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  1];    /* Initia
3840: 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66  l static space f
3850: 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a  or a[] */.#else.
3860: 20 20 57 68 65 72 65 54 65 72 6d 20 61 53 74 61    WhereTerm aSta
3870: 74 69 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49 6e  tic[8];    /* In
3880: 69 74 69 61 6c 20 73 74 61 74 69 63 20 73 70 61  itial static spa
3890: 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65  ce for a[] */.#e
38a0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
38b0: 20 57 68 65 72 65 54 65 72 6d 20 77 69 74 68 20   WhereTerm with 
38c0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52  eOperator==WO_OR
38d0: 20 68 61 73 20 69 74 73 20 75 2e 70 4f 72 49 6e   has its u.pOrIn
38e0: 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74  fo pointer set t
38f0: 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c  o.** a dynamical
3900: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73  ly allocated ins
3910: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
3920: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3930: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
3940: 65 4f 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72  eOrInfo {.  Wher
3950: 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20  eClause wc;     
3960: 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73       /* Decompos
3970: 69 74 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65  ition into subte
3980: 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
3990: 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20   indexable;     
39a0: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
39b0: 61 6c 6c 20 69 6e 64 65 78 61 62 6c 65 20 74 61  all indexable ta
39c0: 62 6c 65 73 20 69 6e 20 74 68 65 20 63 6c 61 75  bles in the clau
39d0: 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  se */.};../*.** 
39e0: 41 20 57 68 65 72 65 54 65 72 6d 20 77 69 74 68  A WhereTerm with
39f0: 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41   eOperator==WO_A
3a00: 4e 44 20 68 61 73 20 69 74 73 20 75 2e 70 41 6e  ND has its u.pAn
3a10: 64 49 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65  dInfo pointer se
3a20: 74 20 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69  t to.** a dynami
3a30: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
3a40: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3a50: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3a60: 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  ure..*/.struct W
3a70: 68 65 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20  hereAndInfo {.  
3a80: 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20  WhereClause wc; 
3a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3aa0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 62 72  subexpression br
3ab0: 6f 6b 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a  oken out */.};..
3ac0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
3ad0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3ae0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
3af0: 70 73 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61  ps track of a ma
3b00: 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e  pping.** between
3b10: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
3b20: 62 65 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66  bers and bits of
3b30: 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e   the bitmasks in
3b40: 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
3b50: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
3b60: 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d  r numbers are sm
3b70: 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e  all integers con
3b80: 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72  tained in .** Sr
3b90: 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73  cList_item.iCurs
3ba0: 6f 72 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62  or and Expr.iTab
3bb0: 6c 65 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20  le fields.  For 
3bc0: 61 6e 79 20 67 69 76 65 6e 20 57 48 45 52 45 20  any given WHERE 
3bd0: 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20  .** clause, the 
3be0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d  cursor numbers m
3bf0: 69 67 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77  ight not begin w
3c00: 69 74 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d  ith 0 and they m
3c10: 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20  ight.** contain 
3c20: 67 61 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62  gaps in the numb
3c30: 65 72 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ering sequence. 
3c40: 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   But we want to 
3c50: 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20  make maximum.** 
3c60: 75 73 65 20 6f 66 20 74 68 65 20 62 69 74 73 20  use of the bits 
3c70: 69 6e 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e  in our bitmasks.
3c80: 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65    This structure
3c90: 20 70 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70   provides a mapp
3ca0: 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ing.** from the 
3cb0: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
3cc0: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
3cd0: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 20  cutive integers 
3ce0: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74  beginning.** wit
3cf0: 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68  h 0..**.** If Wh
3d00: 65 72 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d  ereMaskSet.ix[A]
3d10: 3d 3d 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==B it means tha
3d20: 74 20 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f  t The A-th bit o
3d30: 66 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63  f a Bitmask.** c
3d40: 6f 72 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20  orresponds VDBE 
3d50: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e  cursor number B.
3d60: 20 20 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f    The A-th bit o
3d70: 66 20 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31  f a bitmask is 1
3d80: 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  <<A..**.** For e
3d90: 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57  xample, if the W
3da0: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
3db0: 65 73 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73  ession used thes
3dc0: 65 20 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72  e VDBE.** cursor
3dd0: 73 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c  s:  4, 5, 8, 29,
3de0: 20 35 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74   57, 73.  Then t
3df0: 68 65 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  he  WhereMaskSet
3e00: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f   structure.** wo
3e10: 75 6c 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75  uld map those cu
3e20: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
3e30: 6f 20 62 69 74 73 20 30 20 74 68 72 6f 75 67 68  o bits 0 through
3e40: 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74   5..**.** Note t
3e50: 68 61 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20  hat the mapping 
3e60: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
3e70: 6c 79 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20  ly ordered.  In 
3e80: 74 68 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61  the example.** a
3e90: 62 6f 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e  bove, the mappin
3ea0: 67 20 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20  g might go like 
3eb0: 74 68 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e  this:  4->3, 5->
3ec0: 31 2c 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a  1, 8->2, 29->0,.
3ed0: 2a 2a 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e  ** 57->5, 73->4.
3ee0: 20 20 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20    Or one of 719 
3ef0: 6f 74 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f  other combinatio
3f00: 6e 73 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  ns might be used
3f10: 2e 20 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  . It.** does not
3f20: 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20   really matter. 
3f30: 20 57 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61   What is importa
3f40: 6e 74 20 69 73 20 74 68 61 74 20 73 70 61 72 73  nt is that spars
3f50: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  e cursor.** numb
3f60: 65 72 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70  ers all get mapp
3f70: 65 64 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62  ed into bit numb
3f80: 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ers that begin w
3f90: 69 74 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69  ith 0 and contai
3fa0: 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f  n.** no gaps..*/
3fb0: 0a 73 74 72 75 63 74 20 57 68 65 72 65 4d 61 73  .struct WhereMas
3fc0: 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20  kSet {.  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 2f 2a 20 4e 75 6d 62 65 72         /* Number
3ff0: 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63 75 72   of assigned cur
4000: 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  sor values */.  
4010: 69 6e 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20  int ix[BMS];    
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4030: 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   Cursor assigned
4040: 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a   to each bit */.
4050: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f  };../*.** This o
4060: 62 6a 65 63 74 20 69 73 20 61 20 63 6f 6e 76 65  bject is a conve
4070: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 68  nience wrapper h
4080: 6f 6c 64 69 6e 67 20 61 6c 6c 20 69 6e 66 6f 72  olding all infor
4090: 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 0a 2a 2a  mation needed.**
40a0: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 57 68   to construct Wh
40b0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
40c0: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
40d0: 20 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 72 75 63   query..*/.struc
40e0: 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  t WhereLoopBuild
40f0: 65 72 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er {.  WhereInfo
4100: 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
4110: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
4120: 61 62 6f 75 74 20 74 68 69 73 20 57 48 45 52 45  about this WHERE
4130: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
4140: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
4150: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
4160: 74 65 72 6d 73 20 2a 2f 0a 20 20 45 78 70 72 4c  terms */.  ExprL
4170: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
4180: 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59       /* ORDER BY
4190: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
41a0: 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
41b0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
41c0: 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  te WhereLoop */.
41d0: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 42 65    WhereLoop *pBe
41e0: 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  st;         /* I
41f0: 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 73 74 6f 72  f non-NULL, stor
4200: 65 20 73 69 6e 67 6c 65 20 62 65 73 74 20 6c 6f  e single best lo
4210: 6f 70 20 68 65 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f  op here */.};../
4220: 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52 45 20 63  *.** The WHERE c
4230: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
4240: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 77 6f   routine has two
4250: 20 68 61 6c 76 65 73 2e 20 20 54 68 65 0a 2a 2a   halves.  The.**
4260: 20 66 69 72 73 74 20 70 61 72 74 20 64 6f 65 73   first part does
4270: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
4280: 65 20 57 48 45 52 45 20 6c 6f 6f 70 20 61 6e 64  e WHERE loop and
4290: 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 68   the second.** h
42a0: 61 6c 66 20 64 6f 65 73 20 74 68 65 20 74 61 69  alf does the tai
42b0: 6c 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  l of the WHERE l
42c0: 6f 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61 6e 63  oop.  An instanc
42d0: 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73 74 72  e of.** this str
42e0: 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e  ucture is return
42f0: 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20  ed by the first 
4300: 68 61 6c 66 20 61 6e 64 20 70 61 73 73 65 64 0a  half and passed.
4310: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 63 6f  ** into the seco
4320: 6e 64 20 68 61 6c 66 20 74 6f 20 67 69 76 65 20  nd half to give 
4330: 73 6f 6d 65 20 63 6f 6e 74 69 6e 75 69 74 79 2e  some continuity.
4340: 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  .**.** An instan
4350: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
4360: 74 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6d 70  t holds the comp
4370: 6c 65 74 65 20 73 74 61 74 65 20 6f 66 20 74 68  lete state of th
4380: 65 20 71 75 65 72 79 0a 2a 2a 20 70 6c 61 6e 6e  e query.** plann
4390: 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  er..*/.struct Wh
43a0: 65 72 65 49 6e 66 6f 20 7b 0a 20 20 50 61 72 73  ereInfo {.  Pars
43b0: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
43c0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
43d0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
43e0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
43f0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
4400: 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist;        /* L
4410: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
4420: 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45   the join */.  E
4430: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
4440: 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  y;       /* The 
4450: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
4460: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  or NULL */.  Exp
4470: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
4480: 3b 20 20 20 20 20 20 2f 2a 20 44 49 53 54 49 4e  ;      /* DISTIN
4490: 43 54 20 4f 4e 20 76 61 6c 75 65 73 2c 20 6f 72  CT ON values, or
44a0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
44b0: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 73 3b 20 20 20  Loop *pLoops;   
44c0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
44d0: 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
44e0: 6a 65 63 74 73 20 2a 2f 0a 20 20 42 69 74 6d 61  jects */.  Bitma
44f0: 73 6b 20 72 65 76 4d 61 73 6b 3b 20 20 20 20 20  sk revMask;     
4500: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
4510: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
4520: 68 61 74 20 6e 65 65 64 20 72 65 76 65 72 73 69  hat need reversi
4530: 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  ng */.  WhereCos
4540: 74 20 6e 52 6f 77 4f 75 74 3b 20 20 20 20 20 20  t nRowOut;      
4550: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
4560: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
4570: 72 6f 77 73 20 2a 2f 0a 20 20 75 31 36 20 77 63  rows */.  u16 wc
4580: 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  trlFlags;       
4590: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 6f 72 69      /* Flags ori
45a0: 67 69 6e 61 6c 6c 79 20 70 61 73 73 65 64 20 74  ginally passed t
45b0: 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
45c0: 67 69 6e 28 29 20 2a 2f 0a 20 20 75 38 20 62 4f  gin() */.  u8 bO
45d0: 42 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  BSat;           
45e0: 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59       /* ORDER BY
45f0: 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e   satisfied by in
4600: 64 69 63 65 73 20 2a 2f 0a 20 20 75 38 20 6f 6b  dices */.  u8 ok
4610: 4f 6e 65 50 61 73 73 3b 20 20 20 20 20 20 20 20  OnePass;        
4620: 20 20 20 20 20 2f 2a 20 4f 6b 20 74 6f 20 75 73       /* Ok to us
4630: 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  e one-pass algor
4640: 69 74 68 6d 20 66 6f 72 20 55 50 44 41 54 45 2f  ithm for UPDATE/
4650: 44 45 4c 45 54 45 20 2a 2f 0a 20 20 75 38 20 75  DELETE */.  u8 u
4660: 6e 74 65 73 74 65 64 54 65 72 6d 73 3b 20 20 20  ntestedTerms;   
4670: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c        /* Not all
4680: 20 57 48 45 52 45 20 74 65 72 6d 73 20 72 65 73   WHERE terms res
4690: 6f 6c 76 65 64 20 62 79 20 6f 75 74 65 72 20 6c  olved by outer l
46a0: 6f 6f 70 20 2a 2f 0a 20 20 75 38 20 65 44 69 73  oop */.  u8 eDis
46b0: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
46c0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
46d0: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
46e0: 2a 20 76 61 6c 75 65 73 20 62 65 6c 6f 77 20 2a  * values below *
46f0: 2f 0a 20 20 69 6e 74 20 69 54 6f 70 3b 20 20 20  /.  int iTop;   
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4710: 20 54 68 65 20 76 65 72 79 20 62 65 67 69 6e 6e   The very beginn
4720: 69 6e 67 20 6f 66 20 74 68 65 20 57 48 45 52 45  ing of the WHERE
4730: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69   loop */.  int i
4740: 43 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 20  Continue;       
4750: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
4760: 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
4770: 74 68 20 6e 65 78 74 20 72 65 63 6f 72 64 20 2a  th next record *
4780: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 3b 20  /.  int iBreak; 
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
47a0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
47b0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  eak out of the l
47c0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  oop */.  int nLe
47d0: 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  vel;            
47e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
47f0: 6e 65 73 74 65 64 20 6c 6f 6f 70 20 2a 2f 0a 20  nested loop */. 
4800: 20 69 6e 74 20 73 61 76 65 64 4e 51 75 65 72 79   int savedNQuery
4810: 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20 70 50  Loop;      /* pP
4820: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
4830: 20 6f 75 74 73 69 64 65 20 74 68 65 20 57 48 45   outside the WHE
4840: 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65  RE loop */.  Whe
4850: 72 65 4d 61 73 6b 53 65 74 20 73 4d 61 73 6b 53  reMaskSet sMaskS
4860: 65 74 3b 20 20 20 20 2f 2a 20 4d 61 70 20 63 75  et;    /* Map cu
4870: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20  rsor numbers to 
4880: 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68  bitmasks */.  Wh
4890: 65 72 65 43 6c 61 75 73 65 20 73 57 43 3b 20 20  ereClause sWC;  
48a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d          /* Decom
48b0: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
48c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
48d0: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 61 5b 31    WhereLevel a[1
48e0: 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ];          /* I
48f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
4900: 20 65 61 63 68 20 6e 65 73 74 20 6c 6f 6f 70 20   each nest loop 
4910: 69 6e 20 57 48 45 52 45 20 2a 2f 0a 7d 3b 0a 0a  in WHERE */.};..
4920: 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73 20 66  /*.** Bitmasks f
4930: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  or the operators
4940: 20 6f 6e 20 57 68 65 72 65 54 65 72 6d 20 6f 62   on WhereTerm ob
4950: 6a 65 63 74 73 2e 20 20 54 68 65 73 65 20 61 72  jects.  These ar
4960: 65 20 61 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 6f  e all.** operato
4970: 72 73 20 74 68 61 74 20 61 72 65 20 6f 66 20 69  rs that are of i
4980: 6e 74 65 72 65 73 74 20 74 6f 20 74 68 65 20 71  nterest to the q
4990: 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 41  uery planner.  A
49a0: 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69  n.** OR-ed combi
49b0: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  nation of these 
49c0: 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73  values can be us
49d0: 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e  ed when searchin
49e0: 67 20 66 6f 72 0a 2a 2a 20 70 61 72 74 69 63 75  g for.** particu
49f0: 6c 61 72 20 57 68 65 72 65 54 65 72 6d 73 20 77  lar WhereTerms w
4a00: 69 74 68 69 6e 20 61 20 57 68 65 72 65 43 6c 61  ithin a WhereCla
4a10: 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  use..*/.#define 
4a20: 57 4f 5f 49 4e 20 20 20 20 20 30 78 30 30 31 0a  WO_IN     0x001.
4a30: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20 20  #define WO_EQ   
4a40: 20 20 30 78 30 30 32 0a 23 64 65 66 69 6e 65 20    0x002.#define 
4a50: 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_LT     (WO_EQ
4a60: 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29  <<(TK_LT-TK_EQ))
4a70: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20  .#define WO_LE  
4a80: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c     (WO_EQ<<(TK_L
4a90: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
4aa0: 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f  e WO_GT     (WO_
4ab0: 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51  EQ<<(TK_GT-TK_EQ
4ac0: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45  )).#define WO_GE
4ad0: 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b       (WO_EQ<<(TK
4ae0: 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66  _GE-TK_EQ)).#def
4af0: 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20 30 78  ine WO_MATCH  0x
4b00: 30 34 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49  040.#define WO_I
4b10: 53 4e 55 4c 4c 20 30 78 30 38 30 0a 23 64 65 66  SNULL 0x080.#def
4b20: 69 6e 65 20 57 4f 5f 4f 52 20 20 20 20 20 30 78  ine WO_OR     0x
4b30: 31 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  100       /* Two
4b40: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
4b50: 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23  ected terms */.#
4b60: 64 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20  define WO_AND   
4b70: 20 30 78 32 30 30 20 20 20 20 20 20 20 2f 2a 20   0x200       /* 
4b80: 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d  Two or more AND-
4b90: 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
4ba0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51  */.#define WO_EQ
4bb0: 55 49 56 20 20 30 78 34 30 30 20 20 20 20 20 20  UIV  0x400      
4bc0: 20 2f 2a 20 4f 66 20 74 68 65 20 66 6f 72 6d 20   /* Of the form 
4bd0: 41 3d 3d 42 2c 20 62 6f 74 68 20 63 6f 6c 75 6d  A==B, both colum
4be0: 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  ns */.#define WO
4bf0: 5f 4e 4f 4f 50 20 20 20 30 78 38 30 30 20 20 20  _NOOP   0x800   
4c00: 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d      /* This term
4c10: 20 64 6f 65 73 20 6e 6f 74 20 72 65 73 74 72 69   does not restri
4c20: 63 74 20 73 65 61 72 63 68 20 73 70 61 63 65 20  ct search space 
4c30: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41  */..#define WO_A
4c40: 4c 4c 20 20 20 20 30 78 66 66 66 20 20 20 20 20  LL    0xfff     
4c50: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
4c60: 20 70 6f 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76   possible WO_* v
4c70: 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65  alues */.#define
4c80: 20 57 4f 5f 53 49 4e 47 4c 45 20 30 78 30 66 66   WO_SINGLE 0x0ff
4c90: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
4ca0: 66 20 61 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75  f all non-compou
4cb0: 6e 64 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a  nd WO_* values *
4cc0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  /../*.** These a
4cd0: 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  re definitions o
4ce0: 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 57 68  f bits in the Wh
4cf0: 65 72 65 4c 6f 6f 70 2e 77 73 46 6c 61 67 73 20  ereLoop.wsFlags 
4d00: 66 69 65 6c 64 2e 0a 2a 2a 20 54 68 65 20 70 61  field..** The pa
4d10: 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61  rticular combina
4d20: 74 69 6f 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tion of bits in 
4d30: 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 20 68  each WhereLoop h
4d40: 65 6c 70 20 74 6f 0a 2a 2a 20 64 65 74 65 72 6d  elp to.** determ
4d50: 69 6e 65 20 74 68 65 20 61 6c 67 6f 72 69 74 68  ine the algorith
4d60: 6d 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70  m that WhereLoop
4d70: 20 72 65 70 72 65 73 65 6e 74 73 2e 0a 2a 2f 0a   represents..*/.
4d80: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
4d90: 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78 30 30 30  LUMN_EQ    0x000
4da0: 30 30 30 30 31 20 20 2f 2a 20 78 3d 45 58 50 52  00001  /* x=EXPR
4db0: 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 6f   or x IN (...) o
4dc0: 72 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23  r x IS NULL */.#
4dd0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c  define WHERE_COL
4de0: 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30 30 30  UMN_RANGE 0x0000
4df0: 30 30 30 32 20 20 2f 2a 20 78 3c 45 58 50 52 20  0002  /* x<EXPR 
4e00: 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f  and/or x>EXPR */
4e10: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
4e20: 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30  OLUMN_IN    0x00
4e30: 30 30 30 30 30 34 20 20 2f 2a 20 78 20 49 4e 20  000004  /* x IN 
4e40: 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65  (...) */.#define
4e50: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
4e60: 4c 4c 20 20 30 78 30 30 30 30 30 30 30 38 20 20  LL  0x00000008  
4e70: 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a  /* x IS NULL */.
4e80: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
4e90: 4e 53 54 52 41 49 4e 54 20 20 20 30 78 30 30 30  NSTRAINT   0x000
4ea0: 30 30 30 30 66 20 20 2f 2a 20 41 6e 79 20 6f 66  0000f  /* Any of
4eb0: 20 74 68 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d   the WHERE_COLUM
4ec0: 4e 5f 78 78 78 20 76 61 6c 75 65 73 20 2a 2f 0a  N_xxx values */.
4ed0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 4f  #define WHERE_TO
4ee0: 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 30  P_LIMIT    0x000
4ef0: 30 30 30 31 30 20 20 2f 2a 20 78 3c 45 58 50 52  00010  /* x<EXPR
4f00: 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73   or x<=EXPR cons
4f10: 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e  traint */.#defin
4f20: 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  e WHERE_BTM_LIMI
4f30: 54 20 20 20 20 30 78 30 30 30 30 30 30 32 30 20  T    0x00000020 
4f40: 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78 3e   /* x>EXPR or x>
4f50: 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74  =EXPR constraint
4f60: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
4f70: 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20 20 30  E_BOTH_LIMIT   0
4f80: 78 30 30 30 30 30 30 33 30 20 20 2f 2a 20 42 6f  x00000030  /* Bo
4f90: 74 68 20 78 3e 45 58 50 52 20 61 6e 64 20 78 3c  th x>EXPR and x<
4fa0: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
4fb0: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20  WHERE_IDX_ONLY  
4fc0: 20 20 20 30 78 30 30 30 30 30 30 34 30 20 20 2f     0x00000040  /
4fd0: 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79  * Use index only
4fe0: 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f   - omit table */
4ff0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49  .#define WHERE_I
5000: 50 4b 20 20 20 20 20 20 20 20 20 20 30 78 30 30  PK          0x00
5010: 30 30 30 31 30 30 20 20 2f 2a 20 78 20 69 73 20  000100  /* x is 
5020: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
5030: 41 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65 66 69  ARY KEY */.#defi
5040: 6e 65 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44  ne WHERE_INDEXED
5050: 20 20 20 20 20 20 30 78 30 30 30 30 30 32 30 30        0x00000200
5060: 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75    /* WhereLoop.u
5070: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 69 73  .btree.pIndex is
5080: 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66 69 6e   valid */.#defin
5090: 65 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  e WHERE_VIRTUALT
50a0: 41 42 4c 45 20 30 78 30 30 30 30 30 34 30 30 20  ABLE 0x00000400 
50b0: 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75 2e   /* WhereLoop.u.
50c0: 76 74 61 62 20 69 73 20 76 61 6c 69 64 20 2a 2f  vtab is valid */
50d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49  .#define WHERE_I
50e0: 4e 5f 41 42 4c 45 20 20 20 20 20 20 30 78 30 30  N_ABLE      0x00
50f0: 30 30 30 38 30 30 20 20 2f 2a 20 41 62 6c 65 20  000800  /* Able 
5100: 74 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 49 4e  to support an IN
5110: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64 65   operator */.#de
5120: 66 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f  fine WHERE_ONERO
5130: 57 20 20 20 20 20 20 20 30 78 30 30 30 30 31 30  W       0x000010
5140: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
5150: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
5160: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
5170: 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20 20  HERE_MULTI_OR   
5180: 20 20 30 78 30 30 30 30 32 30 30 30 20 20 2f 2a    0x00002000  /*
5190: 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69 70   OR using multip
51a0: 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23 64  le indices */.#d
51b0: 65 66 69 6e 65 20 57 48 45 52 45 5f 54 45 4d 50  efine WHERE_TEMP
51c0: 5f 49 4e 44 45 58 20 20 20 30 78 30 30 30 30 34  _INDEX   0x00004
51d0: 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e 20  000  /* Uses an 
51e0: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
51f0: 2a 2f 0a 0a 0a 2f 2a 20 43 6f 6e 76 65 72 74 20  */.../* Convert 
5200: 61 20 57 68 65 72 65 43 6f 73 74 20 76 61 6c 75  a WhereCost valu
5210: 65 20 28 31 30 20 74 69 6d 65 73 20 6c 6f 67 32  e (10 times log2
5220: 28 58 29 29 20 69 6e 74 6f 20 69 74 73 20 69 6e  (X)) into its in
5230: 74 65 67 65 72 20 76 61 6c 75 65 20 58 2e 0a 2a  teger value X..*
5240: 2a 20 41 20 72 6f 75 67 68 20 61 70 70 72 6f 78  * A rough approx
5250: 69 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e  imation is used.
5260: 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75    The value retu
5270: 72 6e 65 64 20 69 73 20 6e 6f 74 20 65 78 61 63  rned is not exac
5280: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34  t..*/.static u64
5290: 20 77 68 65 72 65 43 6f 73 74 54 6f 49 6e 74 28   whereCostToInt(
52a0: 57 68 65 72 65 43 6f 73 74 20 78 29 7b 0a 20 20  WhereCost x){.  
52b0: 75 36 34 20 6e 3b 0a 20 20 69 66 28 20 78 3c 31  u64 n;.  if( x<1
52c0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
52d0: 6e 20 3d 20 78 25 31 30 3b 0a 20 20 78 20 2f 3d  n = x%10;.  x /=
52e0: 20 31 30 3b 0a 20 20 69 66 28 20 6e 3e 3d 35 20   10;.  if( n>=5 
52f0: 29 20 6e 20 2d 3d 20 32 3b 0a 20 20 65 6c 73 65  ) n -= 2;.  else
5300: 20 69 66 28 20 6e 3e 3d 31 20 29 20 6e 20 2d 3d   if( n>=1 ) n -=
5310: 20 31 3b 0a 20 20 69 66 28 20 78 3e 3d 33 20 29   1;.  if( x>=3 )
5320: 20 72 65 74 75 72 6e 20 28 6e 2b 38 29 3c 3c 28   return (n+8)<<(
5330: 78 2d 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  x-3);.  return (
5340: 6e 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a 7d 0a 0a  n+8)>>(3-x);.}..
5350: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5360: 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
5370: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
5380: 20 66 72 6f 6d 20 61 20 57 48 45 52 45 20 63 6c   from a WHERE cl
5390: 61 75 73 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69  ause.*/.u64 sqli
53a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
53b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
53c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
53d0: 75 72 6e 20 77 68 65 72 65 43 6f 73 74 54 6f 49  urn whereCostToI
53e0: 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  nt(pWInfo->nRowO
53f0: 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ut);.}../*.** Re
5400: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
5410: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
5420: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
5430: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
5440: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
5450: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
5460: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
5470: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
5480: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
5490: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
54a0: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
54b0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
54c0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
54d0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
54e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
54f0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
5500: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
5510: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
5520: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
5530: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
5540: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5550: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
5560: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
5570: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
5580: 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 3b 0a  nfo->bOBSat!=0;.
5590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
55a0: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
55b0: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
55c0: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
55d0: 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d   continue.** imm
55e0: 65 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68  ediately with th
55f0: 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20  e next row of a 
5600: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f  WHERE clause..*/
5610: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
5620: 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57  eContinueLabel(W
5630: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
5640: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  ){.  return pWIn
5650: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d  fo->iContinue;.}
5660: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5670: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
5680: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
5690: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
56a0: 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20  break.** out of 
56b0: 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f  a WHERE loop..*/
56c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
56d0: 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72  eBreakLabel(Wher
56e0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
56f0: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
5700: 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iBreak;.}../*.*
5710: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
5720: 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
5730: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63  LETE statement c
5740: 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63  an operate direc
5750: 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f  tly on.** the ro
5760: 77 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79  wids returned by
5770: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
5780: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
5790: 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50  f doing an.** UP
57a0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d  DATE or DELETE m
57b0: 69 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73  ight change subs
57c0: 65 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61  equent WHERE cla
57d0: 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a  use results..*/.
57e0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
57f0: 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72 65 49  OkOnePass(WhereI
5800: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
5810: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6f  return pWInfo->o
5820: 6b 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a  kOnePass;.}../*.
5830: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
5840: 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  preallocated Whe
5850: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
5860: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
5870: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  id whereClauseIn
5880: 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  it(.  WhereClaus
5890: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f  e *pWC,        /
58a0: 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73  * The WhereClaus
58b0: 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69  e to be initiali
58c0: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  zed */.  WhereIn
58d0: 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20 20 20  fo *pWInfo      
58e0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 70    /* The WHERE p
58f0: 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78  rocessing contex
5900: 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70  t */.){.  pWC->p
5910: 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a  WInfo = pWInfo;.
5920: 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20    pWC->pOuter = 
5930: 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20  0;.  pWC->nTerm 
5940: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f  = 0;.  pWC->nSlo
5950: 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57  t = ArraySize(pW
5960: 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70  C->aStatic);.  p
5970: 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74  WC->a = pWC->aSt
5980: 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  atic;.}../* Forw
5990: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
59a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
59b0: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68  reClauseClear(Wh
59c0: 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a  ereClause*);../*
59d0: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
59e0: 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
59f0: 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72  ated with a Wher
5a00: 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  eOrInfo object..
5a10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
5a20: 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65  hereOrInfoDelete
5a30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
5a40: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20  ereOrInfo *p){. 
5a50: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
5a60: 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c  r(&p->wc);.  sql
5a70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5a80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  );.}../*.** Deal
5a90: 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72  locate all memor
5aa0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
5ab0: 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e 66 6f  h a WhereAndInfo
5ac0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
5ad0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 41 6e 64  ic void whereAnd
5ae0: 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74  InfoDelete(sqlit
5af0: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41 6e 64  e3 *db, WhereAnd
5b00: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72  Info *p){.  wher
5b10: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d  eClauseClear(&p-
5b20: 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  >wc);.  sqlite3D
5b30: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
5b40: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
5b50: 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  e a WhereClause 
5b60: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
5b70: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
5b80: 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20  cture.** itself 
5b90: 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54  is not freed.  T
5ba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
5bb0: 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68  he inverse of wh
5bc0: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e  ereClauseInit().
5bd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5be0: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
5bf0: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
5c00: 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  C){.  int i;.  W
5c10: 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73  hereTerm *a;.  s
5c20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43  qlite3 *db = pWC
5c30: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
5c40: 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57  ->db;.  for(i=pW
5c50: 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57  C->nTerm-1, a=pW
5c60: 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  C->a; i>=0; i--,
5c70: 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   a++){.    if( a
5c80: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
5c90: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
5ca0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
5cb0: 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72  ete(db, a->pExpr
5cc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5cd0: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
5ce0: 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20  RM_ORINFO ){.   
5cf0: 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65     whereOrInfoDe
5d00: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f  lete(db, a->u.pO
5d10: 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  rInfo);.    }els
5d20: 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73  e if( a->wtFlags
5d30: 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20   & TERM_ANDINFO 
5d40: 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e  ){.      whereAn
5d50: 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20  dInfoDelete(db, 
5d60: 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a  a->u.pAndInfo);.
5d70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
5d80: 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74  pWC->a!=pWC->aSt
5d90: 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  atic ){.    sqli
5da0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
5db0: 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  C->a);.  }.}../*
5dc0: 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
5dd0: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 65   new WhereTerm e
5de0: 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68 65 72  ntry to the Wher
5df0: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70  eClause object p
5e00: 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57  WC..** The new W
5e10: 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20  hereTerm object 
5e20: 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66  is constructed f
5e30: 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77  rom Expr p and w
5e40: 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20  ith wtFlags..** 
5e50: 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43  The index in pWC
5e60: 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77  ->a[] of the new
5e70: 20 57 68 65 72 65 54 65 72 6d 20 69 73 20 72 65   WhereTerm is re
5e80: 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
5e90: 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72  s..** 0 is retur
5ea0: 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 57  ned if the new W
5eb0: 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e  hereTerm could n
5ec0: 6f 74 20 62 65 20 61 64 64 65 64 20 64 75 65 20  ot be added due 
5ed0: 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61  to a memory.** a
5ee0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e  llocation error.
5ef0: 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c    The memory all
5f00: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20  ocation failure 
5f10: 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64  will be recorded
5f20: 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d   in.** the db->m
5f30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
5f40: 20 73 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d   so that higher-
5f50: 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20  level functions 
5f60: 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a  can detect it..*
5f70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5f80: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
5f90: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
5fa0: 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61  pWC->a[] array a
5fb0: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  s necessary..**.
5fc0: 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61 67  ** If the wtFlag
5fd0: 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75  s argument inclu
5fe0: 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  des TERM_DYNAMIC
5ff0: 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62  , then responsib
6000: 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65  ility.** for fre
6010: 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73 73  eing the express
6020: 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64  ion p is assumed
6030: 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c 61   by the WhereCla
6040: 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a  use object pWC..
6050: 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75 65 20  ** This is true 
6060: 65 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75  even if this rou
6070: 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c  tine fails to al
6080: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65  locate a new Whe
6090: 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41  reTerm..**.** WA
60a0: 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75  RNING:  This rou
60b0: 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c  tine might reall
60c0: 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20  ocate the space 
60d0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
60e0: 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c   WhereTerms.  Al
60f0: 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68  l pointers to Wh
6100: 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20  ereTerms should 
6110: 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  be invalidated a
6120: 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20  fter.** calling 
6130: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53  this routine.  S
6140: 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79  uch pointers may
6150: 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   be reinitialize
6160: 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67  d by referencing
6170: 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d  .** the pWC->a[]
6180: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
6190: 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73  c int whereClaus
61a0: 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61  eInsert(WhereCla
61b0: 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
61c0: 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a  p, u8 wtFlags){.
61d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
61e0: 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rm;.  int idx;. 
61f0: 20 74 65 73 74 63 61 73 65 28 20 77 74 46 6c 61   testcase( wtFla
6200: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
6210: 4c 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 30  L );  /* EV: R-0
6220: 30 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20 20  0211-15100 */.  
6230: 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d  if( pWC->nTerm>=
6240: 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20  pWC->nSlot ){.  
6250: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c    WhereTerm *pOl
6260: 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20  d = pWC->a;.    
6270: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
6280: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
6290: 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d 3e  e->db;.    pWC->
62a0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
62b0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
62c0: 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43  f(pWC->a[0])*pWC
62d0: 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20  ->nSlot*2 );.   
62e0: 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29   if( pWC->a==0 )
62f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74 46 6c  {.      if( wtFl
6300: 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d  ags & TERM_DYNAM
6310: 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  IC ){.        sq
6320: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6330: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a  db, p);.      }.
6340: 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 70        pWC->a = p
6350: 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Old;.      retur
6360: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  n 0;.    }.    m
6370: 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f  emcpy(pWC->a, pO
6380: 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  ld, sizeof(pWC->
6390: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d  a[0])*pWC->nTerm
63a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21  );.    if( pOld!
63b0: 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b  =pWC->aStatic ){
63c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
63d0: 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a  Free(db, pOld);.
63e0: 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e      }.    pWC->n
63f0: 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62  Slot = sqlite3Db
6400: 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70  MallocSize(db, p
6410: 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57  WC->a)/sizeof(pW
6420: 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  C->a[0]);.  }.  
6430: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
6440: 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d  idx = pWC->nTerm
6450: 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45  ++];.  pTerm->pE
6460: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
6470: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b  rSkipCollate(p);
6480: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
6490: 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20 70  s = wtFlags;.  p
64a0: 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Term->pWC = pWC;
64b0: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
64c0: 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  t = -1;.  return
64d0: 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   idx;.}../*.** T
64e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e  his routine iden
64f0: 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73  tifies subexpres
6500: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
6510: 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a  RE clause where.
6520: 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65  ** each subexpre
6530: 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
6540: 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70  ed by the AND op
6550: 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f  erator or some o
6560: 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  ther.** operator
6570: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
6580: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20  e op parameter. 
6590: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
65a0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73   structure.** is
65b0: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69   filled with poi
65c0: 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72  nters to subexpr
65d0: 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78  essions.  For ex
65e0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
65f0: 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f  WHERE  a=='hello
6600: 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62  ' AND coalesce(b
6610: 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31  ,11)<10 AND (c+1
6620: 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a  2!=d OR c==22).*
6630: 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f  *           \___
6640: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
6650: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
6660: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
6670: 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
6680: 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20    slot[0]       
6690: 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20       slot[1]    
66a0: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
66b0: 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  2].**.** The ori
66c0: 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ginal WHERE clau
66d0: 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75  se in pExpr is u
66e0: 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74  naltered.  All t
66f0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
6700: 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74  oes is make slot
6710: 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74  [] entries point
6720: 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65   to substructure
6730: 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a   within pExpr..*
6740: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76  *.** In the prev
6750: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e  ious sentence an
6760: 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  d in the diagram
6770: 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72  , "slot[]" refer
6780: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72  s to.** the Wher
6790: 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61  eClause.a[] arra
67a0: 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61  y.  The slot[] a
67b0: 72 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65  rray grows as ne
67c0: 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  eded to contain.
67d0: 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ** all terms of 
67e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
67f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6800: 20 77 68 65 72 65 53 70 6c 69 74 28 57 68 65 72   whereSplit(Wher
6810: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
6820: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f  pr *pExpr, int o
6830: 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20  p){.  pWC->op = 
6840: 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20 70 45  (u8)op;.  if( pE
6850: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
6860: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
6870: 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72  !=op ){.    wher
6880: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
6890: 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  C, pExpr, 0);.  
68a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65  }else{.    where
68b0: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
68c0: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20  ->pLeft, op);.  
68d0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
68e0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
68f0: 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   op);.  }.}../*.
6900: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
6910: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a  WhereMaskSet obj
6920: 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ect.*/.#define i
6930: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28  nitMaskSet(P)  (
6940: 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52  P)->n=0../*.** R
6950: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
6960: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
6970: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
6980: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
6990: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
69a0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
69b0: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
69c0: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
69d0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
69e0: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
69f0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
6a00: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
6a10: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
6a20: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
6a30: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
6a40: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
6a50: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
6a60: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
6a70: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
6a80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6a90: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6aa0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
6ab0: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
6ac0: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
6ad0: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
6ae0: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
6af0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
6b00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
6b10: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
6b20: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
6b30: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
6b40: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
6b50: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
6b60: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
6b70: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
6b80: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
6b90: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
6ba0: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
6bb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
6bc0: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
6bd0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
6be0: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
6bf0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
6c00: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
6c10: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
6c20: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
6c30: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
6c40: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
6c50: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
6c60: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
6c70: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
6c80: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
6c90: 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73  ates.** a bitmas
6ca0: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
6cb0: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
6cc0: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
6cd0: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
6ce0: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
6cf0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
6d00: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
6d10: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
6d20: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
6d30: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
6d40: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
6d50: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
6d60: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
6d70: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
6d80: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
6d90: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
6da0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
6db0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
6dc0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
6dd0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
6de0: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
6df0: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
6e00: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
6e10: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
6e20: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
6e30: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
6e40: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
6e50: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
6e60: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
6e70: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
6e80: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
6e90: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
6ea0: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
6eb0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
6ec0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
6ed0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
6ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
6ef0: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
6f00: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
6f10: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
6f20: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
6f30: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
6f40: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
6f50: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
6f60: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
6f70: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
6f80: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
6f90: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
6fa0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
6fb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
6fc0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6fd0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
6fe0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
6ff0: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
7000: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
7010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
7020: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
7030: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
7040: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
7050: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
7060: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
7070: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
7080: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
7090: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
70a0: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
70b0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
70c0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
70d0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
70e0: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
70f0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
7100: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
7110: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
7120: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
7130: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
7140: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
7150: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
7160: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
7170: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
7180: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
7190: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
71a0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
71b0: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
71c0: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
71d0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
71e0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
71f0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
7200: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
7210: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
7220: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
7230: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
7240: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
7250: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
7260: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7270: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
7280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7290: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
72a0: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
72b0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
72c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
72d0: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
72e0: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
72f0: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
7300: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
7310: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
7320: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
7330: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
7340: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
7350: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
7360: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c  <=", ">=", "IN",
7370: 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a   and "IS NULL".*
7380: 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  *.** IMPLEMENTAT
7390: 49 4f 4e 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d  ION-OF: R-59926-
73a0: 32 36 33 39 33 20 54 6f 20 62 65 20 75 73 61 62  26393 To be usab
73b0: 6c 65 20 62 79 20 61 6e 20 69 6e 64 65 78 20 61  le by an index a
73c0: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a   term must be.**
73d0: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
73e0: 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20  ollowing forms: 
73f0: 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 65 73 73  column = express
7400: 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70  ion column > exp
7410: 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d  ression.** colum
7420: 6e 20 3e 3d 20 65 78 70 72 65 73 73 69 6f 6e 20  n >= expression 
7430: 63 6f 6c 75 6d 6e 20 3c 20 65 78 70 72 65 73 73  column < express
7440: 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78  ion column <= ex
7450: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72  pression.** expr
7460: 65 73 73 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20  ession = column 
7470: 65 78 70 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c  expression > col
7480: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3e  umn expression >
7490: 3d 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72  = column.** expr
74a0: 65 73 73 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20  ession < column 
74b0: 65 78 70 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f  expression <= co
74c0: 6c 75 6d 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a  lumn column IN.*
74d0: 2a 20 28 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  * (expression-li
74e0: 73 74 29 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73  st) column IN (s
74f0: 75 62 71 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20  ubquery) column 
7500: 49 53 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69  IS NULL.*/.stati
7510: 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28  c int allowedOp(
7520: 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72  int op){.  asser
7530: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26  t( TK_GT>TK_EQ &
7540: 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b  & TK_GT<TK_GE );
7550: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54  .  assert( TK_LT
7560: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c  >TK_EQ && TK_LT<
7570: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
7580: 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26  t( TK_LE>TK_EQ &
7590: 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b  & TK_LE<TK_GE );
75a0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45  .  assert( TK_GE
75b0: 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72  ==TK_EQ+4 );.  r
75c0: 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20  eturn op==TK_IN 
75d0: 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26  || (op>=TK_EQ &&
75e0: 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f   op<=TK_GE) || o
75f0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a  p==TK_ISNULL;.}.
7600: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20  ./*.** Swap two 
7610: 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20  objects of type 
7620: 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  TYPE..*/.#define
7630: 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20   SWAP(TYPE,A,B) 
7640: 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20  {TYPE t=A; A=B; 
7650: 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  B=t;}../*.** Com
7660: 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f  mute a compariso
7670: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70  n operator.  Exp
7680: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
7690: 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a  form "X op Y".**
76a0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
76b0: 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a  nto "Y op X"..**
76c0: 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68  .** If left/righ
76d0: 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c  t precedence rul
76e0: 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61  es come into pla
76f0: 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69  y when determini
7700: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74  ng the.** collat
7710: 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 74 68  ing sequence, th
7720: 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  en COLLATE opera
7730: 74 6f 72 73 20 61 72 65 20 61 64 6a 75 73 74 65  tors are adjuste
7740: 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  d to ensure.** t
7750: 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  hat the collatin
7760: 67 20 73 65 71 75 65 6e 63 65 20 64 6f 65 73 20  g sequence does 
7770: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20 46 6f 72  not change.  For
7780: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20   example:.** "Y 
7790: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
77a0: 70 20 58 22 20 62 65 63 6f 6d 65 73 20 22 58 20  p X" becomes "X 
77b0: 6f 70 20 59 22 20 62 65 63 61 75 73 65 20 61 6e  op Y" because an
77c0: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
77d0: 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c  ence on.** the l
77e0: 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  eft hand side of
77f0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76   a comparison ov
7800: 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c  errides any coll
7810: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a  ation sequence .
7820: 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ** attached to t
7830: 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68  he right. For th
7840: 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68  e same reason th
7850: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
7860: 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d  g.** is not comm
7870: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
7880: 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65  void exprCommute
7890: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
78a0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
78b0: 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28  u16 expRight = (
78c0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
78d0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
78e0: 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66  e);.  u16 expLef
78f0: 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  t = (pExpr->pLef
7900: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
7910: 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  llate);.  assert
7920: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70  ( allowedOp(pExp
7930: 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d  r->op) && pExpr-
7940: 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op!=TK_IN );.  
7950: 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78  if( expRight==ex
7960: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20  pLeft ){.    /* 
7970: 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20 62  Either X and Y b
7980: 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  oth have COLLATE
7990: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69   operator or nei
79a0: 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69  ther do */.    i
79b0: 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20  f( expRight ){. 
79c0: 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61       /* Both X a
79d0: 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54  nd Y have COLLAT
79e0: 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61  E operators.  Ma
79f0: 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c 77  ke sure X is alw
7a00: 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  ays.      ** use
7a10: 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68  d by clearing th
7a20: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
7a30: 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20  g from Y. */.   
7a40: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
7a50: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43  ->flags &= ~EP_C
7a60: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73  ollate;.    }els
7a70: 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70  e if( sqlite3Exp
7a80: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
7a90: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
7aa0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65  0 ){.      /* Ne
7ab0: 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61  ither X nor Y ha
7ac0: 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  ve COLLATE opera
7ad0: 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73 20  tors, but X has 
7ae0: 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20  a non-default.  
7af0: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67      ** collating
7b00: 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61   sequence.  So a
7b10: 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74  dd the EP_Collat
7b20: 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f  e marker on X to
7b30: 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20   cause.      ** 
7b40: 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  it to be searche
7b50: 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20  d first. */.    
7b60: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
7b70: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c  flags |= EP_Coll
7b80: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ate;.    }.  }. 
7b90: 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70   SWAP(Expr*,pExp
7ba0: 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d  r->pRight,pExpr-
7bb0: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
7bc0: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
7bd0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ){.    assert( T
7be0: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
7bf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
7c00: 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20  GE==TK_LE+2 );. 
7c10: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
7c20: 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  >TK_EQ );.    as
7c30: 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c  sert( TK_GT<TK_L
7c40: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
7c50: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
7c60: 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d  T && pExpr->op<=
7c70: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78  TK_GE );.    pEx
7c80: 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72  pr->op = ((pExpr
7c90: 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54  ->op-TK_GT)^2)+T
7ca0: 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_GT;.  }.}../*.
7cb0: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  ** Translate fro
7cc0: 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72  m TK_xx operator
7cd0: 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73   to WO_xx bitmas
7ce0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  k..*/.static u16
7cf0: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e   operatorMask(in
7d00: 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a  t op){.  u16 c;.
7d10: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
7d20: 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28  dOp(op) );.  if(
7d30: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
7d40: 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d    c = WO_IN;.  }
7d50: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
7d60: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20  ISNULL ){.    c 
7d70: 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  = WO_ISNULL;.  }
7d80: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7d90: 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  ( (WO_EQ<<(op-TK
7da0: 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20 29  _EQ)) < 0x7fff )
7db0: 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29 28  ;.    c = (u16)(
7dc0: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
7dd0: 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
7de0: 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op!=TK_ISNULL 
7df0: 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  || c==WO_ISNULL 
7e00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
7e10: 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_IN || c==WO_
7e20: 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IN );.  assert( 
7e30: 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d  op!=TK_EQ || c==
7e40: 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72  WO_EQ );.  asser
7e50: 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op!=TK_LT || 
7e60: 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73  c==WO_LT );.  as
7e70: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20  sert( op!=TK_LE 
7e80: 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20  || c==WO_LE );. 
7e90: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
7ea0: 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29  GT || c==WO_GT )
7eb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
7ec0: 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GE || c==WO_G
7ed0: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  E );.  return c;
7ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
7ef0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68  e to the next Wh
7f00: 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74  ereTerm that mat
7f10: 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  ches according t
7f20: 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  o the criteria.*
7f30: 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77 68  * established wh
7f40: 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a  en the pScan obj
7f50: 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69  ect was initiali
7f60: 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61 6e  zed by whereScan
7f70: 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72  Init()..** Retur
7f80: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
7f90: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63  are no more matc
7fa0: 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e  hing WhereTerms.
7fb0: 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d 20 2a 77  .*/.WhereTerm *w
7fc0: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65  hereScanNext(Whe
7fd0: 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a  reScan *pScan){.
7fe0: 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
7ff0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
8000: 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20  rsor on the LHS 
8010: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
8020: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
8030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
8040: 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  umn on the LHS o
8050: 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20  f the term.  -1 
8060: 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70  for IPK */.  Exp
8070: 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
8080: 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
8090: 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  on being tested 
80a0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
80b0: 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f   *pWC;    /* Sho
80c0: 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e  rthand for pScan
80d0: 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65  ->pWC */.  Where
80e0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
80f0: 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  /* The term bein
8100: 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  g tested */.  in
8110: 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20  t k = pScan->k; 
8120: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
8130: 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f  tart scanning */
8140: 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e  ..  while( pScan
8150: 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d  ->iEquiv<=pScan-
8160: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69  >nEquiv ){.    i
8170: 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71  Cur = pScan->aEq
8180: 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69  uiv[pScan->iEqui
8190: 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d  v-2];.    iColum
81a0: 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  n = pScan->aEqui
81b0: 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d  v[pScan->iEquiv-
81c0: 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  1];.    while( (
81d0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
81e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
81f0: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b  r(pTerm=pWC->a+k
8200: 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; k<pWC->nTerm; 
8210: 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  k++, pTerm++){. 
8220: 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
8230: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
8240: 75 72 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c  ur && pTerm->u.l
8250: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
8260: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
8270: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
8280: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
8290: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
82a0: 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  && pScan->nEquiv
82b0: 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e  <ArraySize(pScan
82c0: 2d 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20 20  ->aEquiv).      
82d0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
82e0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
82f0: 20 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74        pX = sqlit
8300: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
8310: 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  e(pTerm->pExpr->
8320: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
8330: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d       assert( pX-
8340: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
8350: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
8360: 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e  r(j=0; j<pScan->
8370: 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20  nEquiv; j+=2){. 
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
8390: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
83a0: 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20  ]==pX->iTable.  
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
83c0: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b  pScan->aEquiv[j+
83d0: 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20  1]==pX->iColumn 
83e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
83f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8400: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8420: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63        if( j==pSc
8430: 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20  an->nEquiv ){.  
8440: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
8450: 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70  n->aEquiv[j] = p
8460: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  X->iTable;.     
8470: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
8480: 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58  aEquiv[j+1] = pX
8490: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
84a0: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
84b0: 6e 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20  nEquiv += 2;.   
84c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
84d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
84e0: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
84f0: 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e  erator & pScan->
8500: 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  opMask)!=0 ){.  
8510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72            /* Ver
8520: 69 66 79 20 74 68 65 20 61 66 66 69 6e 69 74 79  ify the affinity
8530: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
8540: 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f  equence match */
8550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8560: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
8570: 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70  e && (pTerm->eOp
8580: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
8590: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
85a0: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
85b0: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
85c0: 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61        Parse *pPa
85d0: 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  rse = pWC->pWInf
85e0: 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  o->pParse;.     
85f0: 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54           pX = pT
8600: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
8610: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
8620: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
8630: 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d  ityOk(pX, pScan-
8640: 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20  >idxaff) ){.    
8650: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
8660: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
8670: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8680: 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70      assert(pX->p
8690: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
86a0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
86b0: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
86c0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
86d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8700: 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58     pX->pLeft, pX
8710: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
8720: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
8730: 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
8740: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
8750: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
8760: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8770: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
8780: 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f  Name, pScan->zCo
8790: 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  llName) ){.     
87a0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
87b0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
87c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
87d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
87e0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
87f0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30  ator & WO_EQ)!=0
8800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
8810: 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   (pX = pTerm->pE
8820: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
8830: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
8840: 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e           && pX->
8850: 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61  iTable==pScan->a
8860: 45 71 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20  Equiv[0].       
8870: 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f        && pX->iCo
8880: 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71  lumn==pScan->aEq
8890: 75 69 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20  uiv[1].         
88a0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
88b0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
88c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
88d0: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b          pScan->k
88e0: 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20   = k+1;.        
88f0: 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d      return pTerm
8900: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8920: 20 20 20 20 20 20 70 57 43 20 3d 20 70 53 63 61        pWC = pSca
8930: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
8940: 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20  pWC->pOuter;.   
8950: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     k = 0;.    }.
8960: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
8970: 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b   pScan->pOrigWC;
8980: 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20  .    k = 0;.    
8990: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b 3d  pScan->iEquiv +=
89a0: 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   2;.  }.  return
89b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
89c0: 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20  tialize a WHERE 
89d0: 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f  clause scanner o
89e0: 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61  bject.  Return a
89f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
8a00: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20  ** first match. 
8a10: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
8a20: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74  there are no mat
8a30: 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ches..**.** The 
8a40: 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20  scanner will be 
8a50: 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48  searching the WH
8a60: 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20  ERE clause pWC. 
8a70: 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a   It will look.**
8a80: 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68   for terms of th
8a90: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
8aa0: 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69  expr>" where X i
8ab0: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e  s column iColumn
8ac0: 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75   of table.** iCu
8ad0: 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73  r.  The <op> mus
8ae0: 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  t be one of the 
8af0: 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69  operators descri
8b00: 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a  bed by opMask..*
8b10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72  *.** If the sear
8b20: 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20  ch is for X and 
8b30: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
8b40: 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20   contains terms 
8b50: 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58  of the.** form X
8b60: 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  =Y then this rou
8b70: 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20  tine might also 
8b80: 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20  return terms of 
8b90: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c  the form.** "Y <
8ba0: 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68  op> <expr>".  Th
8bb0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  e number of leve
8bc0: 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69  ls of transitivi
8bd0: 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a  ty is limited,.*
8be0: 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20  * but is enough 
8bf0: 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63  to handle most c
8c00: 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e  ommonly occurrin
8c10: 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  g SQL statements
8c20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
8c30: 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20  not the INTEGER 
8c40: 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e  PRIMARY KEY then
8c50: 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61   X must be compa
8c60: 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e  tible with.** in
8c70: 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 57 68 65  dex pIdx..*/.Whe
8c80: 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61  reTerm *whereSca
8c90: 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63  nInit(.  WhereSc
8ca0: 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20  an *pScan,      
8cb0: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61   /* The WhereSca
8cc0: 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69  n object being i
8cd0: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
8ce0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
8cf0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  ,       /* The W
8d00: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
8d10: 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69  e scanned */.  i
8d20: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
8d30: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
8d40: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
8d50: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
8d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
8d70: 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  umn to scan for 
8d80: 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c  */.  u32 opMask,
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8da0: 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73  Operator(s) to s
8db0: 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64  can for */.  Ind
8dc0: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
8dd0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
8de0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
8df0: 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  this index */.){
8e00: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20  .  int j;..  /* 
8e10: 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30 2c  memset(pScan, 0,
8e20: 20 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29   sizeof(*pScan))
8e30: 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f  ; */.  pScan->pO
8e40: 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70  rigWC = pWC;.  p
8e50: 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Scan->pWC = pWC;
8e60: 0a 20 20 69 66 28 20 70 49 64 78 20 26 26 20 69  .  if( pIdx && i
8e70: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
8e80: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d   pScan->idxaff =
8e90: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
8ea0: 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  Col[iColumn].aff
8eb0: 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a  inity;.    for(j
8ec0: 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  =0; pIdx->aiColu
8ed0: 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20  mn[j]!=iColumn; 
8ee0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
8ef0: 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e  NEVER(j>=pIdx->n
8f00: 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e  Column) ) return
8f10: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   0;.    }.    pS
8f20: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d  can->zCollName =
8f30: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
8f40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8f50: 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30  Scan->idxaff = 0
8f60: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f  ;.    pScan->zCo
8f70: 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  llName = 0;.  }.
8f80: 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20    pScan->opMask 
8f90: 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61  = opMask;.  pSca
8fa0: 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61  n->k = 0;.  pSca
8fb0: 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69  n->aEquiv[0] = i
8fc0: 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45  Cur;.  pScan->aE
8fd0: 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d  quiv[1] = iColum
8fe0: 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75  n;.  pScan->nEqu
8ff0: 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d  iv = 2;.  pScan-
9000: 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72  >iEquiv = 2;.  r
9010: 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e  eturn whereScanN
9020: 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f  ext(pScan);.}../
9030: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
9040: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
9050: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
9060: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
9070: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
9080: 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72  * where X is a r
9090: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
90a0: 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65  iColumn of table
90b0: 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69   iCur and <op> i
90c0: 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20  s one of.** the 
90d0: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
90e0: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
90f0: 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  y the op paramet
9100: 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  er..** Return a 
9110: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
9120: 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69  erm.  Return 0 i
9130: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
9140: 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75  ** The term retu
9150: 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d  rned might by Y=
9160: 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20  <expr> if there 
9170: 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74  is another const
9180: 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  raint in.** the 
9190: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
91a0: 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  t specifies that
91b0: 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20   X=Y.  Any such 
91c0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c  constraints will
91d0: 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65   be.** identifie
91e0: 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49  d by the WO_EQUI
91f0: 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65  V bit in the pTe
9200: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69  rm->eOperator fi
9210: 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71  eld.  The.** aEq
9220: 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64  uiv[] array hold
9230: 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  s X and all its 
9240: 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74  equivalents, wit
9250: 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61  h each SQL varia
9260: 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70  ble.** taking up
9270: 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45   two slots in aE
9280: 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72  quiv[].  The fir
9290: 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74  st slot is for t
92a0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
92b0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f  .** and the seco
92c0: 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f  nd is for the co
92d0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68  lumn number.  Th
92e0: 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73  ere are 22 slots
92f0: 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20   in aEquiv[].** 
9300: 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  so that means we
9310: 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20   can look for X 
9320: 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74  plus up to 10 ot
9330: 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76  her equivalent v
9340: 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20  alues..** Hence 
9350: 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77  a search for X w
9360: 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72  ill return <expr
9370: 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31  > if X=A1 and A1
9380: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a  =A2 and A2=A3.**
9390: 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d   and ... and A9=
93a0: 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70  A10 and A10=<exp
93b0: 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r>..**.** If the
93c0: 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20  re are multiple 
93d0: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
93e0: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
93f0: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
9400: 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72  xpr>".** then tr
9410: 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69  y for the one wi
9420: 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69  th no dependenci
9430: 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69  es on <expr> - i
9440: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68  n other words wh
9450: 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73  ere.** <expr> is
9460: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
9470: 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b  ession of some k
9480: 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72  ind.  Only retur
9490: 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20  n entries of.** 
94a0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
94b0: 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61   Y" where Y is a
94c0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68   column in anoth
94d0: 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74  er table if no t
94e0: 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66  erms of.** the f
94f0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e  orm "X <op> <con
9500: 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e  st-expr>" exist.
9510: 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77     If no terms w
9520: 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52  ith a constant R
9530: 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79  HS.** exist, try
9540: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72   to return a ter
9550: 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  m that does not 
9560: 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f  use WO_EQUIV..*/
9570: 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72  .static WhereTer
9580: 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57  m *findTerm(.  W
9590: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
95a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
95b0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
95c0: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74  earched */.  int
95d0: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
95e0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
95f0: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
9600: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
9610: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
9620: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
9630: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
9640: 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20  ady,     /* RHS 
9650: 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70  must not overlap
9660: 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20   with this mask 
9670: 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20  */.  u32 op,    
9680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
9690: 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75  sk of WO_xx valu
96a0: 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70  es describing op
96b0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  erator */.  Inde
96c0: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
96d0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
96e0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
96f0: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
9700: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  NULL */.){.  Whe
9710: 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20  reTerm *pResult 
9720: 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  = 0;.  WhereTerm
9730: 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e   *p;.  WhereScan
9740: 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68   scan;..  p = wh
9750: 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
9760: 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43  n, pWC, iCur, iC
9770: 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29  olumn, op, pIdx)
9780: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
9790: 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
97a0: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
97b0: 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)==0 ){.      
97c0: 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67  if( p->prereqRig
97d0: 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70  ht==0 && (p->eOp
97e0: 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30  erator&WO_EQ)!=0
97f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
9800: 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn p;.      }.  
9810: 20 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d      if( pResult=
9820: 3d 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70  =0 ) pResult = p
9830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
9840: 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73  whereScanNext(&s
9850: 63 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  can);.  }.  retu
9860: 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f  rn pResult;.}../
9870: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
9880: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce */.static vo
9890: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53  id exprAnalyze(S
98a0: 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c  rcList*, WhereCl
98b0: 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  ause*, int);../*
98c0: 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61  .** Call exprAna
98d0: 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  lyze on all term
98e0: 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61  s in a WHERE cla
98f0: 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  use.  .*/.static
9900: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
9910: 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20  eAll(.  SrcList 
9920: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
9930: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
9940: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
9950: 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20  ause *pWC       
9960: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
9970: 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c  lause to be anal
9980: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  yzed */.){.  int
9990: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   i;.  for(i=pWC-
99a0: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
99b0: 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e  i--){.    exprAn
99c0: 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20  alyze(pTabList, 
99d0: 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC, i);.  }.}..
99e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
99f0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
9a00: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ATION./*.** Chec
9a10: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
9a20: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
9a30: 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   is a LIKE or GL
9a40: 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74  OB operator that
9a50: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d  .** can be optim
9a60: 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75  ized using inequ
9a70: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
9a80: 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
9a90: 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61  if it is.** so a
9aa0: 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
9ab0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
9ac0: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
9ad0: 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62   to be optimizib
9ae0: 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74  le, the RHS must
9af0: 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20   be a string.** 
9b00: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65  literal that doe
9b10: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
9b20: 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a   a wildcard.  .*
9b30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c  /.static int isL
9b40: 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72  ikeOrGlob(.  Par
9b50: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
9b60: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
9b70: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
9b80: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
9b90: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
9ba0: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
9bb0: 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  sion */.  Expr *
9bc0: 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50  *ppPrefix,  /* P
9bd0: 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52  ointer to TK_STR
9be0: 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ING expression w
9bf0: 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66  ith pattern pref
9c00: 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73  ix */.  int *pis
9c10: 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75  Complete, /* Tru
9c20: 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69  e if the only wi
9c30: 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74  ldcard is % in t
9c40: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
9c50: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43  r */.  int *pnoC
9c60: 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ase      /* True
9c70: 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73   if uppercase is
9c80: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c   equivalent to l
9c90: 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20  owercase */.){. 
9ca0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
9cb0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53   0;         /* S
9cc0: 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20  tring on RHS of 
9cd0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
9ce0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
9cf0: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a   *pLeft;      /*
9d00: 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   Right and left 
9d10: 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65  size of LIKE ope
9d20: 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c  rator */.  ExprL
9d30: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  ist *pList;     
9d40: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
9d50: 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65   operands to the
9d60: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
9d70: 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20  /.  int c;      
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9d90: 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20  * One character 
9da0: 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  in z[] */.  int 
9db0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
9dc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9dd0: 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64   of non-wildcard
9de0: 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65   prefix characte
9df0: 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b  rs */.  char wc[
9e00: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
9e10: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63     /* Wildcard c
9e20: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73  haracters */.  s
9e30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9e40: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
9e50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9e60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
9e70: 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20  lue *pVal = 0;. 
9e80: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9ea0: 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20  pcode of pRight 
9eb0: 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74  */..  if( !sqlit
9ec0: 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  e3IsLikeFunction
9ed0: 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43  (db, pExpr, pnoC
9ee0: 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20  ase, wc) ){.    
9ef0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69  return 0;.  }.#i
9f00: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44  fdef SQLITE_EBCD
9f10: 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73  IC.  if( *pnoCas
9f20: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e ) return 0;.#e
9f30: 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70  ndif.  pList = p
9f40: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
9f50: 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e   pLeft = pList->
9f60: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[1].pExpr;.  if
9f70: 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f  ( pLeft->op!=TK_
9f80: 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71  COLUMN .   || sq
9f90: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
9fa0: 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45  y(pLeft)!=SQLITE
9fb0: 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c  _AFF_TEXT .   ||
9fc0: 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74   IsVirtual(pLeft
9fd0: 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20  ->pTab).  ){.   
9fe0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35   /* IMP: R-02065
9ff0: 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d  -49465 The left-
a000: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
a010: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70   LIKE or GLOB op
a020: 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20  erator must.    
a030: 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ** be the name o
a040: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
a050: 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66  umn with TEXT af
a060: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72  finity. */.    r
a070: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
a080: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43  ssert( pLeft->iC
a090: 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f  olumn!=(-1) ); /
a0a0: 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65  * Because IPK ne
a0b0: 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54  ver has AFF_TEXT
a0c0: 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20   */..  pRight = 
a0d0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
a0e0: 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74  r;.  op = pRight
a0f0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
a100: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
a110: 20 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e     op = pRight->
a120: 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  op2;.  }.  if( o
a130: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
a140: 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65 70  {.    Vdbe *pRep
a150: 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d  repare = pParse-
a160: 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20  >pReprepare;.   
a170: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67   int iCol = pRig
a180: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ht->iColumn;.   
a190: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
a1a0: 64 62 65 47 65 74 56 61 6c 75 65 28 70 52 65 70  dbeGetValue(pRep
a1b0: 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51  repare, iCol, SQ
a1c0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a  LITE_AFF_NONE);.
a1d0: 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26 20      if( pVal && 
a1e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
a1f0: 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45  pe(pVal)==SQLITE
a200: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a  _TEXT ){.      z
a210: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
a220: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
a230: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  al);.    }.    s
a240: 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
a250: 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64  mask(pParse->pVd
a260: 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61  be, iCol);.    a
a270: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
a280: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c  p==TK_VARIABLE |
a290: 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  | pRight->op==TK
a2a0: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d  _REGISTER );.  }
a2b0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
a2c0: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20  STRING ){.    z 
a2d0: 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  = pRight->u.zTok
a2e0: 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20  en;.  }.  if( z 
a2f0: 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  ){.    cnt = 0;.
a300: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b      while( (c=z[
a310: 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77  cnt])!=0 && c!=w
a320: 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d  c[0] && c!=wc[1]
a330: 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a   && c!=wc[2] ){.
a340: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
a350: 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
a360: 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a 5b  0 && 255!=(u8)z[
a370: 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20  cnt-1] ){.      
a380: 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a 20  Expr *pPrefix;. 
a390: 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74       *pisComplet
a3a0: 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20  e = c==wc[0] && 
a3b0: 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20  z[cnt+1]==0;.   
a3c0: 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71 6c     pPrefix = sql
a3d0: 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
a3e0: 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20  STRING, z);.    
a3f0: 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29 20    if( pPrefix ) 
a400: 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65  pPrefix->u.zToke
a410: 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20  n[cnt] = 0;.    
a420: 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50    *ppPrefix = pP
a430: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66 28  refix;.      if(
a440: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
a450: 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
a460: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
a470: 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dbe;.        sql
a480: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
a490: 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43  sk(v, pRight->iC
a4a0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
a4b0: 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  if( *pisComplete
a4c0: 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54   && pRight->u.zT
a4d0: 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20  oken[1] ){.     
a4e0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
a4f0: 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65  hs of the LIKE e
a500: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
a510: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  ariable, and the
a520: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
a530: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
a540: 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e  he variable mean
a550: 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  s there is no ne
a560: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
a570: 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20   LIKE.          
a580: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ** function, the
a590: 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65  n no OP_Variable
a5a0: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
a5b0: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  o the program.. 
a5c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
a5d0: 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73   causes problems
a5e0: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
a5f0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
a600: 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20  name().         
a610: 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b   ** API. To work
a620: 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64  around them, add
a630: 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69   a dummy OP_Vari
a640: 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  able here..     
a650: 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20       */ .       
a660: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
a670: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a680: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
a690: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
a6a0: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
a6b0: 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20  Right, r1);.    
a6c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a6d0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c  eChangeP3(v, sql
a6e0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
a6f0: 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20  ddr(v)-1, 0);.  
a700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
a710: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
a720: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
a730: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a740: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
a750: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
a760: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
a770: 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75  ee(pVal);.  retu
a780: 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e  rn (z!=0);.}.#en
a790: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
a7a0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
a7b0: 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  TION */...#ifnde
a7c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
a7d0: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
a7e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
a7f0: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
a800: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
a810: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
a820: 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20     column MATCH 
a830: 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  expr.**.** If it
a840: 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20   is then return 
a850: 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72  TRUE.  If not, r
a860: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a  eturn FALSE..*/.
a870: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74  static int isMat
a880: 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78  chOfColumn(.  Ex
a890: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f  pr *pExpr      /
a8a0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
a8b0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45  ession */.){.  E
a8c0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
a8d0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
a8e0: 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  !=TK_FUNCTION ){
a8f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a900: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
a910: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
a920: 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29  .zToken,"match")
a930: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
a940: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
a950: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
a960: 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  t;.  if( pList->
a970: 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20  nExpr!=2 ){.    
a980: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a990: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  if( pList->a[1].
a9a0: 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f  pExpr->op != TK_
a9b0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65  COLUMN ){.    re
a9c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
a9d0: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
a9e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
a9f0: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
aa00: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42  ./*.** If the pB
aa10: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ase expression o
aa20: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
aa30: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
aa40: 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e  use of.** a join
aa50: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
aa60: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
aa70: 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f  markings over to
aa80: 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61   derived..*/.sta
aa90: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65  tic void transfe
aaa0: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78  rJoinMarkings(Ex
aab0: 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78  pr *pDerived, Ex
aac0: 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44  pr *pBase){.  pD
aad0: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
aae0: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
aaf0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70  EP_FromJoin;.  p
ab00: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
ab10: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
ab20: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
ab30: 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  e;.}..#if !defin
ab40: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
ab50: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
ab60: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
ab70: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
ab80: 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  )./*.** Analyze 
ab90: 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73  a term that cons
aba0: 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ists of two or m
abb0: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
abc0: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53  .** subterms.  S
abd0: 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o in:.**.**     
abe0: 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29  ... WHERE  (a=5)
abf0: 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39   AND (b=7 OR c=9
ac00: 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64   OR d=13) AND (d
ac10: 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =13).**         
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e   ^^^^^^^^^^^^^^^
ac40: 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ^^^^^.**.** This
ac50: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
ac60: 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  s terms such as 
ac70: 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20  the middle term 
ac80: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61  in the above exa
ac90: 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65  mple..** A Where
aca0: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  OrTerm object is
acb0: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74   computed and at
acc0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65  tached to the te
acd0: 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c  rm under.** anal
ace0: 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73  ysis, regardless
acf0: 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20   of the outcome 
ad00: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  of the analysis.
ad10: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
ad20: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46     WhereTerm.wtF
ad30: 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f  lags   |=  TERM_
ad40: 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68  ORINFO.**     Wh
ad50: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
ad60: 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61  o  =  a dynamica
ad70: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
ad80: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
ad90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
ada0: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d  being analyzed m
adb0: 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20  ust have two or 
adc0: 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65  more of OR-conne
add0: 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a  cted subterms..*
ade0: 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
adf0: 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65  rm might be a se
ae00: 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  t of AND-connect
ae10: 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e  ed sub-subterms.
ae20: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  .** Examples of 
ae30: 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c  terms under anal
ae40: 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ysis:.**.**     
ae50: 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (A)     t1.x=t2.
ae60: 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f  y OR t1.x=t2.z O
ae70: 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e  R t1.y=15 OR t1.
ae80: 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20  z=t3.a+5.**     
ae90: 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (B)     x=expr1 
aea0: 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d  OR expr2=x OR x=
aeb0: 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29  expr3.**     (C)
aec0: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
aed0: 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44  R (t1.x=t2.z AND
aee0: 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20   t1.y=15).**    
aef0: 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31   (D)     x=expr1
af00: 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c   OR (y>11 AND y<
af10: 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a  22 AND z LIKE '*
af20: 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20  hello*').**     
af30: 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41  (E)     (p.a=1 A
af40: 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63  ND q.b=2 AND r.c
af50: 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e  =3) OR (p.x=4 AN
af60: 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d  D q.y=5 AND r.z=
af70: 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a  6).**.** CASE 1:
af80: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
af90: 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68  bterms are of th
afa0: 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20  e form T.C=expr 
afb0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
afc0: 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a  column of C and.
afd0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ** a single tabl
afe0: 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e  e T (as shown in
aff0: 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65   example B above
b000: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  ) then create a 
b010: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
b020: 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65  erm that is an e
b030: 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70  quivalent IN exp
b040: 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  ression.  In oth
b050: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
b060: 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61   term.** being a
b070: 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a  nalyzed is:.**.*
b080: 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72 31  *      x = expr1
b090: 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20    OR  expr2 = x 
b0a0: 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a   OR  x = expr3.*
b0b0: 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65  *.** then create
b0c0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
b0d0: 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  erm like this:.*
b0e0: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
b0f0: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
b100: 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a  3).**.** CASE 2:
b110: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
b120: 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78  bterms are index
b130: 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65  able by a single
b140: 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73   table T, then s
b150: 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  et.**.**     Whe
b160: 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72  reTerm.eOperator
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
b180: 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68   WO_OR.**     Wh
b190: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
b1a0: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d  o->indexable  |=
b1b0: 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    the cursor num
b1c0: 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a  ber for table T.
b1d0: 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  **.** A subterm 
b1e0: 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69  is "indexable" i
b1f0: 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20 66  f it is of the f
b200: 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e  orm.** "T.C <op>
b210: 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 43   <expr>" where C
b220: 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f   is any column o
b230: 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a  f table T and .*
b240: 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  * <op> is one of
b250: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c   "=", "<", "<=",
b260: 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20   ">", ">=", "IS 
b270: 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a  NULL", or "IN"..
b280: 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20  ** A subterm is 
b290: 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69  also indexable i
b2a0: 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f  f it is an AND o
b2b0: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  f two or more.**
b2c0: 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74 20   subsubterms at 
b2d0: 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69  least one of whi
b2e0: 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e  ch is indexable.
b2f0: 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20    Indexable AND 
b300: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76  .** subterms hav
b310: 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f  e their eOperato
b320: 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20  r set to WO_AND 
b330: 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a  and they have.**
b340: 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20   u.pAndInfo set 
b350: 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  to a dynamically
b360: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
b370: 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a  AndTerm object..
b380: 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68  **.** From anoth
b390: 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77  er point of view
b3a0: 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65  , "indexable" me
b3b0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75 62  ans that the sub
b3c0: 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f  term could.** po
b3d0: 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65  tentially be use
b3e0: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
b3f0: 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  if an appropriat
b400: 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a  e index exists..
b410: 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  ** This analysis
b420: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64   does not consid
b430: 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  er whether or no
b440: 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69 73  t the index exis
b450: 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 73  ts; that.** is s
b460: 6f 6d 65 74 68 69 6e 67 20 74 68 65 20 62 65 73  omething the bes
b470: 74 49 6e 64 65 78 28 29 20 72 6f 75 74 69 6e 65  tIndex() routine
b480: 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65 2e   will determine.
b490: 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 0a    This analysis.
b4a0: 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74  ** only looks at
b4b0: 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d   whether subterm
b4c0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
b4d0: 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74  r indexing exist
b4e0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d  ..**.** All exam
b4f0: 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20 45  ples A through E
b500: 20 61 62 6f 76 65 20 61 6c 6c 20 73 61 74 69 73   above all satis
b510: 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74 20  fy case 2.  But 
b520: 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73  if a term.** als
b530: 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61 73  o statisfies cas
b540: 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29 20  e 1 (such as B) 
b550: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
b560: 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a   optimizer will.
b570: 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65 72  ** always prefer
b580: 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74   case 1, so in t
b590: 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65 74  hat case we pret
b5a0: 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32 20  end that case 2 
b5b0: 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66  is not.** satisf
b5c0: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69  ied..**.** It mi
b5d0: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
b5e0: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61  that multiple ta
b5f0: 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61 62  bles are indexab
b600: 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
b610: 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69  ,.** (E) above i
b620: 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74  s indexable on t
b630: 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20  ables P, Q, and 
b640: 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74  R..**.** Terms t
b650: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
b660: 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74 65   2 are candidate
b670: 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20  s for lookup by 
b680: 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74  using.** separat
b690: 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e  e indices to fin
b6a0: 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63  d rowids for eac
b6b0: 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f  h subterm and co
b6c0: 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75  mposing.** the u
b6d0: 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69  nion of all rowi
b6e0: 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65  ds using a RowSe
b6f0: 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
b700: 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f  is similar.** to
b710: 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73   "bitmap indices
b720: 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62  " in other datab
b730: 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a  ase engines..**.
b740: 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a  ** OTHERWISE:.**
b750: 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63  .** If neither c
b760: 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32  ase 1 nor case 2
b770: 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61   apply, then lea
b780: 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72  ve the eOperator
b790: 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e   set to.** zero.
b7a0: 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e    This term is n
b7b0: 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65  ot useful for se
b7c0: 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  arch..*/.static 
b7d0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
b7e0: 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73  OrTerm(.  SrcLis
b7f0: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
b800: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
b810: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
b820: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
b830: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d        /* the com
b840: 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61 75  plete WHERE clau
b850: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54  se */.  int idxT
b860: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
b870: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
b880: 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20  e OR-term to be 
b890: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
b8a0: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
b8b0: 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
b8c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52  ;        /* WHER
b8d0: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
b8e0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b8f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
b900: 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
b910: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
b920: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
b930: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b940: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
b950: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
b960: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
b970: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
b980: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
b990: 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54  dxTerm];    /* T
b9a0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
b9b0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72  alyzed */.  Expr
b9c0: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
b9d0: 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  >pExpr;         
b9e0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
b9f0: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72  ssion of the ter
ba00: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  m */.  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 2f                 /
ba30: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
ba40: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
ba50: 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f   *pOrWc;       /
ba60: 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65  * Breakup of pTe
ba70: 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  rm into subterms
ba80: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
ba90: 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20  *pOrTerm;       
baa0: 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69  /* A Sub-term wi
bab0: 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a  thin the pOrWc *
bac0: 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  /.  WhereOrInfo 
bad0: 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a  *pOrInfo;     /*
bae0: 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   Additional info
baf0: 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  rmation associat
bb00: 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f  ed with pTerm */
bb10: 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54  .  Bitmask chngT
bb20: 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oIN;         /* 
bb30: 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  Tables that migh
bb40: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31  t satisfy case 1
bb50: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e   */.  Bitmask in
bb60: 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20  dexable;        
bb70: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 61  /* Tables that a
bb80: 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61  re indexable, sa
bb90: 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32 20  tisfying case 2 
bba0: 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72  */..  /*.  ** Br
bbb0: 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73  eak the OR claus
bbc0: 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72  e into its separ
bbd0: 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54  ate subterms.  T
bbe0: 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a  he subterms are.
bbf0: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
bc00: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
bc10: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
bc20: 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68 65  g within the Whe
bc30: 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62  reOrInfo.  ** ob
bc40: 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74 74  ject that is att
bc50: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69  ached to the ori
bc60: 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20  ginal OR clause 
bc70: 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  term..  */.  ass
bc80: 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
bc90: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e  lags & (TERM_DYN
bca0: 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  AMIC|TERM_ORINFO
bcb0: 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d  |TERM_ANDINFO))=
bcc0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
bcd0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
bce0: 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70   );.  pTerm->u.p
bcf0: 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f  OrInfo = pOrInfo
bd00: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
bd10: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
bd20: 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20  f(*pOrInfo));.  
bd30: 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29  if( pOrInfo==0 )
bd40: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d   return;.  pTerm
bd50: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
bd60: 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57  M_ORINFO;.  pOrW
bd70: 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63  c = &pOrInfo->wc
bd80: 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
bd90: 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66  nit(pOrWc, pWInf
bda0: 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74  o);.  whereSplit
bdb0: 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54  (pOrWc, pExpr, T
bdc0: 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61  K_OR);.  exprAna
bdd0: 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f  lyzeAll(pSrc, pO
bde0: 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  rWc);.  if( db->
bdf0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
be00: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
be10: 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32   pOrWc->nTerm>=2
be20: 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43   );..  /*.  ** C
be30: 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20 6f  ompute the set o
be40: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69  f tables that mi
be50: 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65  ght satisfy case
be60: 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20  s 1 or 2..  */. 
be70: 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42   indexable = ~(B
be80: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67  itmask)0;.  chng
be90: 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b  ToIN = ~(Bitmask
bea0: 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57  )0;.  for(i=pOrW
beb0: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
bec0: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
bed0: 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b  =0 && indexable;
bee0: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
bef0: 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54 65  {.    if( (pOrTe
bf00: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
bf10: 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b  WO_SINGLE)==0 ){
bf20: 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64 49  .      WhereAndI
bf30: 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20  nfo *pAndInfo;. 
bf40: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f       assert( (pO
bf50: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
bf60: 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54   (TERM_ANDINFO|T
bf70: 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20  ERM_ORINFO))==0 
bf80: 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49  );.      chngToI
bf90: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e  N = 0;.      pAn
bfa0: 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  dInfo = sqlite3D
bfb0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
bfc0: 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29  izeof(*pAndInfo)
bfd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e  );.      if( pAn
bfe0: 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  dInfo ){.       
bff0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41   WhereClause *pA
c000: 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68  ndWC;.        Wh
c010: 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72  ereTerm *pAndTer
c020: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  m;.        int j
c030: 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
c040: 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  k b = 0;.       
c050: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64   pOrTerm->u.pAnd
c060: 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b  Info = pAndInfo;
c070: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
c080: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
c090: 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20  M_ANDINFO;.     
c0a0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65     pOrTerm->eOpe
c0b0: 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a  rator = WO_AND;.
c0c0: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d          pAndWC =
c0d0: 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a   &pAndInfo->wc;.
c0e0: 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c 61          whereCla
c0f0: 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20  useInit(pAndWC, 
c100: 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20  pWC->pWInfo);.  
c110: 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69 74        whereSplit
c120: 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d  (pAndWC, pOrTerm
c130: 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29  ->pExpr, TK_AND)
c140: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
c150: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
c160: 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20  AndWC);.        
c170: 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d  pAndWC->pOuter =
c180: 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65   pWC;.        te
c190: 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c  stcase( db->mall
c1a0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
c1b0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
c1c0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c1d0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
c1e0: 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d  pAndTerm=pAndWC-
c1f0: 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54  >a; j<pAndWC->nT
c200: 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65  erm; j++, pAndTe
c210: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
c220: 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54     assert( pAndT
c230: 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
c240: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c            if( al
c250: 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d  lowedOp(pAndTerm
c260: 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a  ->pExpr->op) ){.
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20                b 
c280: 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  |= getMask(&pWIn
c290: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41  fo->sMaskSet, pA
c2a0: 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ndTerm->leftCurs
c2b0: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  or);.           
c2c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
c2d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c2e0: 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b   indexable &= b;
c2f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
c300: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
c310: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
c320: 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f  OPIED ){.      /
c330: 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d  * Skip this term
c340: 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65   for now.  We re
c350: 76 69 73 69 74 20 69 74 20 77 68 65 6e 20 77 65  visit it when we
c360: 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20   process the.   
c370: 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64     ** correspond
c380: 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ing TERM_VIRTUAL
c390: 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c   term */.    }el
c3a0: 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  se{.      Bitmas
c3b0: 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67  k b;.      b = g
c3c0: 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
c3d0: 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72  sMaskSet, pOrTer
c3e0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
c3f0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
c400: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
c410: 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20  M_VIRTUAL ){.   
c420: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
c430: 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d  pOther = &pOrWc-
c440: 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72  >a[pOrTerm->iPar
c450: 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20  ent];.        b 
c460: 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  |= getMask(&pWIn
c470: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f  fo->sMaskSet, pO
c480: 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72  ther->leftCursor
c490: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c4a0: 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b   indexable &= b;
c4b0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54  .      if( (pOrT
c4c0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
c4d0: 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20   WO_EQ)==0 ){.  
c4e0: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
c4f0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
c500: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
c510: 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  N &= b;.      }.
c520: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
c530: 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20    ** Record the 
c540: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
c550: 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  at satisfy case 
c560: 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68  2.  The set migh
c570: 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e  t be.  ** empty.
c580: 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d  .  */.  pOrInfo-
c590: 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64  >indexable = ind
c5a0: 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d  exable;.  pTerm-
c5b0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64  >eOperator = ind
c5c0: 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20  exable==0 ? 0 : 
c5d0: 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  WO_OR;..  /*.  *
c5e0: 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73  * chngToIN holds
c5f0: 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73   a set of tables
c600: 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61   that *might* sa
c610: 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 42  tisfy case 1.  B
c620: 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20  ut.  ** we have 
c630: 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74  to do some addit
c640: 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74  ional checking t
c650: 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31 20  o see if case 1 
c660: 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73  really.  ** is s
c670: 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20  atisfied..  **. 
c680: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c   ** chngToIN wil
c690: 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c  l hold either 0,
c6a0: 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20   1, or 2 bits.  
c6b0: 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d  The 0-bit case m
c6c0: 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74  eans.  ** that t
c6d0: 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69  here is no possi
c6e0: 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66  bility of transf
c6f0: 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c  orming the OR cl
c700: 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a  ause into an.  *
c710: 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65  * IN operator be
c720: 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  cause one or mor
c730: 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  e terms in the O
c740: 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  R clause contain
c750: 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20  .  ** something 
c760: 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e  other than == on
c770: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
c780: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20   single table.  
c790: 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63  The 1-bit.  ** c
c7a0: 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65  ase means that e
c7b0: 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
c7c0: 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66   OR clause is of
c7d0: 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22   the form.  ** "
c7e0: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70  table.column=exp
c7f0: 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67  r" for some sing
c800: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f  le table.  The o
c810: 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20 73  ne bit that is s
c820: 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72  et.  ** will cor
c830: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63  respond to the c
c840: 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65  ommon table.  We
c850: 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63   still need to c
c860: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a  heck to make.  *
c870: 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 20  * sure the same 
c880: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f  column is used o
c890: 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68  n all terms.  Th
c8a0: 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73 20  e 2-bit case is 
c8b0: 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c  when.  ** the al
c8c0: 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  l terms are of t
c8d0: 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e  he form "table1.
c8e0: 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f  column=table2.co
c8f0: 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20  lumn".  It.  ** 
c900: 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c  might be possibl
c910: 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20  e to form an IN 
c920: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65 69  operator with ei
c930: 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75  ther table1.colu
c940: 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65  mn.  ** or table
c950: 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  2.column as the 
c960: 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69 73  LHS if either is
c970: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
c980: 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68   term of.  ** th
c990: 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a  e OR clause..  *
c9a0: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
c9b0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
c9c0: 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  rm "table.column
c9d0: 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22  1=table.column2"
c9e0: 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20   (the.  ** same 
c9f0: 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69  table on both si
ca00: 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63  zes of the ==) c
ca10: 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a  annot be optimiz
ca20: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ed..  */.  if( c
ca30: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69  hngToIN ){.    i
ca40: 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  nt okToChngToIN 
ca50: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
ca60: 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69   if the conversi
ca70: 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69  on to IN is vali
ca80: 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  d */.    int iCo
ca90: 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20  lumn = -1;      
caa0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64     /* Column ind
cab0: 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20  ex on lhs of IN 
cac0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
cad0: 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31  int iCursor = -1
cae0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
caf0: 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e  le cursor common
cb00: 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f   to all terms */
cb10: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20  .    int j = 0; 
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cb30: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
cb40: 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  /..    /* Search
cb50: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64   for a table and
cb60: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70   column that app
cb70: 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65  ears on one side
cb80: 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
cb90: 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f  ther of the == o
cba0: 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79  perator in every
cbb0: 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20   subterm.  That 
cbc0: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
cbd0: 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
cbe0: 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72  recorded in iCur
cbf0: 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e  sor and iColumn.
cc00: 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f    There might no
cc10: 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20  t be any.    ** 
cc20: 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63  such table and c
cc30: 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f  olumn.  Set okTo
cc40: 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61  ChngToIN if an a
cc50: 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65  ppropriate table
cc60: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75  .    ** and colu
cc70: 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20  mn is found but 
cc80: 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f  leave okToChngTo
cc90: 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20  IN false if not 
cca0: 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  found..    */.  
ccb0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26    for(j=0; j<2 &
ccc0: 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b  & !okToChngToIN;
ccd0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72   j++){.      pOr
cce0: 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b  Term = pOrWc->a;
ccf0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72  .      for(i=pOr
cd00: 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d  Wc->nTerm-1; i>=
cd10: 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  0; i--, pOrTerm+
cd20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
cd30: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
cd40: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
cd50: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
cd60: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54  m->wtFlags &= ~T
cd70: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
cd80: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
cd90: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
cda0: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
cdb0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
cdc0: 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20 77  2-bit case and w
cdd0: 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63  e are on the sec
cde0: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e  ond iteration an
cdf0: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  d.          ** c
ce00: 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66  urrent term is f
ce10: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69 74  rom the first it
ce20: 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69  eration.  So ski
ce30: 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a  p this term. */.
ce40: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
ce50: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
ce60: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
ce70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ce80: 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20  if( (chngToIN & 
ce90: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
cea0: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  >sMaskSet, pOrTe
ceb0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29  rm->leftCursor))
cec0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
ced0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75   /* This term mu
cee0: 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  st be of the for
cef0: 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65  m t1.a==t2.b whe
cf00: 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a  re t2 is in the.
cf10: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e            ** chn
cf20: 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31  gToIN set but t1
cf30: 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74   is not.  This t
cf40: 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68  erm will be eith
cf50: 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20 20  er preceeded.   
cf60: 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c         ** or fol
cf70: 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72  lwed by an inver
cf80: 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d  ted copy (t2.b==
cf90: 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69  t1.a).  Skip thi
cfa0: 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20  s term .        
cfb0: 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73    ** and use its
cfc0: 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20   inversion. */. 
cfd0: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
cfe0: 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  e( pOrTerm->wtFl
cff0: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
d000: 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  D );.          t
d010: 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d  estcase( pOrTerm
d020: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
d030: 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
d040: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
d050: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
d060: 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45   (TERM_COPIED|TE
d070: 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20  RM_VIRTUAL) );. 
d080: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
d090: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
d0a0: 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
d0b0: 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  OrTerm->u.leftCo
d0c0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43  lumn;.        iC
d0d0: 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d  ursor = pOrTerm-
d0e0: 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20  >leftCursor;.   
d0f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d100: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
d110: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
d120: 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61 62  No candidate tab
d130: 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f  le+column was fo
d140: 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f  und.  This can o
d150: 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20  nly occur.      
d160: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f    ** on the seco
d170: 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  nd iteration */.
d180: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d190: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
d1a0: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
d1b0: 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29  fTwo(chngToIN) )
d1c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d1d0: 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d  ( chngToIN==getM
d1e0: 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
d1f0: 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20  skSet, iCursor) 
d200: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
d210: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d220: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29  testcase( j==1 )
d230: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68  ;..      /* We h
d240: 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64  ave found a cand
d250: 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20  idate table and 
d260: 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74  column.  Check t
d270: 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20 20  o see if that.  
d280: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64      ** table and
d290: 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f   column is commo
d2a0: 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  n to every term 
d2b0: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
d2c0: 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68   */.      okToCh
d2d0: 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  ngToIN = 1;.    
d2e0: 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20    for(; i>=0 && 
d2f0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d  okToChngToIN; i-
d300: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
d310: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d320: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
d330: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
d340: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
d350: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
d360: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
d370: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
d380: 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f  ags &= ~TERM_OR_
d390: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OK;.        }els
d3a0: 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75  e if( pOrTerm->u
d3b0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f  .leftColumn!=iCo
d3c0: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
d3d0: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
d3e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
d3f0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
d400: 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67   affLeft, affRig
d410: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ht;.          /*
d420: 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68 61   If the right-ha
d430: 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20  nd side is also 
d440: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74  a column, then t
d450: 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20  he affinities.  
d460: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f          ** of bo
d470: 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66  th right and lef
d480: 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65 20  t sides must be 
d490: 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70  such that no typ
d4a0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
d4b0: 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72  onversions are r
d4c0: 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72  equired on the r
d4d0: 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23  ight.  (Ticket #
d4e0: 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20 20  2249).          
d4f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  */.          aff
d500: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
d510: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54  xprAffinity(pOrT
d520: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
d530: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ht);.          a
d540: 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  ffLeft = sqlite3
d550: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
d560: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
d570: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ft);.          i
d580: 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20 26  f( affRight!=0 &
d590: 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c  & affRight!=affL
d5a0: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
d5b0: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
d5c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
d5d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d5e0: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
d5f0: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b  gs |= TERM_OR_OK
d600: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d620: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
d630: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54   this point, okT
d640: 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75  oChngToIN is tru
d650: 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54  e if original pT
d660: 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20  erm satisfies.  
d670: 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e    ** case 1.  In
d680: 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73   that case, cons
d690: 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72 74  truct a new virt
d6a0: 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73  ual term that is
d6b0: 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63   .    ** pTerm c
d6c0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  onverted into an
d6d0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
d6e0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a 20    **.    ** EV: 
d6f0: 52 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20 20  R-00211-15100.  
d700: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54    */.    if( okT
d710: 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20  oChngToIN ){.   
d720: 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20     Expr *pDup;  
d730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
d740: 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61  ransient duplica
d750: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  te expression */
d760: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
d770: 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a  *pList = 0;   /*
d780: 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   The RHS of the 
d790: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
d7a0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
d7b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
d7c0: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
d7d0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
d7e0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20     Expr *pNew;  
d7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d800: 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65   complete IN ope
d810: 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20  rator */..      
d820: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
d830: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f  rm-1, pOrTerm=pO
d840: 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  rWc->a; i>=0; i-
d850: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
d860: 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
d870: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
d880: 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20  ERM_OR_OK)==0 ) 
d890: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
d8a0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
d8b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
d8c0: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
d8d0: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
d8e0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
d8f0: 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20  rsor );.        
d900: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
d910: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  >u.leftColumn==i
d920: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
d930: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
d940: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54  ExprDup(db, pOrT
d950: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
d960: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
d970: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
d980: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57  xprListAppend(pW
d990: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c  Info->pParse, pL
d9a0: 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ist, pDup);.    
d9b0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54      pLeft = pOrT
d9c0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
d9d0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
d9e0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
d9f0: 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20  0 );.      pDup 
da00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
da10: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
da20: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
da30: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
da40: 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30  , TK_IN, pDup, 0
da50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
da60: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
da70: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
da80: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
da90: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70  Markings(pNew, p
daa0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61  Expr);.        a
dab0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
dac0: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
dad0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
dae0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
daf0: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
db00: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
db10: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
db20: 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d  (pWC, pNew, TERM
db30: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
db40: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
db50: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
db60: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65  ==0 );.        e
db70: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
db80: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
db90: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
dba0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
dbb0: 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  .        pWC->a[
dbc0: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
dbd0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
dbe0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
dbf0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
dc00: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
dc10: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
dc20: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
dc30: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d     }.      pTerm
dc40: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
dc50: 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20  _NOOP;  /* case 
dc60: 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20  1 trumps case 2 
dc70: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  */.    }.  }.}.#
dc80: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
dc90: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
dca0: 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45  ATION && !SQLITE
dcb0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
dcc0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  /../*.** The inp
dcd0: 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
dce0: 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65  ne is an WhereTe
dcf0: 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74  rm structure wit
dd00: 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70  h only the.** "p
dd10: 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c  Expr" field fill
dd20: 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20  ed in.  The job 
dd30: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
dd40: 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  is to analyze th
dd50: 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69  e.** subexpressi
dd60: 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  on and populate 
dd70: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69  all the other fi
dd80: 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72  elds of the Wher
dd90: 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75  eTerm.** structu
dda0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
ddb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
ddc0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70  f the form "<exp
ddd0: 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65  r> <op> X" it ge
dde0: 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74  ts commuted.** t
ddf0: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66  o the standard f
de00: 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c  orm of "X <op> <
de10: 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66  expr>"..**.** If
de20: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
de30: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
de40: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
de50: 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65  both X and Y are
de60: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  .** columns, the
de70: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65  n the original e
de80: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63  xpression is unc
de90: 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77  hanged and a new
dea0: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d   virtual.** term
deb0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20   of the form "Y 
dec0: 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64  <op> X" is added
ded0: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
dee0: 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ause and.** anal
def0: 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  yzed separately.
df00: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
df10: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
df20: 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a  th TERM_COPIED.*
df30: 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65  * and the new te
df40: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
df50: 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28  h TERM_DYNAMIC (
df60: 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78  because it's pEx
df70: 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  pr.** needs to b
df80: 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65  e freed with the
df90: 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e   WhereClause) an
dfa0: 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28  d TERM_VIRTUAL (
dfb0: 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73  because it.** is
dfc0: 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79   a commuted copy
dfd0: 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d   of a prior term
dfe0: 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .)  The original
dff0: 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64   term has nChild
e000: 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f  =1.** and the co
e010: 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74  py has idxParent
e020: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
e030: 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  x of the origina
e040: 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  l term..*/.stati
e050: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
e060: 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ze(.  SrcList *p
e070: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
e080: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
e090: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
e0a0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
e0b0: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
e0c0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
e0d0: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
e0e0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
e0f0: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
e100: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
e110: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
e120: 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
e130: 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  ; /* WHERE claus
e140: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e  e processing con
e150: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
e160: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
e170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e180: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
e190: 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lyzed */.  Where
e1a0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
e1b0: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
e1c0: 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65  et of table inde
e1d0: 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70  x masks */.  Exp
e1e0: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e200: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
e210: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
e220: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
e230: 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  eqLeft;         
e240: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
e250: 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78  sites of the pEx
e260: 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42  pr->pLeft */.  B
e270: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
e280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e290: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
e2a0: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42   of pExpr */.  B
e2b0: 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68  itmask extraRigh
e2c0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
e2d0: 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65  /* Extra depende
e2e0: 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f  ncies on LEFT JO
e2f0: 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53  IN */.  Expr *pS
e300: 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tr1 = 0;        
e310: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20           /* RHS 
e320: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
e330: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
e340: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20  sComplete = 0;  
e350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e360: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
e370: 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61  ends with wildca
e380: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61  rd */.  int noCa
e390: 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
e3a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45           /* LIKE
e3b0: 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73  /GLOB distinguis
e3c0: 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e  hes case */.  in
e3d0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e3f0: 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72  * Top-level oper
e400: 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70  ator.  pExpr->op
e410: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
e420: 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
e430: 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e  arse;  /* Parsin
e440: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
e450: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e460: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
e470: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
e480: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ection */..  if(
e490: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e4a0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
e4b0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
e4c0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
e4d0: 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70  .  pMaskSet = &p
e4e0: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b  WInfo->sMaskSet;
e4f0: 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d  .  pExpr = pTerm
e500: 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->pExpr;.  asser
e510: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
e520: 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  _AS && pExpr->op
e530: 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a  !=TK_COLLATE );.
e540: 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65    prereqLeft = e
e550: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
e560: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
e570: 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45  Left);.  op = pE
e580: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
e590: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
e5a0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
e5b0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
e5c0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
e5d0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
e5e0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
e5f0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
e600: 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63  ight = exprSelec
e610: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
e620: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  kSet, pExpr->x.p
e630: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
e640: 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  se{.      pTerm-
e650: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
e660: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
e670: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
e680: 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
e690: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f   }.  }else if( o
e6a0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
e6b0: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
e6c0: 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65  qRight = 0;.  }e
e6d0: 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  lse{.    pTerm->
e6e0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
e6f0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
e700: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52  skSet, pExpr->pR
e710: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65  ight);.  }.  pre
e720: 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62  reqAll = exprTab
e730: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
e740: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
e750: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
e760: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
e770: 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  in) ){.    Bitma
e780: 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70  sk x = getMask(p
e790: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
e7a0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29  iRightJoinTable)
e7b0: 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20  ;.    prereqAll 
e7c0: 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52  |= x;.    extraR
e7d0: 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20  ight = x-1;  /* 
e7e0: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
e7f0: 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20  may not be used 
e800: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 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 2a 2a 20 6f 6e 20 6c 65 66 74 20       ** on left 
e830: 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
e840: 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33  JOIN.  Ticket #3
e850: 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65  015 */.  }.  pTe
e860: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
e870: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65  prereqAll;.  pTe
e880: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
e890: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50   -1;.  pTerm->iP
e8a0: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54  arent = -1;.  pT
e8b0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
e8c0: 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65   0;.  if( allowe
e8d0: 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45  dOp(op) ){.    E
e8e0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c  xpr *pLeft = sql
e8f0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
e900: 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ate(pExpr->pLeft
e910: 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  );.    Expr *pRi
e920: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
e930: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78  rSkipCollate(pEx
e940: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
e950: 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70   u16 opMask = (p
e960: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
e970: 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d  t & prereqLeft)=
e980: 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f  =0 ? WO_ALL : WO
e990: 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20  _EQUIV;.    if( 
e9a0: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pLeft->op==TK_CO
e9b0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54  LUMN ){.      pT
e9c0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
e9d0: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
e9e0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e  .      pTerm->u.
e9f0: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
ea00: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
ea10: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
ea20: 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61  tor = operatorMa
ea30: 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b  sk(op) & opMask;
ea40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
ea50: 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d  Right && pRight-
ea60: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
ea70: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
ea80: 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45  m *pNew;.      E
ea90: 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20  xpr *pDup;.     
eaa0: 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20   u16 eExtraOp = 
eab0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  0;        /* Ext
eac0: 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77  ra bits for pNew
ead0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ->eOperator */. 
eae0: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
eaf0: 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b  leftCursor>=0 ){
eb00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78  .        int idx
eb10: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75  New;.        pDu
eb20: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
eb30: 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
eb40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
eb50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
eb60: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
eb70: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
eb80: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
eb90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
eba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78     }.        idx
ebb0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
ebc0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75  eInsert(pWC, pDu
ebd0: 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  p, TERM_VIRTUAL|
ebe0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
ebf0: 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65         if( idxNe
ec00: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  w==0 ) return;. 
ec10: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70         pNew = &p
ec20: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
ec30: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61         pNew->iPa
ec40: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
ec50: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
ec60: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
ec70: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
ec80: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
ec90: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
eca0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
ecb0: 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
ecc0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
ecd0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
ece0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
ecf0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
ed00: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  ).         && Op
ed10: 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
ed20: 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61  d(db, SQLITE_Tra
ed30: 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20 20  nsitive).       
ed40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
ed50: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c  erm->eOperator |
ed60: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
ed70: 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d        eExtraOp =
ed80: 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20   WO_EQUIV;.     
ed90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
eda0: 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  {.        pDup =
edb0: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
edc0: 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pNew = pTerm;.  
edd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72      }.      expr
ede0: 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20  Commute(pParse, 
edf0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65  pDup);.      pLe
ee00: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
ee10: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70  SkipCollate(pDup
ee20: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
ee30: 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pNew->leftCursor
ee40: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
ee50: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
ee60: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
ee70: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
ee80: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 72     testcase( (pr
ee90: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
eea0: 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65 71  Right) != prereq
eeb0: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Left );.      pN
eec0: 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  ew->prereqRight 
eed0: 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65  = prereqLeft | e
eee0: 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20  xtraRight;.     
eef0: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c   pNew->prereqAll
ef00: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
ef10: 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61      pNew->eOpera
ef20: 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d  tor = (operatorM
ef30: 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20  ask(pDup->op) + 
ef40: 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61  eExtraOp) & opMa
ef50: 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  sk;.    }.  }..#
ef60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ef70: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
ef80: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20  IZATION.  /* If 
ef90: 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45  a term is the BE
efa0: 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20  TWEEN operator, 
efb0: 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76  create two new v
efc0: 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a  irtual terms.  *
efd0: 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68  * that define th
efe0: 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65  e range that the
eff0: 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65   BETWEEN impleme
f000: 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  nts.  For exampl
f010: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
f020: 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e    a BETWEEN b AN
f030: 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  D c.  **.  ** is
f040: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a   converted into:
f050: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
f060: 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44  (a BETWEEN b AND
f070: 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41   c) AND (a>=b) A
f080: 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20  ND (a<=c).  **. 
f090: 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20   ** The two new 
f0a0: 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
f0b0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
f0c0: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
f0d0: 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65  object..  ** The
f0e0: 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22   new terms are "
f0f0: 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65  dynamic" and are
f100: 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65   children of the
f110: 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45   original BETWEE
f120: 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68  N.  ** term.  Th
f130: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  at means that if
f140: 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72   the BETWEEN ter
f150: 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20  m is coded, the 
f160: 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a  children are.  *
f170: 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20  * skipped.  Or, 
f180: 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  if the children 
f190: 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79  are satisfied by
f1a0: 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f   an index, the o
f1b0: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54  riginal.  ** BET
f1c0: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69  WEEN term is ski
f1d0: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
f1e0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
f1f0: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70  =TK_BETWEEN && p
f200: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
f210: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
f220: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
f230: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  .pList;.    int 
f240: 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  i;.    static co
f250: 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b  nst u8 ops[] = {
f260: 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20  TK_GE, TK_LE};. 
f270: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
f280: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
f290: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
f2a0: 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =2 );.    for(i=
f2b0: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
f2c0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
f2d0: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  pr;.      int id
f2e0: 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNew;.      pNew
f2f0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
f300: 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b  xpr(pParse, ops[
f310: 69 5d 2c 20 0a 20 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 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
f340: 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
f350: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f370: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
f380: 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
f390: 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29  i].pExpr, 0), 0)
f3a0: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
f3b0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
f3c0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
f3d0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
f3e0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
f3f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
f400: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
f410: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
f420: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
f430: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
f440: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
f450: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
f460: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
f470: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  idxTerm;.    }. 
f480: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
f490: 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 2;.  }.#endif
f4a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f4b0: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
f4c0: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65  TION */..#if !de
f4d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f4e0: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
f4f0: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
f500: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
f510: 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  ERY).  /* Analyz
f520: 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73  e a term that is
f530: 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f   composed of two
f540: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
f550: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  s connected by. 
f560: 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74   ** an OR operat
f570: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  or..  */.  else 
f580: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
f590: 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65  K_OR ){.    asse
f5a0: 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  rt( pWC->op==TK_
f5b0: 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41  AND );.    exprA
f5c0: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72  nalyzeOrTerm(pSr
f5d0: 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29  c, pWC, idxTerm)
f5e0: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
f5f0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
f600: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
f610: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
f620: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
f630: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f640: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
f650: 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e  ION.  /* Add con
f660: 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75  straints to redu
f670: 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ce the search sp
f680: 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72  ace on a LIKE or
f690: 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61   GLOB.  ** opera
f6a0: 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  tor..  **.  ** A
f6b0: 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66   like pattern of
f6c0: 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b   the form "x LIK
f6d0: 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68 61  E 'abc%'" is cha
f6e0: 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72  nged into constr
f6f0: 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  aints.  **.  ** 
f700: 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63           x>='abc
f710: 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e  ' AND x<'abd' AN
f720: 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a  D x LIKE 'abc%'.
f730: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61    **.  ** The la
f740: 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
f750: 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22  the prefix "abc"
f760: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
f770: 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a  to form the.  **
f780: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e   termination con
f790: 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20  dition "abd"..  
f7a0: 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70  */.  if( pWC->op
f7b0: 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20  ==TK_AND .   && 
f7c0: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61  isLikeOrGlob(pPa
f7d0: 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74  rse, pExpr, &pSt
f7e0: 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c  r1, &isComplete,
f7f0: 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20   &noCase).  ){. 
f800: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20     Expr *pLeft; 
f810: 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20        /* LHS of 
f820: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
f830: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
f840: 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20  pStr2;       /* 
f850: 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20  Copy of pStr1 - 
f860: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
f870: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
f880: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31   Expr *pNewExpr1
f890: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
f8a0: 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  Expr2;.    int i
f8b0: 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20  dxNew1;.    int 
f8c0: 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b  idxNew2;.    Tok
f8d0: 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b  en sCollSeqName;
f8e0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c    /* Name of col
f8f0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
f900: 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  */..    pLeft = 
f910: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
f920: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
f930: 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45  pStr2 = sqlite3E
f940: 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72 31  xprDup(db, pStr1
f950: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64  , 0);.    if( !d
f960: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f970: 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a  ){.      u8 c, *
f980: 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73  pC;       /* Las
f990: 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f  t character befo
f9a0: 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69 6c  re the first wil
f9b0: 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70  dcard */.      p
f9c0: 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d  C = (u8*)&pStr2-
f9d0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65  >u.zToken[sqlite
f9e0: 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d  3Strlen30(pStr2-
f9f0: 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20  >u.zToken)-1];. 
fa00: 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20       c = *pC;.  
fa10: 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29      if( noCase )
fa20: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
fa30: 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63   point is to inc
fa40: 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20  rement the last 
fa50: 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65  character before
fa60: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
fa70: 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20     ** wildcard. 
fa80: 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72 65   But if we incre
fa90: 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77  ment '@', that w
faa0: 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f  ill push it into
fab0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
fac0: 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67 65  alphabetic range
fad0: 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76   where case conv
fae0: 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73  ersions will mes
faf0: 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20 20  s up the .      
fb00: 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e    ** inequality.
fb10: 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c    To avoid this,
fb20: 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c   make sure to al
fb30: 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a  so run the full.
fb40: 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20          ** LIKE 
fb50: 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65  on all candidate
fb60: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20   expressions by 
fb70: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73 43  clearing the isC
fb80: 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20  omplete flag.   
fb90: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
fba0: 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69  if( c=='A'-1 ) i
fbb0: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20  sComplete = 0;  
fbc0: 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33 33 39 2d   /* EV: R-64339-
fbd0: 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20 20 20 20  08207 */...     
fbe0: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70     c = sqlite3Up
fbf0: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20  perToLower[c];. 
fc00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43       }.      *pC
fc10: 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a   = c + 1;.    }.
fc20: 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65      sCollSeqName
fc30: 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e  .z = noCase ? "N
fc40: 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59  OCASE" : "BINARY
fc50: 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e  ";.    sCollSeqN
fc60: 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70  ame.n = 6;.    p
fc70: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
fc80: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
fc90: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
fca0: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
fcb0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
fcc0: 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  _GE, .          
fcd0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
fce0: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72  ollateToken(pPar
fcf0: 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43  se,pNewExpr1,&sC
fd00: 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20  ollSeqName),.   
fd10: 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30          pStr1, 0
fd20: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d  );.    idxNew1 =
fd30: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
fd40: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
fd50: 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  1, TERM_VIRTUAL|
fd60: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
fd70: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
fd80: 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65  New1==0 );.    e
fd90: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
fda0: 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a   pWC, idxNew1);.
fdb0: 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20      pNewExpr2 = 
fdc0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
fdd0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
fde0: 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71    pNewExpr2 = sq
fdf0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
fe00: 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20  e, TK_LT,.      
fe10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fe20: 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28  AddCollateToken(
fe30: 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 32  pParse,pNewExpr2
fe40: 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c  ,&sCollSeqName),
fe50: 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72  .           pStr
fe60: 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65  2, 0);.    idxNe
fe70: 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w2 = whereClause
fe80: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
fe90: 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54  Expr2, TERM_VIRT
fea0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
feb0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
fec0: 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20   idxNew2==0 );. 
fed0: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
fee0: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
fef0: 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  2);.    pTerm = 
ff00: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
ff10: 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70  ;.    if( isComp
ff20: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57  lete ){.      pW
ff30: 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50  C->a[idxNew1].iP
ff40: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
ff50: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
ff60: 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d  xNew2].iParent =
ff70: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
ff80: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
ff90: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  2;.    }.  }.#en
ffa0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ffb0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
ffc0: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
ffd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
ffe0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41  TUALTABLE.  /* A
fff0: 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75  dd a WO_MATCH au
10000 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20  xiliary term to 
10010 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73  the constraint s
10020 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63  et if the.  ** c
10030 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f  urrent expressio
10040 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
10050 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20  :  column MATCH 
10060 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20  expr..  ** This 
10070 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
10080 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  sed by the xBest
10090 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66  Index methods of
100a0 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
100b0 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76  bles.  The nativ
100c0 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65  e query optimize
100d0 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d  r does not attem
100e0 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e  pt.  ** to do an
100f0 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43  ything with MATC
10100 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  H functions..  *
10110 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f  /.  if( isMatchO
10120 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29  fColumn(pExpr) )
10130 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  {.    int idxNew
10140 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  ;.    Expr *pRig
10150 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  ht, *pLeft;.    
10160 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54  WhereTerm *pNewT
10170 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b  erm;.    Bitmask
10180 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70   prereqColumn, p
10190 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20  rereqExpr;..    
101a0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
101b0 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
101c0 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d  xpr;.    pLeft =
101d0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
101e0 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
101f0 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65 78   prereqExpr = ex
10200 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
10210 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a  skSet, pRight);.
10220 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e      prereqColumn
10230 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
10240 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66  e(pMaskSet, pLef
10250 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65  t);.    if( (pre
10260 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71  reqExpr & prereq
10270 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20  Column)==0 ){.  
10280 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
10290 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  pr;.      pNewEx
102a0 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
102b0 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54  r(pParse, TK_MAT
102c0 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  CH, .           
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70     0, sqlite3Exp
102f0 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c  rDup(db, pRight,
10300 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69   0), 0);.      i
10310 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
10320 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
10330 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49  NewExpr, TERM_VI
10340 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
10350 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  IC);.      testc
10360 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
10370 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
10380 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
10390 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  w];.      pNewTe
103a0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
103b0 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20  = prereqExpr;.  
103c0 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65      pNewTerm->le
103d0 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
103e0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
103f0 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  pNewTerm->u.left
10400 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
10410 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
10420 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  NewTerm->eOperat
10430 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20  or = WO_MATCH;. 
10440 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
10450 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
10460 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
10470 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
10480 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
10490 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
104a0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
104b0 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
104c0 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
104d0 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
104e0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
104f0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
10500 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
10510 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
10520 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10530 42 4c 45 5f 53 54 41 54 33 0a 20 20 2f 2a 20 57  BLE_STAT3.  /* W
10540 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33  hen sqlite_stat3
10550 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
10560 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20  is available an 
10570 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a  operator of the.
10580 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20    ** form "x IS 
10590 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f  NOT NULL" can so
105a0 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75  metimes be evalu
105b0 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69  ated more effici
105c0 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78  ently.  ** as "x
105d0 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e  >NULL" if x is n
105e0 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
105f0 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63  IMARY KEY.  So c
10600 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20  onstruct a.  ** 
10610 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20  virtual term of 
10620 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a  that form..  **.
10630 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
10640 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  he virtual term 
10650 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20 77  must be tagged w
10660 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20  ith TERM_VNULL. 
10670 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f   This.  ** TERM_
10680 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73  VNULL tag will s
10690 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d  uppress the not-
106a0 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68  null check at th
106b0 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
106c0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57   of the loop.  W
106d0 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f  ithout the TERM_
106e0 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20  VNULL flag, the 
106f0 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
10700 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74  t.  ** the start
10710 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c   of the loop wil
10720 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65  l prevent any re
10730 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  sults from being
10740 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a   returned..  */.
10750 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
10760 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
10770 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
10780 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
10790 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
107a0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 29  ->iColumn>=0.  )
107b0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
107c0 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
107d0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
107e0 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64  Left;.    int id
107f0 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54  xNew;.    WhereT
10800 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a  erm *pNewTerm;..
10810 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
10820 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
10830 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20  se, 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 73 71 6c 69 74 65 33 45 78         sqlite3Ex
10860 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
10870 20 30 29 2c 0a 20 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 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
108a0 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30  arse, TK_NULL, 0
108b0 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20  , 0, 0), 0);..  
108c0 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
108d0 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
108e0 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20  , 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 54 45 52 4d 5f 56            TERM_V
10910 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
10920 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b  MIC|TERM_VNULL);
10930 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 20  .    if( idxNew 
10940 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ){.      pNewTer
10950 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
10960 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
10970 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
10980 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
10990 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
109a0 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
109b0 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
109c0 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
109d0 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
109e0 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
109f0 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
10a00 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  GT;.      pNewTe
10a10 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  rm->iParent = id
10a20 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
10a30 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
10a40 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
10a50 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
10a60 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
10a70 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
10a80 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
10a90 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
10aa0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
10ab0 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
10ac0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
10ad0 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20 20  ABLE_STAT */..  
10ae0 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c  /* Prevent ON cl
10af0 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20  ause terms of a 
10b00 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62  LEFT JOIN from b
10b10 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69  eing used to dri
10b20 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  ve.  ** an index
10b30 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74   for tables to t
10b40 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
10b50 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72  oin..  */.  pTer
10b60 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c  m->prereqRight |
10b70 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a  = extraRight;.}.
10b80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
10b90 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 70 4c  tion searches pL
10ba0 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72 79 20  ist for a entry 
10bb0 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
10bc0 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a   iCol-th column.
10bd0 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  ** of index pIdx
10be0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
10bf0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
10c00 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65   found, its inde
10c10 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20  x in pList->a[] 
10c20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a  is returned. If.
10c30 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e  ** no expression
10c40 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73   is found, -1 is
10c50 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
10c60 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64  atic int findInd
10c70 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a  exCol(.  Parse *
10c80 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
10c90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
10ca0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e context */.  E
10cb0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10cd0 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * Expression lis
10ce0 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  t to search */. 
10cf0 20 69 6e 74 20 69 42 61 73 65 2c 20 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 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74   /* Cursor for t
10d20 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
10d30 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49  with pIdx */.  I
10d40 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10d60 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  * Index to match
10d70 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20   column of */.  
10d80 69 6e 74 20 69 43 6f 6c 20 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 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  /* Column of ind
10db0 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29  ex to match */.)
10dc0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  {.  int i;.  con
10dd0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
10de0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43   pIdx->azColl[iC
10df0 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ol];..  for(i=0;
10e00 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
10e10 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
10e20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  *p = sqlite3Expr
10e30 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
10e40 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
10e50 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
10e60 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26  K_COLUMN.     &&
10e70 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64   p->iColumn==pId
10e80 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
10e90 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61  ].     && p->iTa
10ea0 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29  ble==iBase.    )
10eb0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
10ec0 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
10ed0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
10ee0 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
10ef0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
10f00 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  ( ALWAYS(pColl) 
10f10 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
10f20 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
10f30 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
10f40 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
10f50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10f60 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ..  return -1;.}
10f70 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
10f80 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
10f90 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
10fa0 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
10fb0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
10fc0 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
10fd0 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
10fe0 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
10ff0 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61  dant if the data
11000 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f  base contains so
11010 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20  me subset of.** 
11020 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
11030 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d   unique and non-
11040 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  null..*/.static 
11050 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65  int isDistinctRe
11060 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65  dundant(.  Parse
11070 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
11080 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11090 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
110a0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
110b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
110c0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
110d0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
110e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
110f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
11100 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
11110 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54  tinct       /* T
11120 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 68  he result set th
11130 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44  at needs to be D
11140 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20  ISTINCT */.){.  
11150 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
11160 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
11170 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
11190 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f   int iBase;..  /
111a0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f  * If there is mo
111b0 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c  re than one tabl
111c0 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20  e or sub-select 
111d0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
111e0 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  se of.  ** this 
111f0 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77  query, then it w
11200 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
11210 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74  ble to show that
11220 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20   the DISTINCT . 
11230 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65   ** clause is re
11240 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  dundant. */.  if
11250 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
11260 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
11270 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69    iBase = pTabLi
11280 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
11290 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c  ;.  pTab = pTabL
112a0 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  ist->a[0].pTab;.
112b0 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  /* If any of 
112c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
112d0 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e  is an IPK column
112e0 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c   on table iBase,
112f0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20   then return .  
11300 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54  ** true. Note: T
11310 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  he (p->iTable==i
11320 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68  Base) part of th
11330 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66  is test may be f
11340 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a  alse if the.  **
11350 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
11360 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
11370 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  sub-query..  */.
11380 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
11390 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
113a0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
113b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
113c0 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69  ipCollate(pDisti
113d0 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  nct->a[i].pExpr)
113e0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
113f0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
11400 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26  >iTable==iBase &
11410 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  & p->iColumn<0 )
11420 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
11430 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
11440 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e  h all indices on
11450 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63   the table, chec
11460 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65  king each to see
11470 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a   if it makes.  *
11480 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  * the DISTINCT q
11490 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61  ualifier redunda
114a0 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69  nt. It does so i
114b0 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  f:.  **.  **   1
114c0 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69  . The index is i
114d0 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e  tself UNIQUE, an
114e0 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e  d.  **.  **   2.
114f0 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75   All of the colu
11500 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
11510 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74   are either part
11520 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63   of the pDistinc
11530 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74  t.  **      list
11540 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48  , or else the WH
11550 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
11560 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  ins a term of th
11570 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a  e form "col=X",.
11580 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20    **      where 
11590 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  X is a constant 
115a0 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61  value. The colla
115b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f  tion sequences o
115c0 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20  f the.  **      
115d0 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73  comparison and s
115e0 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65  elect-list expre
115f0 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63  ssions must matc
11600 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69  h those of the i
11610 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
11620 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73    3. All of thos
11630 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  e index columns 
11640 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48  for which the WH
11650 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
11660 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f  not.  **      co
11670 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20  ntain a "col=X" 
11680 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74  term are subject
11690 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63   to a NOT NULL c
116a0 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
116b0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
116c0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
116d0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
116e0 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  {.    if( pIdx->
116f0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
11700 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11710 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
11720 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
11730 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
11740 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
11750 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  [i];.      if( 0
11760 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ==findTerm(pWC, 
11770 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42  iBase, iCol, ~(B
11780 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c  itmask)0, WO_EQ,
11790 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
117a0 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20    int iIdxCol = 
117b0 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
117c0 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
117d0 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b  iBase, pIdx, i);
117e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49 64  .        if( iId
117f0 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e  xCol<0 || pTab->
11800 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
11810 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d  umn[i]].notNull=
11820 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11830 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
11840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11850 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e     if( i==pIdx->
11860 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
11870 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
11880 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20  mplies that the 
11890 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
118a0 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  er is redundant.
118b0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
118c0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
118d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
118e0 20 0a 2a 2a 20 54 68 65 20 28 61 6e 20 61 70 70   .** The (an app
118f0 72 6f 78 69 6d 61 74 65 29 20 73 75 6d 20 6f 66  roximate) sum of
11900 20 74 77 6f 20 57 68 65 72 65 43 6f 73 74 73 2e   two WhereCosts.
11910 20 20 54 68 69 73 20 63 6f 6d 70 75 74 61 74 69    This computati
11920 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20 73  on is.** not a s
11930 69 6d 70 6c 65 20 22 2b 22 20 6f 70 65 72 61 74  imple "+" operat
11940 6f 72 20 62 65 63 61 75 73 65 20 57 68 65 72 65  or because Where
11950 43 6f 73 74 20 69 73 20 73 74 6f 72 65 64 20 61  Cost is stored a
11960 73 20 61 20 6c 6f 67 61 72 69 74 68 6d 69 63 0a  s a logarithmic.
11970 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20 0a 2a 2f  ** value..** .*/
11980 0a 73 74 61 74 69 63 20 57 68 65 72 65 43 6f 73  .static WhereCos
11990 74 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 57  t whereCostAdd(W
119a0 68 65 72 65 43 6f 73 74 20 61 2c 20 57 68 65 72  hereCost a, Wher
119b0 65 43 6f 73 74 20 62 29 7b 0a 20 20 73 74 61 74  eCost b){.  stat
119c0 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
119d0 64 20 63 68 61 72 20 78 5b 5d 20 3d 20 7b 0a 20  d char x[] = {. 
119e0 20 20 20 20 31 30 2c 20 31 30 2c 20 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 2f 2a 20 30 2c 31 20 2a 2f 0a 20 20      /* 0,1 */.  
11a10 20 20 20 20 39 2c 20 39 2c 20 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 2f 2a 20 32 2c 33 20 2a 2f 0a 20 20 20     /* 2,3 */.   
11a40 20 20 20 38 2c 20 38 2c 20 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 2f 2a 20 34 2c 35 20 2a 2f 0a 20 20 20 20    /* 4,5 */.    
11a70 20 20 37 2c 20 37 2c 20 37 2c 20 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 2f 2a 20 36 2c 37 2c 38 20 2a 2f 0a 20 20 20   /* 6,7,8 */.   
11aa0 20 20 20 36 2c 20 36 2c 20 36 2c 20 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 2f 2a 20 39 2c 31 30 2c 31 31 20 2a 2f 0a    /* 9,10,11 */.
11ad0 20 20 20 20 20 20 35 2c 20 35 2c 20 35 2c 20 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 2f 2a 20 31 32 2d 31 34 20 2a 2f       /* 12-14 */
11b00 0a 20 20 20 20 20 20 34 2c 20 34 2c 20 34 2c 20  .      4, 4, 4, 
11b10 34 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4,              
11b20 20 20 20 20 20 20 2f 2a 20 31 35 2d 31 38 20 2a        /* 15-18 *
11b30 2f 0a 20 20 20 20 20 20 33 2c 20 33 2c 20 33 2c  /.      3, 3, 3,
11b40 20 33 2c 20 33 2c 20 33 2c 20 20 20 20 20 20 20   3, 3, 3,       
11b50 20 20 20 20 20 20 20 2f 2a 20 31 39 2d 32 34 20         /* 19-24 
11b60 2a 2f 0a 20 20 20 20 20 20 32 2c 20 32 2c 20 32  */.      2, 2, 2
11b70 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 20 20  , 2, 2, 2, 2,   
11b80 20 20 20 20 20 20 20 20 2f 2a 20 32 35 2d 33 31          /* 25-31
11b90 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 66 28 20 61   */.  };.  if( a
11ba0 3e 3d 62 20 29 7b 0a 20 20 20 20 69 66 28 20 61  >=b ){.    if( a
11bb0 3e 62 2b 34 39 20 29 20 72 65 74 75 72 6e 20 61  >b+49 ) return a
11bc0 3b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b 33 31  ;.    if( a>b+31
11bd0 20 29 20 72 65 74 75 72 6e 20 61 2b 31 3b 0a 20   ) return a+1;. 
11be0 20 20 20 72 65 74 75 72 6e 20 61 2b 78 5b 61 2d     return a+x[a-
11bf0 62 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b];.  }else{.   
11c00 20 69 66 28 20 62 3e 61 2b 34 39 20 29 20 72 65   if( b>a+49 ) re
11c10 74 75 72 6e 20 62 3b 0a 20 20 20 20 69 66 28 20  turn b;.    if( 
11c20 62 3e 61 2b 33 31 20 29 20 72 65 74 75 72 6e 20  b>a+31 ) return 
11c30 62 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  b+1;.    return 
11c40 62 2b 78 5b 62 2d 61 5d 3b 0a 20 20 7d 0a 7d 0a  b+x[b-a];.  }.}.
11c50 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
11c60 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  n integer into a
11c70 20 57 68 65 72 65 43 6f 73 74 2e 20 20 49 6e 20   WhereCost.  In 
11c80 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63 6f 6d  other words, com
11c90 70 75 74 65 20 61 0a 2a 2a 20 67 6f 6f 64 20 61  pute a.** good a
11ca0 70 70 72 6f 78 69 6d 61 74 61 74 69 6f 6e 20 66  pproximatation f
11cb0 6f 72 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a 2a  or 10*log2(x)..*
11cc0 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43 6f  /.static WhereCo
11cd0 73 74 20 77 68 65 72 65 43 6f 73 74 28 74 52 6f  st whereCost(tRo
11ce0 77 63 6e 74 20 78 29 7b 0a 20 20 73 74 61 74 69  wcnt x){.  stati
11cf0 63 20 57 68 65 72 65 43 6f 73 74 20 61 5b 5d 20  c WhereCost a[] 
11d00 3d 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35 2c 20  = { 0, 2, 3, 5, 
11d10 36 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a 20 20  6, 7, 8, 9 };.  
11d20 57 68 65 72 65 43 6f 73 74 20 79 20 3d 20 34 30  WhereCost y = 40
11d30 3b 0a 20 20 69 66 28 20 78 3c 38 20 29 7b 0a 20  ;.  if( x<8 ){. 
11d40 20 20 20 69 66 28 20 78 3c 32 20 29 20 72 65 74     if( x<2 ) ret
11d50 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  urn 0;.    while
11d60 28 20 78 3c 38 20 29 7b 20 20 79 20 2d 3d 20 31  ( x<8 ){  y -= 1
11d70 30 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d 0a 20 20  0; x <<= 1; }.  
11d80 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
11d90 28 20 78 3e 32 35 35 20 29 7b 20 79 20 2b 3d 20  ( x>255 ){ y += 
11da0 34 30 3b 20 78 20 3e 3e 3d 20 34 3b 20 7d 0a 20  40; x >>= 4; }. 
11db0 20 20 20 77 68 69 6c 65 28 20 78 3e 31 35 20 29     while( x>15 )
11dc0 7b 20 20 79 20 2b 3d 20 31 30 3b 20 78 20 3e 3e  {  y += 10; x >>
11dd0 3d 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  = 1; }.  }.  ret
11de0 75 72 6e 20 61 5b 78 26 37 5d 20 2b 20 79 20 2d  urn a[x&7] + y -
11df0 20 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   10;.}..#ifndef 
11e00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
11e10 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43  UALTABLE./*.** C
11e20 6f 6e 76 65 72 74 20 61 20 64 6f 75 62 6c 65 20  onvert a double 
11e30 28 61 73 20 72 65 63 65 69 76 65 64 20 66 72 6f  (as received fro
11e40 6d 20 78 42 65 73 74 49 6e 64 65 78 20 6f 66 20  m xBestIndex of 
11e50 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 29  a virtual table)
11e60 0a 2a 2a 20 69 6e 74 6f 20 61 20 57 68 65 72 65  .** into a Where
11e70 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  Cost.  In other 
11e80 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20 61  words, compute a
11e90 6e 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20  n approximation 
11ea0 66 6f 72 0a 2a 2a 20 31 30 2a 6c 6f 67 32 28 78  for.** 10*log2(x
11eb0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  )..*/.static Whe
11ec0 72 65 43 6f 73 74 20 77 68 65 72 65 43 6f 73 74  reCost whereCost
11ed0 46 72 6f 6d 44 6f 75 62 6c 65 28 64 6f 75 62 6c  FromDouble(doubl
11ee0 65 20 78 29 7b 0a 20 20 75 36 34 20 61 3b 0a 20  e x){.  u64 a;. 
11ef0 20 57 68 65 72 65 43 6f 73 74 20 65 3b 0a 20 20   WhereCost e;.  
11f00 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78  assert( sizeof(x
11f10 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 61  )==8 && sizeof(a
11f20 29 3d 3d 38 20 29 3b 0a 20 20 69 66 28 20 78 3c  )==8 );.  if( x<
11f30 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
11f40 20 69 66 28 20 78 3c 3d 32 30 30 30 30 30 30 30   if( x<=20000000
11f50 30 30 20 29 20 72 65 74 75 72 6e 20 77 68 65 72  00 ) return wher
11f60 65 43 6f 73 74 28 28 74 52 6f 77 63 6e 74 29 78  eCost((tRowcnt)x
11f70 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 2c 20  );.  memcpy(&a, 
11f80 26 78 2c 20 38 29 3b 0a 20 20 65 20 3d 20 28 61  &x, 8);.  e = (a
11f90 3e 3e 35 32 29 20 2d 20 31 30 32 32 3b 0a 20 20  >>52) - 1022;.  
11fa0 72 65 74 75 72 6e 20 65 2a 31 30 3b 0a 7d 0a 23  return e*10;.}.#
11fb0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11fc0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11fd0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  E */../*.** Esti
11fe0 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74  mate the logarit
11ff0 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  hm of the input 
12000 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e  value to base 2.
12010 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
12020 43 6f 73 74 20 65 73 74 4c 6f 67 28 57 68 65 72  Cost estLog(Wher
12030 65 43 6f 73 74 20 4e 29 7b 0a 20 20 57 68 65 72  eCost N){.  Wher
12040 65 43 6f 73 74 20 78 20 3d 20 77 68 65 72 65 43  eCost x = whereC
12050 6f 73 74 28 4e 29 3b 0a 20 20 72 65 74 75 72 6e  ost(N);.  return
12060 20 78 3e 33 33 20 3f 20 78 20 2d 20 33 33 20 3a   x>33 ? x - 33 :
12070 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f   0;.}../*.** Two
12080 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72   routines for pr
12090 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  inting the conte
120a0 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33  nt of an sqlite3
120b0 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73  _index_info.** s
120c0 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20  tructure.  Used 
120d0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
120e0 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20  debugging only. 
120f0 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53   If neither.** S
12100 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51  QLITE_TEST or SQ
12110 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64  LITE_DEBUG are d
12120 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  efined, then the
12130 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61  se routines.** a
12140 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69  re no-ops..*/.#i
12150 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
12160 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12170 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
12180 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
12190 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ED).static void 
121a0 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
121b0 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
121c0 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  nfo *p){.  int i
121d0 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
121e0 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74  WhereTrace ) ret
121f0 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
12200 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
12210 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
12220 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12230 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d    constraint[%d]
12240 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d  : col=%d termid=
12250 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64  %d op=%d usabled
12260 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
12270 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
12280 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75  straint[i].iColu
12290 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  mn,.       p->aC
122a0 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65  onstraint[i].iTe
122b0 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20  rmOffset,.      
122c0 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
122d0 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d  i].op,.       p-
122e0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
122f0 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66  usable);.  }.  f
12300 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72  or(i=0; i<p->nOr
12310 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
12320 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
12330 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25  ntf("  orderby[%
12340 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d  d]: col=%d desc=
12350 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
12360 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
12370 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  rBy[i].iColumn,.
12380 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
12390 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d  By[i].desc);.  }
123a0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  .}.static void T
123b0 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
123c0 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
123d0 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  nfo *p){.  int i
123e0 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
123f0 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74  WhereTrace ) ret
12400 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
12410 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
12420 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
12430 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12440 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67    usage[%d]: arg
12450 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c  vIdx=%d omit=%d\
12460 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
12470 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
12480 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
12490 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d  Index,.       p-
124a0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
124b0 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a  e[i].omit);.  }.
124c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
124d0 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25  intf("  idxNum=%
124e0 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29  d\n", p->idxNum)
124f0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
12500 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72  Printf("  idxStr
12510 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74  =%s\n", p->idxSt
12520 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  r);.  sqlite3Deb
12530 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65  ugPrintf("  orde
12540 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e  rByConsumed=%d\n
12550 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  ", p->orderByCon
12560 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  sumed);.  sqlite
12570 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
12580 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67  estimatedCost=%g
12590 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65  \n", p->estimate
125a0 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a  dCost);.}.#else.
125b0 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
125c0 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66  X_INPUTS(A).#def
125d0 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ine TRACE_IDX_OU
125e0 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a  TPUTS(A).#endif.
125f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12600 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
12610 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  NDEX./*.** Retur
12620 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48  n TRUE if the WH
12630 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
12640 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f  pTerm is of a fo
12650 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63  rm where it.** c
12660 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74  ould be used wit
12670 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63  h an index to ac
12680 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d  cess pSrc, assum
12690 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ing an appropria
126a0 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73  te.** index exis
126b0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
126c0 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  nt termCanDriveI
126d0 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72  ndex(.  WhereTer
126e0 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20  m *pTerm,       
126f0 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
12700 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63  clause term to c
12710 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74  heck */.  struct
12720 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
12730 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c  Src,     /* Tabl
12740 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  e we are trying 
12750 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42  to access */.  B
12760 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12780 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72   Tables in outer
12790 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f   loops of the jo
127a0 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  in */.){.  char 
127b0 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d  aff;.  if( pTerm
127c0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53  ->leftCursor!=pS
127d0 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65  rc->iCursor ) re
127e0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
127f0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
12800 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65  & WO_EQ)==0 ) re
12810 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
12820 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
12830 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  t & notReady)!=0
12840 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
12850 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  f( pTerm->u.left
12860 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
12870 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72  n 0;.  aff = pSr
12880 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  c->pTab->aCol[pT
12890 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
128a0 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69  n].affinity;.  i
128b0 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
128c0 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d  AffinityOk(pTerm
128d0 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20  ->pExpr, aff) ) 
128e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
128f0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
12900 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12910 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
12920 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  NDEX./*.** Gener
12930 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73  ate code to cons
12940 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
12950 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75  object for an au
12960 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a  tomatic index.**
12970 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74   and to set up t
12980 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62  he WhereLevel ob
12990 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74  ject pLevel so t
129a0 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hat the code gen
129b0 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20  erator.** makes 
129c0 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d  use of the autom
129d0 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  atic index..*/.s
129e0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74  tatic void const
129f0 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  ructAutomaticInd
12a00 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
12a10 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
12a20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
12a30 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
12a40 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
12a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12a60 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
12a70 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
12a80 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
12a90 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
12aa0 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68  e term to get th
12ab0 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a  e next index */.
12ac0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
12ad0 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
12ae0 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
12af0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
12b00 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  ailable */.  Whe
12b10 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
12b20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
12b30 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65  e new index here
12b40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f   */.){.  int nCo
12b50 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20  lumn;           
12b60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12b70 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
12b80 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64   constructed ind
12b90 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ex */.  WhereTer
12ba0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
12bb0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
12bc0 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
12bd0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
12be0 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b  ereTerm *pWCEnd;
12bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
12c00 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a   of pWC->a[] */.
12c10 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12c30 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20   Byte of memory 
12c40 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64 78 20  needed for pIdx 
12c50 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
12c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c70 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72   /* Object descr
12c80 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69  ibing the transi
12c90 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56  ent index */.  V
12ca0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
12cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
12cc0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
12cd0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
12ce0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
12cf0 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  rInit;          
12d00 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
12d10 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  of the initializ
12d20 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d  ation bypass jum
12d30 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  p */.  Table *pT
12d40 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
12d50 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
12d60 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
12d70 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
12d80 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  info;          /
12d90 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f  * Key informatio
12da0 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  n for the index 
12db0 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64 72  */   .  int addr
12dc0 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
12dd0 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
12de0 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f  e index fill loo
12df0 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  p */.  int regRe
12e00 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
12e10 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
12e20 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  olding an index 
12e30 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
12e40 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
12e50 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
12e60 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  n counter */.  i
12e70 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
12e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
12e90 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
12ea0 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20  int mxBitCol;   
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
12ec0 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e  aximum column in
12ed0 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a   pSrc->colUsed *
12ee0 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
12ef0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
12f00 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
12f10 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f  uence to on a co
12f20 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  lumn */.  WhereL
12f30 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
12f40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f        /* The Loo
12f50 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 42 69  p object */.  Bi
12f60 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20  tmask idxCols;  
12f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
12f80 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75  map of columns u
12f90 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  sed for indexing
12fa0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
12fb0 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  traCols;        
12fc0 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61    /* Bitmap of a
12fd0 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
12fe0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  s */.  const int
12ff0 20 6d 78 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20   mxConstraint = 
13000 31 30 3b 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e  10; /* Maximum n
13010 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61  umber of constra
13020 69 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65  ints */..  /* Ge
13030 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73  nerate code to s
13040 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65  kip over the cre
13050 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61  ation and initia
13060 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  lization of the.
13070 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69    ** transient i
13080 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20  ndex on 2nd and 
13090 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
130a0 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f  tions of the loo
130b0 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  p. */.  v = pPar
130c0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
130d0 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
130e0 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  ddrInit = sqlite
130f0 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
13100 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
13110 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
13120 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
13130 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
13140 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73  ndex.  ** and us
13150 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52  ed to match WHER
13160 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
13170 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d  ints */.  nColum
13180 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20  n = 0;.  pTable 
13190 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
131a0 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
131b0 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
131c0 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
131d0 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c  pWLoop;.  idxCol
131e0 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  s = 0;.  for(pTe
131f0 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
13200 3c 70 57 43 45 6e 64 20 26 26 20 70 4c 6f 6f 70  <pWCEnd && pLoop
13210 2d 3e 6e 4c 54 65 72 6d 3c 6d 78 43 6f 6e 73 74  ->nLTerm<mxConst
13220 72 61 69 6e 74 3b 20 70 54 65 72 6d 2b 2b 29 7b  raint; pTerm++){
13230 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
13240 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
13250 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
13260 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
13270 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
13280 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
13290 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
132a0 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
132b0 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
132c0 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
132d0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
132e0 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
132f0 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
13300 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69  BMS-1 );.      i
13310 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
13320 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
13330 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
13340 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
13350 62 2c 20 70 4c 6f 6f 70 2c 20 6e 43 6f 6c 75 6d  b, pLoop, nColum
13360 6e 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  n+1) ) return;. 
13370 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
13380 54 65 72 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b 5d 20  Term[nColumn++] 
13390 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
133a0 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
133b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
133c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
133d0 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c  Column>0 );.  pL
133e0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
133f0 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
13400 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4c   = nColumn;.  pL
13410 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
13420 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
13430 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
13440 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 20 20 20 20 20 7c 20 57 48 45 52 45 5f 54 45 4d       | WHERE_TEM
13470 50 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  P_INDEX;..  /* C
13480 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
13490 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
134a0 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
134b0 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
134c0 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
134d0 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
134e0 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
134f0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
13500 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
13510 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
13520 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
13530 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
13540 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
13550 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
13560 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
13570 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
13580 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
13590 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
135a0 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
135b0 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
135c0 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
135d0 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
135e0 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
135f0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
13600 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
13610 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
13620 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
13630 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
13640 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
13650 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
13660 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
13670 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
13680 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e  tCol = (pTable->
13690 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f  nCol >= BMS-1) ?
136a0 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d   BMS-1 : pTable-
136b0 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73  >nCol;.  testcas
136c0 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
136d0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74  =BMS-1 );.  test
136e0 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
136f0 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66  ol==BMS-2 );.  f
13700 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
13710 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
13720 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41  ( extraCols & MA
13730 53 4b 42 49 54 28 69 29 20 29 20 6e 43 6f 6c 75  SKBIT(i) ) nColu
13740 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  mn++;.  }.  if( 
13750 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
13760 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
13770 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d  {.    nColumn +=
13780 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20   pTable->nCol - 
13790 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70  BMS + 1;.  }.  p
137a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
137b0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
137c0 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
137d0 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75  Y;..  /* Constru
137e0 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
137f0 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
13800 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
13810 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49  nByte = sizeof(I
13820 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b  ndex);.  nByte +
13830 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
13840 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e  (int);     /* In
13850 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a  dex.aiColumn */.
13860 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
13870 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  mn*sizeof(char*)
13880 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43  ;   /* Index.azC
13890 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  oll */.  nByte +
138a0 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  = nColumn;      
138b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
138c0 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
138d0 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74  /.  pIdx = sqlit
138e0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
138f0 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65  Parse->db, nByte
13900 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
13910 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f   ) return;.  pLo
13920 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
13930 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  ex = pIdx;.  pId
13940 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
13950 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20  r**)&pIdx[1];.  
13960 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
13970 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a   (int*)&pIdx->az
13980 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  Coll[nColumn];. 
13990 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
139a0 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e  r = (u8*)&pIdx->
139b0 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
139c0 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  ];.  pIdx->zName
139d0 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
139e0 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
139f0 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49   = nColumn;.  pI
13a00 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  dx->pTable = pTa
13a10 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  ble;.  n = 0;.  
13a20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
13a30 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
13a40 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
13a50 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
13a60 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
13a70 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
13a80 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
13a90 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
13aa0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
13ab0 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
13ac0 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
13ad0 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
13ae0 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
13af0 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  ol);.      if( (
13b00 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
13b10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
13b20 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
13b30 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
13b40 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
13b50 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
13b60 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54  aiColumn[n] = pT
13b70 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
13b80 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  n;.        pColl
13b90 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
13ba0 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
13bb0 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
13bc0 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
13bd0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
13be0 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28  oll[n] = ALWAYS(
13bf0 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e  pColl) ? pColl->
13c00 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22  zName : "BINARY"
13c10 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
13c20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13c30 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29  .  assert( (u32)
13c40 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  n==pLoop->u.btre
13c50 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41  e.nEq );..  /* A
13c60 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  dd additional co
13c70 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
13c80 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74  make the automat
13c90 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20  ic index into.  
13ca0 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ** a covering in
13cb0 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  dex */.  for(i=0
13cc0 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
13cd0 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
13ce0 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
13cf0 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i) ){.      pIdx
13d00 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
13d10 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
13d20 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
13d30 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
13d40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
13d50 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
13d60 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
13d70 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d  {.    for(i=BMS-
13d80 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  1; i<pTable->nCo
13d90 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
13da0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
13db0 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
13dc0 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
13dd0 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
13de0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
13df0 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d  ssert( n==nColum
13e00 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n );..  /* Creat
13e10 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
13e20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69  index */.  pKeyi
13e30 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  nfo = sqlite3Ind
13e40 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
13e50 2c 20 70 49 64 78 29 3b 0a 20 20 61 73 73 65 72  , pIdx);.  asser
13e60 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
13e70 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65  ur>=0 );.  pLeve
13e80 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
13e90 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
13ea0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13eb0 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
13ec0 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
13ed0 64 78 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31  dxCur, nColumn+1
13ee0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
13ef0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
13f00 70 4b 65 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyinfo, P4_KEY
13f10 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
13f20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13f30 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c   "for %s", pTabl
13f40 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f  e->zName));..  /
13f50 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d  * Fill the autom
13f60 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68 20  atic index with 
13f70 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64  content */.  add
13f80 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
13f90 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
13fa0 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  ewind, pLevel->i
13fb0 54 61 62 43 75 72 29 3b 0a 20 20 72 65 67 52 65  TabCur);.  regRe
13fc0 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
13fd0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
13fe0 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ;.  sqlite3Gener
13ff0 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
14000 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c  se, pIdx, pLevel
14010 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65  ->iTabCur, regRe
14020 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69  cord, 1);.  sqli
14030 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14040 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
14050 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
14060 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
14070 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
14080 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
14090 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
140a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
140b0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76  v, OP_Next, pLev
140c0 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64  el->iTabCur, add
140d0 72 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74  rTop+1);.  sqlit
140e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
140f0 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
14100 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a  TUS_AUTOINDEX);.
14110 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
14120 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
14130 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
14140 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
14150 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
14160 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65   .  /* Jump here
14170 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74   when skipping t
14180 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
14190 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  n */.  sqlite3Vd
141a0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
141b0 64 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69  drInit);.}.#endi
141c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
141d0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
141e0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
141f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
14200 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
14210 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
14220 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
14230 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14240 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
14250 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
14260 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
14270 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
14280 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
14290 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
142a0 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
142b0 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
142c0 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
142d0 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
142e0 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
142f0 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
14300 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73  ndexInfo(.  Pars
14310 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65  e *pParse,.  Whe
14320 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
14330 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
14340 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78  item *pSrc,.  Ex
14350 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
14360 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
14370 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73    int nTerm;.  s
14380 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
14390 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
143a0 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
143b0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
143c0 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
143d0 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
143e0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
143f0 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
14400 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54  pUsage;.  WhereT
14410 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
14420 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71  t nOrderBy;.  sq
14430 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
14440 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f   *pIdxInfo;..  /
14450 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
14460 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  er of possible W
14470 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
14480 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e  traints referrin
14490 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76  g.  ** to this v
144a0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
144b0 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c    for(i=nTerm=0,
144c0 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
144d0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
144e0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
144f0 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
14500 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
14510 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
14520 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
14530 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
14540 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
14550 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
14560 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
14570 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
14580 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
14590 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
145a0 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
145b0 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  L );.    if( pTe
145c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
145d0 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  (WO_ISNULL) ) co
145e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
145f0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
14600 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
14610 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72  ntinue;.    nTer
14620 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  m++;.  }..  /* I
14630 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
14640 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f  lause contains o
14650 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  nly columns in t
14660 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a  he current .  **
14670 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
14680 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  hen allocate spa
14690 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65  ce for the aOrde
146a0 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a  rBy part of.  **
146b0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
146c0 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
146d0 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72  e..  */.  nOrder
146e0 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f  By = 0;.  if( pO
146f0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
14700 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  t n = pOrderBy->
14710 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
14720 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
14730 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
14740 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
14750 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
14760 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
14770 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
14780 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  ->iTable!=pSrc->
14790 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
147a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
147b0 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64  ==n){.      nOrd
147c0 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  erBy = n;.    }.
147d0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
147e0 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
147f0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
14800 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
14810 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
14820 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
14830 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
14840 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
14870 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
14880 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
14890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
148a0 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
148b0 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
148c0 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20  y)*nOrderBy );. 
148d0 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
148e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
148f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14900 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
14910 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
14920 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
14930 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75  lize the structu
14940 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  re.  The sqlite3
14950 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
14960 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20  cture contains. 
14970 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20   ** many fields 
14980 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65  that are declare
14990 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65  d "const" to pre
149a0 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20  vent xBestIndex 
149b0 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69  from.  ** changi
149c0 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76  ng them.  We hav
149d0 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e  e to do some fun
149e0 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72  ky casting in or
149f0 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74  der to.  ** init
14a00 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65  ialize those fie
14a10 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  lds..  */.  pIdx
14a20 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73  Cons = (struct s
14a30 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
14a40 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e  straint*)&pIdxIn
14a50 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64  fo[1];.  pIdxOrd
14a60 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73  erBy = (struct s
14a70 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
14a80 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b  erby*)&pIdxCons[
14a90 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65  nTerm];.  pUsage
14aa0 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
14ab0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14ac0 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78  int_usage*)&pIdx
14ad0 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79  OrderBy[nOrderBy
14ae0 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  ];.  *(int*)&pId
14af0 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
14b00 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28  nt = nTerm;.  *(
14b10 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
14b20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
14b30 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
14b40 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
14b50 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
14b60 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
14b70 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20  t = pIdxCons;.  
14b80 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
14b90 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a  _index_orderby**
14ba0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  )&pIdxInfo->aOrd
14bb0 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72  erBy = pIdxOrder
14bc0 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
14bd0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
14be0 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29  straint_usage**)
14bf0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
14c00 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20  traintUsage =.  
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 20 20 20                  
14c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c50 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28   pUsage;..  for(
14c60 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
14c70 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
14c80 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
14c90 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20  {.    u8 op;.   
14ca0 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
14cb0 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
14cc0 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
14cd0 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
14ce0 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
14cf0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
14d00 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
14d10 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
14d20 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
14d30 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
14d40 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
14d50 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
14d60 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  LL );.    if( pT
14d70 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
14d80 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63   (WO_ISNULL) ) c
14d90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
14da0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
14db0 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
14dc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64  ontinue;.    pId
14dd0 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e  xCons[j].iColumn
14de0 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
14df0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
14e00 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  Cons[j].iTermOff
14e10 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20  set = i;.    op 
14e20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70  = (u8)pTerm->eOp
14e30 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b  erator & WO_ALL;
14e40 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f  .    if( op==WO_
14e50 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b  IN ) op = WO_EQ;
14e60 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
14e70 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a  .op = op;.    /*
14e80 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69   The direct assi
14e90 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72  gnment in the pr
14ea0 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70  evious line is p
14eb0 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63  ossible only bec
14ec0 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
14ed0 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  WO_ and SQLITE_I
14ee0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
14ef0 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74   codes are ident
14f00 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a  ical.  The.    *
14f10 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  * following asse
14f20 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20  rts verify this 
14f30 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73  fact. */.    ass
14f40 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49  ert( WO_EQ==SQLI
14f50 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
14f60 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  INT_EQ );.    as
14f70 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c  sert( WO_LT==SQL
14f80 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
14f90 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61  AINT_LT );.    a
14fa0 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
14fb0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
14fc0 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
14fd0 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53  assert( WO_GT==S
14fe0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
14ff0 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20  TRAINT_GT );.   
15000 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d   assert( WO_GE==
15010 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
15020 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20  STRAINT_GE );.  
15030 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54    assert( WO_MAT
15040 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  CH==SQLITE_INDEX
15050 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
15060 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  H );.    assert(
15070 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
15080 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51  r & (WO_IN|WO_EQ
15090 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
150a0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43  GT|WO_GE|WO_MATC
150b0 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20  H) );.    j++;. 
150c0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
150d0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
150e0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
150f0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
15100 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78  .pExpr;.    pIdx
15110 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
15120 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
15130 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  umn;.    pIdxOrd
15140 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70  erBy[i].desc = p
15150 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
15160 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
15170 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b  return pIdxInfo;
15180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61  .}../*.** The ta
15190 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72  ble object refer
151a0 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74  ence passed as t
151b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
151c0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
151d0 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72  ion.** must repr
151e0 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20  esent a virtual 
151f0 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63  table. This func
15200 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65  tion invokes the
15210 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a   xBestIndex().**
15220 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76   method of the v
15230 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74  irtual table wit
15240 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  h the sqlite3_in
15250 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20  dex_info object 
15260 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e  that.** comes in
15270 20 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75   as the 3rd argu
15280 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
15290 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
152a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
152b0 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c   pParse is popul
152c0 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  ated with an err
152d0 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61  or message and a
152e0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
152f0 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ue is returned. 
15300 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
15310 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
15320 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20   output.** part 
15330 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
15340 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
15350 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75  ure is left popu
15360 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  lated..**.** Whe
15370 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65  ther or not an e
15380 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
15390 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
153a0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
153b0 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
153c0 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70  ventually free p
153d0 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e  ->idxStr if p->n
153e0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
153f0 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61  indicates.** tha
15400 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72  t this is requir
15410 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
15420 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  t vtabBestIndex(
15430 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
15440 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69  able *pTab, sqli
15450 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
15460 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  p){.  sqlite3_vt
15470 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69  ab *pVtab = sqli
15480 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61  te3GetVTable(pPa
15490 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e  rse->db, pTab)->
154a0 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVtab;.  int i;.
154b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41    int rc;..  TRA
154c0 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29  CE_IDX_INPUTS(p)
154d0 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
154e0 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
154f0 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20  dex(pVtab, p);. 
15500 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
15510 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  TS(p);..  if( rc
15520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15530 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15540 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
15550 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
15560 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
15570 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56     }else if( !pV
15580 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  tab->zErrMsg ){.
15590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
155a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
155b0 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
155c0 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  r(rc));.    }els
155d0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
155e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
155f0 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45   "%s", pVtab->zE
15600 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
15610 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
15620 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
15630 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
15640 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  sg = 0;..  for(i
15650 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
15660 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
15670 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61  if( !p->aConstra
15680 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26  int[i].usable &&
15690 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
156a0 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
156b0 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x>0 ){.      sql
156c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
156d0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
156e0 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74  "table %s: xBest
156f0 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61  Index returned a
15700 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c  n invalid plan",
15710 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
15720 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
15730 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  rn pParse->nErr;
15740 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
15750 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15760 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
15770 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  */...#ifdef SQLI
15780 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
15790 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
157a0 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61  he location of a
157b0 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20   particular key 
157c0 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69  among all keys i
157d0 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  n an.** index.  
157e0 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
157f0 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f  s in aStat as fo
15800 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
15810 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73  aStat[0]      Es
15820 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
15830 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c  s less than pVal
15840 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  .**    aStat[1] 
15850 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
15860 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74   of rows equal t
15870 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74  o pVal.**.** Ret
15880 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
15890 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
158a0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79  tic int whereKey
158b0 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a  Stats(.  Parse *
158c0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
158d0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
158e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
158f0 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15910 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65  Index to conside
15920 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20  r domain of */. 
15930 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
15940 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  pVal,        /* 
15950 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65  Value to conside
15960 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
15970 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
15980 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
15990 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
159a0 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
159b0 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
159d0 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
159e0 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
159f0 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e   tRowcnt n;.  In
15a00 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70  dexSample *aSamp
15a10 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54 79  le;.  int i, eTy
15a20 70 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d  pe;.  int isEq =
15a30 20 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 64   0;.  i64 v;.  d
15a40 6f 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20  ouble r, rS;..  
15a50 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d  assert( roundUp=
15a60 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31  =0 || roundUp==1
15a70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
15a80 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b  dx->nSample>0 );
15a90 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29  .  if( pVal==0 )
15aa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
15ab0 52 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78  RROR;.  n = pIdx
15ac0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
15ad0 20 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d   aSample = pIdx-
15ae0 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70  >aSample;.  eTyp
15af0 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
15b00 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20  e_type(pVal);.. 
15b10 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
15b20 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TE_INTEGER ){.  
15b30 20 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    v = sqlite3_va
15b40 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b  lue_int64(pVal);
15b50 0a 20 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b  .    r = (i64)v;
15b60 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15b70 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69  pIdx->nSample; i
15b80 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
15b90 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
15ba0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63  =SQLITE_NULL ) c
15bb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
15bc0 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
15bd0 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype>=SQLITE_TEXT
15be0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
15bf0 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
15c00 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  Type==SQLITE_INT
15c10 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
15c20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  if( aSample[i].u
15c30 2e 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20  .i>=v ){.       
15c40 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c     isEq = aSampl
15c50 65 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20  e[i].u.i==v;.   
15c60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
15c80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
15c90 65 72 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ert( aSample[i].
15ca0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
15cb0 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69  OAT );.        i
15cc0 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  f( aSample[i].u.
15cd0 72 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=r ){.        
15ce0 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65    isEq = aSample
15cf0 5b 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20  [i].u.r==r;.    
15d00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15d20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
15d30 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46   eType==SQLITE_F
15d40 4c 4f 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20  LOAT ){.    r = 
15d50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
15d60 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20  uble(pVal);.    
15d70 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
15d80 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
15d90 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
15da0 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[i].eType==SQLI
15db0 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  TE_NULL ) contin
15dc0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  ue;.      if( aS
15dd0 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d  ample[i].eType>=
15de0 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72  SQLITE_TEXT ) br
15df0 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61  eak;.      if( a
15e00 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
15e10 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b  =SQLITE_FLOAT ){
15e20 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20 61 53  .        rS = aS
15e30 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20  ample[i].u.r;.  
15e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15e50 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b     rS = aSample[
15e60 69 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a  i].u.i;.      }.
15e70 20 20 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20        if( rS>=r 
15e80 29 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71 20  ){.        isEq 
15e90 3d 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20  = rS==r;.       
15ea0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15eb0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
15ec0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
15ed0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20  NULL ){.    i = 
15ee0 30 3b 0a 20 20 20 20 69 66 28 20 61 53 61 6d 70  0;.    if( aSamp
15ef0 6c 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[0].eType==SQL
15f00 49 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20  ITE_NULL ) isEq 
15f10 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
15f20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
15f30 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20  =SQLITE_TEXT || 
15f40 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
15f50 4f 42 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  OB );.    for(i=
15f60 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  0; i<pIdx->nSamp
15f70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
15f80 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
15f90 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
15fa0 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  T || aSample[i].
15fb0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
15fc0 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  OB ){.        br
15fd0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
15fe0 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64   }.    if( i<pId
15ff0 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20  x->nSample ){   
16000 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65     .      sqlite
16010 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
16020 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  db;.      CollSe
16030 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
16040 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20  const u8 *z;.   
16050 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
16060 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
16070 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20       z = (const 
16080 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  u8 *)sqlite3_val
16090 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20  ue_blob(pVal);. 
160a0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64         pColl = d
160b0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
160c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
160d0 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  oll->enc==SQLITE
160e0 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d  _UTF8 );.      }
160f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
16100 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
16110 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
16120 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
16130 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a  *pIdx->azColl);.
16140 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
16150 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
16160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16170 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
16180 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f  .        z = (co
16190 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33  nst u8 *)sqlite3
161a0 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20  ValueText(pVal, 
161b0 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
161c0 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20       if( !z ){. 
161d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
161e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
161f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16200 61 73 73 65 72 74 28 20 7a 20 26 26 20 70 43 6f  assert( z && pCo
16210 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll && pColl->xCm
16220 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p );.      }.   
16230 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56 61     n = sqlite3Va
16240 6c 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20 70  lueBytes(pVal, p
16250 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 0a 20  Coll->enc);.  . 
16260 20 20 20 20 20 66 6f 72 28 3b 20 69 3c 70 49 64       for(; i<pId
16270 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29  x->nSample; i++)
16280 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  {.        int c;
16290 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 53 61  .        int eSa
162a0 6d 70 6c 65 74 79 70 65 20 3d 20 61 53 61 6d 70  mpletype = aSamp
162b0 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20 20  le[i].eType;.   
162c0 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65       if( eSample
162d0 74 79 70 65 3c 65 54 79 70 65 20 29 20 63 6f 6e  type<eType ) con
162e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
162f0 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65 21 3d  f( eSampletype!=
16300 65 54 79 70 65 20 29 20 62 72 65 61 6b 3b 0a 23  eType ) break;.#
16310 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16320 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 20 20  IT_UTF16.       
16330 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21   if( pColl->enc!
16340 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a  =SQLITE_UTF8 ){.
16350 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53            int nS
16360 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  ample;.         
16370 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20 3d   char *zSample =
16380 20 73 71 6c 69 74 65 33 55 74 66 38 74 6f 31 36   sqlite3Utf8to16
16390 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
163a0 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20  db, pColl->enc, 
163b0 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20  aSample[i].u.z, 
163c0 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65  aSample[i].nByte
163d0 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20  , &nSample.     
163e0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
163f0 20 20 69 66 28 20 21 7a 53 61 6d 70 6c 65 20 29    if( !zSample )
16400 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
16410 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
16420 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
16430 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16440 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
16450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16460 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70   c = pColl->xCmp
16470 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e  (pColl->pUser, n
16480 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c  Sample, zSample,
16490 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20   n, z);.        
164a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
164b0 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20 20  db, zSample);.  
164c0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
164d0 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
164e0 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c         c = pColl
164f0 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
16500 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ser, aSample[i].
16510 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b 69  nByte, aSample[i
16520 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20  ].u.z, n, z);.  
16530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16540 69 66 28 20 63 3e 3d 30 20 29 7b 0a 20 20 20 20  if( c>=0 ){.    
16550 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
16560 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 20 20 20   isEq = 1;.     
16570 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16580 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16590 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74    }.  }..  /* At
165a0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61   this point, aSa
165b0 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66  mple[i] is the f
165c0 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74  irst sample that
165d0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
165e0 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74  .  ** or equal t
165f0 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69  o pVal.  Or if i
16600 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c  ==pIdx->nSample,
16610 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   then all sample
16620 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20  s are less.  ** 
16630 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61  than pVal.  If a
16640 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c  Sample[i]==pVal,
16650 20 74 68 65 6e 20 69 73 45 71 3d 3d 31 2e 0a 20   then isEq==1.. 
16660 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 71 20 29   */.  if( isEq )
16670 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
16680 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b  pIdx->nSample );
16690 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
166a0 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a  aSample[i].nLt;.
166b0 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61      aStat[1] = a
166c0 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45 71 3b 0a 20  Sample[i].nEq;. 
166d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77   }else{.    tRow
166e0 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70  cnt iLower, iUpp
166f0 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66  er, iGap;.    if
16700 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
16710 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
16720 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70    iUpper = aSamp
16730 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d  le[0].nLt;.    }
16740 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70  else{.      iUpp
16750 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53  er = i>=pIdx->nS
16760 61 6d 70 6c 65 20 3f 20 6e 20 3a 20 61 53 61 6d  ample ? n : aSam
16770 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20  ple[i].nLt;.    
16780 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70    iLower = aSamp
16790 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20 2b 20 61 53  le[i-1].nEq + aS
167a0 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 4c 74 3b 0a  ample[i-1].nLt;.
167b0 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b      }.    aStat[
167c0 31 5d 20 3d 20 70 49 64 78 2d 3e 61 76 67 45 71  1] = pIdx->avgEq
167d0 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72  ;.    if( iLower
167e0 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20  >=iUpper ){.    
167f0 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20    iGap = 0;.    
16800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
16810 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f  p = iUpper - iLo
16820 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  wer;.    }.    i
16830 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20  f( roundUp ){.  
16840 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70      iGap = (iGap
16850 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65  *2)/3;.    }else
16860 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
16870 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20  Gap/3;.    }.   
16880 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77   aStat[0] = iLow
16890 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 20  er + iGap;.  }. 
168a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
168b0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
168c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
168d0 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  T3 */../*.** If 
168e0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
168f0 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69   represents a li
16900 74 65 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74  teral value, set
16910 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f   *pp to point to
16920 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  .** an sqlite3_v
16930 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
16940 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61  ontaining the sa
16950 6d 65 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61  me value, with a
16960 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61  ffinity.** aff a
16970 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65  pplied to it, be
16980 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
16990 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
169a0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
169b0 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
169c0 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
169d0 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
169e0 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f  by passing it to
169f0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75   .** sqlite3Valu
16a00 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  eFree()..**.** I
16a10 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  f the current pa
16a20 72 73 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69  rse is a recompi
16a30 6c 65 20 28 73 71 6c 69 74 65 33 52 65 70 72 65  le (sqlite3Repre
16a40 70 61 72 65 28 29 29 20 61 6e 64 20 70 45 78 70  pare()) and pExp
16a50 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76  r.** is an SQL v
16a60 61 72 69 61 62 6c 65 20 74 68 61 74 20 63 75 72  ariable that cur
16a70 72 65 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e  rently has a non
16a80 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e  -NULL value boun
16a90 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61  d to it,.** crea
16aa0 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  te an sqlite3_va
16ab0 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
16ac0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61  ntaining this va
16ad0 6c 75 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a  lue, again with.
16ae0 2a 2a 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ** affinity aff 
16af0 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69  applied to it, i
16b00 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
16b10 20 6e 65 69 74 68 65 72 20 6f 66 20 74 68 65 20   neither of the 
16b20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74  above apply, set
16b30 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   *pp to NULL..**
16b40 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
16b50 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
16b60 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
16b70 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
16b80 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  OK..*/.#ifdef SQ
16b90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
16ba0 33 0a 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c  3.static int val
16bb0 75 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61  ueFromExpr(.  Pa
16bc0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
16bd0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20  Expr *pExpr, .  
16be0 75 38 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74  u8 aff, .  sqlit
16bf0 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b  e3_value **pp.){
16c00 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
16c10 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20  ==TK_VARIABLE.  
16c20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d   || (pExpr->op==
16c30 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
16c40 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41  Expr->op2==TK_VA
16c50 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20 20  RIABLE).  ){.   
16c60 20 69 6e 74 20 69 56 61 72 20 3d 20 70 45 78 70   int iVar = pExp
16c70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
16c80 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
16c90 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
16ca0 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20  dbe, iVar);.    
16cb0 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  *pp = sqlite3Vdb
16cc0 65 47 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eGetValue(pParse
16cd0 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69 56  ->pReprepare, iV
16ce0 61 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 72 65  ar, aff);.    re
16cf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16d00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
16d10 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70  ite3ValueFromExp
16d20 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  r(pParse->db, pE
16d30 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  xpr, SQLITE_UTF8
16d40 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65  , aff, pp);.}.#e
16d50 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
16d60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
16d70 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  d to estimate th
16d80 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
16d90 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69   that will be vi
16da0 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e  sited.** by scan
16db0 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f  ning an index fo
16dc0 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c  r a range of val
16dd0 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d  ues. The range m
16de0 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72  ay have an upper
16df0 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77  .** bound, a low
16e00 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74  er bound, or bot
16e10 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  h. The WHERE cla
16e20 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73  use terms that s
16e30 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20  et the upper.** 
16e40 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73  and lower bounds
16e50 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64   are represented
16e60 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70   by pLower and p
16e70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65  Upper respective
16e80 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  ly. For.** examp
16e90 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  le, assuming tha
16ea0 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  t index p is on 
16eb0 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  t1(a):.**.**   .
16ec0 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
16ed0 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
16ee0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
16ef0 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f             |____
16f00 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20  _|   |_____|.** 
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16f30 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
16f40 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
16f50 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20     pUpper.**.** 
16f60 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
16f70 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20   upper or lower 
16f80 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65  bound is not pre
16f90 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20  sent, then NULL 
16fa0 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20  is passed in.** 
16fb0 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72  place of the cor
16fc0 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
16fd0 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Term..**.** The 
16fe0 6e 45 71 20 70 61 72 61 6d 65 74 65 72 20 69 73  nEq parameter is
16ff0 20 70 61 73 73 65 64 20 74 68 65 20 69 6e 64 65   passed the inde
17000 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63  x of the index c
17010 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f  olumn subject to
17020 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f   the.** range co
17030 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71  nstraint. Or, eq
17040 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20  uivalently, the 
17050 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  number of equali
17060 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ty constraints.*
17070 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74  * optimized by t
17080 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65  he proposed inde
17090 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d  x scan. For exam
170a0 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e  ple, assuming in
170b0 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74  dex p is.** on t
170c0 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65  1(a, b), and the
170d0 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a   SQL query is:.*
170e0 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
170f0 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41  t1 WHERE a = ? A
17100 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c  ND b > ? AND b <
17110 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
17120 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20  n nEq should be 
17130 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65  passed the value
17140 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65   1 (as the range
17150 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75   restricted colu
17160 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65  mn,.** b, is the
17170 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73   second left-mos
17180 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
17190 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74  index). Or, if t
171a0 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  he query is:.**.
171b0 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
171c0 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
171d0 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   a < ? ....**.**
171e0 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64   then nEq should
171f0 20 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a   be passed 0..**
17200 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
17210 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74   value is an int
17220 65 67 65 72 20 64 69 76 69 73 6f 72 20 74 6f 20  eger divisor to 
17230 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69 6d  reduce the estim
17240 61 74 65 64 0a 2a 2a 20 73 65 61 72 63 68 20 73  ated.** search s
17250 70 61 63 65 2e 20 20 41 20 72 65 74 75 72 6e 20  pace.  A return 
17260 76 61 6c 75 65 20 6f 66 20 31 20 6d 65 61 6e 73  value of 1 means
17270 20 74 68 61 74 20 72 61 6e 67 65 20 63 6f 6e 73   that range cons
17280 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 6e  traints are.** n
17290 6f 20 68 65 6c 70 20 61 74 20 61 6c 6c 2e 20 20  o help at all.  
172a0 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  A return value o
172b0 66 20 32 20 6d 65 61 6e 73 20 72 61 6e 67 65 20  f 2 means range 
172c0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a  constraints are.
172d0 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 72  ** expected to r
172e0 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
172f0 20 73 70 61 63 65 20 62 79 20 68 61 6c 66 2e 20   space by half. 
17300 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 2e 2e   And so forth...
17310 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  .**.** In the ab
17320 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f  sence of sqlite_
17330 73 74 61 74 33 20 41 4e 41 4c 59 5a 45 20 64 61  stat3 ANALYZE da
17340 74 61 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69  ta, each range i
17350 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64  nequality.** red
17360 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
17370 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f  space by a facto
17380 72 20 6f 66 20 34 2e 20 20 48 65 6e 63 65 20 61  r of 4.  Hence a
17390 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
173a0 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75  nt (x>?).** resu
173b0 6c 74 73 20 69 6e 20 61 20 72 65 74 75 72 6e 20  lts in a return 
173c0 6f 66 20 34 20 61 6e 64 20 61 20 72 61 6e 67 65  of 4 and a range
173d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f   constraint (x>?
173e0 20 41 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c 74   AND x<?) result
173f0 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75 72 6e  s.** in a return
17400 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74 69   of 16..*/.stati
17410 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
17420 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
17430 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
17440 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
17450 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
17460 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
17470 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
17480 2a 20 54 68 65 20 69 6e 64 65 78 20 63 6f 6e 74  * The index cont
17490 61 69 6e 69 6e 67 20 74 68 65 20 72 61 6e 67 65  aining the range
174a0 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e  -compared column
174b0 3b 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e  ; "x" */.  int n
174c0 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq,             
174d0 2f 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d  /* index into p-
174e0 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72  >aCol[] of the r
174f0 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f  ange-compared co
17500 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  lumn */.  WhereT
17510 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
17520 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
17530 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
17540 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
17550 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
17560 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
17570 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
17580 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
17590 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
175a0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
175b0 65 43 6f 73 74 20 2a 70 52 61 6e 67 65 44 69 76  eCost *pRangeDiv
175c0 20 2f 2a 20 4f 55 54 3a 20 52 65 64 75 63 65 20   /* OUT: Reduce 
175d0 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
175e0 74 68 69 73 20 64 69 76 69 73 6f 72 20 2a 2f 0a  this divisor */.
175f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
17600 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66  LITE_OK;..#ifdef
17610 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
17620 54 41 54 33 0a 0a 20 20 69 66 28 20 6e 45 71 3d  TAT3..  if( nEq=
17630 3d 30 20 26 26 20 70 2d 3e 6e 53 61 6d 70 6c 65  =0 && p->nSample
17640 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
17650 76 61 6c 75 65 20 2a 70 52 61 6e 67 65 56 61 6c  value *pRangeVal
17660 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c  ;.    tRowcnt iL
17670 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 74 52  ower = 0;.    tR
17680 6f 77 63 6e 74 20 69 55 70 70 65 72 20 3d 20 70  owcnt iUpper = p
17690 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
176a0 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b     tRowcnt a[2];
176b0 0a 20 20 20 20 75 38 20 61 66 66 20 3d 20 70 2d  .    u8 aff = p-
176c0 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
176d0 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66  >aiColumn[0]].af
176e0 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66 28  finity;..    if(
176f0 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20   pLower ){.     
17700 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
17710 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
17720 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  ight;.      rc =
17730 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70   valueFromExpr(p
17740 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66  Parse, pExpr, af
17750 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a  f, &pRangeVal);.
17760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
17770 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
17780 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
17790 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
177a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
177b0 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65 4b         && whereK
177c0 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
177d0 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 30 2c  p, pRangeVal, 0,
177e0 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   a)==SQLITE_OK. 
177f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
17800 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iLower = a[0];. 
17810 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 77         if( (pLow
17820 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
17830 57 4f 5f 47 54 29 21 3d 30 20 29 20 69 4c 6f 77  WO_GT)!=0 ) iLow
17840 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  er += a[1];.    
17850 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
17860 33 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67  3ValueFree(pRang
17870 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eVal);.    }.   
17880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17890 4f 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a  OK && pUpper ){.
178a0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
178b0 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70  r = pUpper->pExp
178c0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
178d0 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45   rc = valueFromE
178e0 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
178f0 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56  r, aff, &pRangeV
17900 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
17910 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  t( (pUpper->eOpe
17920 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
17930 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_LE))!=0 );.   
17940 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17950 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77  E_OK.       && w
17960 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
17970 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61  rse, p, pRangeVa
17980 6c 2c 20 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45  l, 1, a)==SQLITE
17990 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  _OK.      ){.   
179a0 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b       iUpper = a[
179b0 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
179c0 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
179d0 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
179e0 20 69 55 70 70 65 72 20 2b 3d 20 61 5b 31 5d 3b   iUpper += a[1];
179f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17a00 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
17a10 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20  pRangeVal);.    
17a20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
17a30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17a40 20 57 68 65 72 65 43 6f 73 74 20 69 42 61 73 65   WhereCost iBase
17a50 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70 2d 3e   = whereCost(p->
17a60 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b 0a 20 20  aiRowEst[0]);.  
17a70 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69      if( iUpper>i
17a80 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Lower ){.       
17a90 20 69 42 61 73 65 20 2d 3d 20 77 68 65 72 65 43   iBase -= whereC
17aa0 6f 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f  ost(iUpper - iLo
17ab0 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  wer);.      }.  
17ac0 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d      *pRangeDiv =
17ad0 20 69 42 61 73 65 3b 0a 20 20 20 20 20 20 57 48   iBase;.      WH
17ae0 45 52 45 54 52 41 43 45 28 30 78 31 30 30 2c 20  ERETRACE(0x100, 
17af0 28 22 72 61 6e 67 65 20 73 63 61 6e 20 72 65 67  ("range scan reg
17b00 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64 69  ions: %u..%u  di
17b10 76 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  v=%d\n",.       
17b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b30 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28    (u32)iLower, (
17b40 75 33 32 29 69 55 70 70 65 72 2c 20 2a 70 52 61  u32)iUpper, *pRa
17b50 6e 67 65 44 69 76 29 29 3b 0a 20 20 20 20 20 20  ngeDiv));.      
17b60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17b70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
17b80 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
17b90 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20  ETER(pParse);.  
17ba0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
17bb0 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  (p);.  UNUSED_PA
17bc0 52 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23 65  RAMETER(nEq);.#e
17bd0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
17be0 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
17bf0 29 3b 0a 20 20 2a 70 52 61 6e 67 65 44 69 76 20  );.  *pRangeDiv 
17c00 3d 20 30 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  = 0;.  /* TUNING
17c10 3a 20 20 45 61 63 68 20 69 6e 65 71 75 61 6c 69  :  Each inequali
17c20 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65  ty constraint re
17c30 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
17c40 20 73 70 61 63 65 20 34 2d 66 6f 6c 64 2e 0a 20   space 4-fold.. 
17c50 20 2a 2a 20 41 20 42 45 54 57 45 45 4e 20 6f 70   ** A BETWEEN op
17c60 65 72 61 74 6f 72 2c 20 74 68 65 72 65 66 6f 72  erator, therefor
17c70 65 2c 20 72 65 64 75 63 65 73 20 74 68 65 20 73  e, reduces the s
17c80 65 61 72 63 68 20 73 70 61 63 65 20 31 36 2d 66  earch space 16-f
17c90 6f 6c 64 20 2a 2f 0a 20 20 69 66 28 20 70 4c 6f  old */.  if( pLo
17ca0 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e  wer && (pLower->
17cb0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
17cc0 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
17cd0 2a 70 52 61 6e 67 65 44 69 76 20 2b 3d 20 32 30  *pRangeDiv += 20
17ce0 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 77  ;  assert( 20==w
17cf0 68 65 72 65 43 6f 73 74 28 34 29 20 29 3b 0a 20  hereCost(4) );. 
17d00 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20   }.  if( pUpper 
17d10 29 7b 0a 20 20 20 20 2a 70 52 61 6e 67 65 44 69  ){.    *pRangeDi
17d20 76 20 2b 3d 20 32 30 3b 20 20 61 73 73 65 72 74  v += 20;  assert
17d30 28 20 32 30 3d 3d 77 68 65 72 65 43 6f 73 74 28  ( 20==whereCost(
17d40 34 29 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  4) );.  }.  retu
17d50 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
17d60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
17d70 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT3./*.** Estim
17d80 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
17d90 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
17da0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
17db0 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61  ed on.** an equa
17dc0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
17dd0 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72  x=VALUE and wher
17de0 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63  e that VALUE occ
17df0 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69  urs in.** the hi
17e00 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54  stogram data.  T
17e10 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77  his only works w
17e20 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66  hen x is the lef
17e30 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  t-most.** column
17e40 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64   of an index and
17e50 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69   sqlite_stat3 hi
17e60 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20  stogram data is 
17e70 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72  available.** for
17e80 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68   that index.  Wh
17e90 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74  en pExpr==NULL t
17ea0 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  hat means the co
17eb0 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22  nstraint is.** "
17ec0 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65  x IS NULL" inste
17ed0 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e  ad of "x=VALUE".
17ee0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
17ef0 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63   estimated row c
17f00 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77  ount into *pnRow
17f10 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
17f20 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e  TE_OK. .** If un
17f30 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20  able to make an 
17f40 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20  estimate, leave 
17f50 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64  *pnRow unchanged
17f60 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
17f70 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
17f80 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
17f90 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e  fail if it is un
17fa0 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63  able to load a c
17fb0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
17fc0 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f  e.** required fo
17fd0 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  r string compari
17fe0 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c  son, or if unabl
17ff0 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
18000 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54  mory.** for a UT
18010 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71  F conversion req
18020 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72  uired for compar
18030 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  ison.  The error
18040 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
18050 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
18060 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
18070 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53   int whereEqualS
18080 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
18090 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
180a0 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
180b0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
180c0 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
180d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
180e0 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
180f0 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
18100 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20  n is pTerm */.  
18110 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
18120 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
18130 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20  on for VALUE in 
18140 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73  the x=VALUE cons
18150 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77  traint */.  tRow
18160 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20  cnt *pnRow      
18170 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
18180 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61  vised row estima
18190 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  te here */.){.  
181a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
181b0 52 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56 41 4c  Rhs = 0;  /* VAL
181c0 55 45 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64  UE on right-hand
181d0 20 73 69 64 65 20 6f 66 20 70 54 65 72 6d 20 2a   side of pTerm *
181e0 2f 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20  /.  u8 aff;     
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18200 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   Column affinity
18210 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
18240 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
18250 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20  tRowcnt a[2];   
18260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
18270 74 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73  tistics */..  as
18280 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
18290 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
182a0 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
182b0 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  .  aff = p->pTab
182c0 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
182d0 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74  lumn[0]].affinit
182e0 79 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  y;.  if( pExpr )
182f0 7b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65  {.    rc = value
18300 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
18310 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52   pExpr, aff, &pR
18320 68 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  hs);.    if( rc 
18330 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61  ) goto whereEqua
18340 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b  lScanEst_cancel;
18350 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
18360 68 73 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  hs = sqlite3Valu
18370 65 4e 65 77 28 70 50 61 72 73 65 2d 3e 64 62 29  eNew(pParse->db)
18380 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 68 73  ;.  }.  if( pRhs
18390 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
183a0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
183b0 72 63 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61  rc = whereKeySta
183c0 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
183d0 68 73 2c 20 30 2c 20 61 29 3b 0a 20 20 69 66 28  hs, 0, a);.  if(
183e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
183f0 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  {.    WHERETRACE
18400 28 30 78 31 30 30 2c 28 22 65 71 75 61 6c 69 74  (0x100,("equalit
18410 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  y scan regions: 
18420 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d  %d\n", (int)a[1]
18430 29 29 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  ));.    *pnRow =
18440 20 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68 65 72 65   a[1];.  }.where
18450 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e  EqualScanEst_can
18460 63 65 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56 61  cel:.  sqlite3Va
18470 6c 75 65 46 72 65 65 28 70 52 68 73 29 3b 0a 20  lueFree(pRhs);. 
18480 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
18490 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
184a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
184b0 41 54 33 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  AT3) */..#ifdef 
184c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
184d0 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT3./*.** Estima
184e0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
184f0 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
18500 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65  be returned base
18510 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f  d on.** an IN co
18520 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20 74  nstraint where t
18530 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
18540 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
18550 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69  rator.** is a li
18560 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45  st of values.  E
18570 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
18580 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20       WHERE x IN 
18590 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20  (1,2,3,4).**.** 
185a0 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61  Write the estima
185b0 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e  ted row count in
185c0 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65  to *pnRow and re
185d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
185e0 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  .** If unable to
185f0 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74   make an estimat
18600 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20  e, leave *pnRow 
18610 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65  unchanged and re
18620 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
18630 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
18640 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66  tine can fail if
18650 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f   it is unable to
18660 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e   load a collatin
18670 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65  g sequence.** re
18680 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e  quired for strin
18690 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72  g comparison, or
186a0 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c   if unable to al
186b0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a  locate memory.**
186c0 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65   for a UTF conve
186d0 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66  rsion required f
186e0 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  or comparison.  
186f0 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f  The error is sto
18700 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50  red.** in the pP
18710 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
18720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
18730 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20  ereInScanEst(.  
18740 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
18750 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
18760 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
18770 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
18780 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
18790 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
187a0 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74   whose left-most
187b0 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d   column is pTerm
187c0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
187d0 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68  pList,     /* Th
187e0 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20  e value list on 
187f0 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e  the RHS of "x IN
18800 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22   (v1,v2,v3,...)"
18810 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
18820 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
18830 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
18840 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
18850 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
18860 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
18870 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
18880 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
18890 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20    tRowcnt nEst; 
188a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
188b0 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20  ber of rows for 
188c0 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f  a single term */
188d0 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45  .  tRowcnt nRowE
188e0 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65  st = 0;    /* Ne
188f0 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  w estimate of th
18900 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
18910 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18930 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
18940 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ..  assert( p->a
18950 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66  Sample!=0 );.  f
18960 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
18970 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74  TE_OK && i<pList
18980 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
18990 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52     nEst = p->aiR
189a0 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63  owEst[0];.    rc
189b0 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
189c0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 2c 20  nEst(pParse, p, 
189d0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
189e0 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e  r, &nEst);.    n
189f0 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a  RowEst += nEst;.
18a00 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
18a10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
18a20 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e  f( nRowEst > p->
18a30 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52  aiRowEst[0] ) nR
18a40 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77  owEst = p->aiRow
18a50 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52  Est[0];.    *pnR
18a60 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
18a70 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
18a80 30 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69  00,("IN row esti
18a90 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c  mate: est=%g\n",
18aa0 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a   nRowEst));.  }.
18ab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
18ac0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
18ad0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
18ae0 54 41 54 33 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TAT3) */../*.** 
18af0 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69  Disable a term i
18b00 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
18b10 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20  se.  Except, do 
18b20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20  not disable the 
18b30 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f  term.** if it co
18b40 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55  ntrols a LEFT OU
18b50 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20  TER JOIN and it 
18b60 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
18b70 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f  e in the ON.** o
18b80 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
18b90 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a  f that join..**.
18ba0 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
18bb0 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69  term t2.z='ok' i
18bc0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
18bd0 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  queries:.**.**  
18be0 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (1)  SELECT * F
18bf0 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
18c00 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
18c10 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27   WHERE t2.z='ok'
18c20 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43  .**   (2)  SELEC
18c30 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
18c40 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
18c50 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
18c60 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45  ok'.**   (3)  SE
18c70 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
18c80 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32  t2 WHERE t1.a=t2
18c90 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
18ca0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d  .**.** The t2.z=
18cb0 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64  'ok' is disabled
18cc0 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62   in the in (2) b
18cd0 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e  ecause it origin
18ce0 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  ates.** in the O
18cf0 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74  N clause.  The t
18d00 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20  erm is disabled 
18d10 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69  in (3) because i
18d20 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a  t is not part.**
18d30 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
18d40 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20   JOIN.  In (1), 
18d50 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
18d60 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  disabled..**.** 
18d70 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
18d80 46 3a 20 52 2d 32 34 35 39 37 2d 35 38 36 35 35  F: R-24597-58655
18d90 20 4e 6f 20 74 65 73 74 73 20 61 72 65 20 64 6f   No tests are do
18da0 6e 65 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61  ne for terms tha
18db0 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74  t are.** complet
18dc0 65 6c 79 20 73 61 74 69 73 66 69 65 64 20 62 79  ely satisfied by
18dd0 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   indices..**.** 
18de0 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d  Disabling a term
18df0 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72   causes that ter
18e00 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74  m to not be test
18e10 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ed in the inner 
18e20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  loop.** of the j
18e30 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  oin.  Disabling 
18e40 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
18e50 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20  on.  When terms 
18e60 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
18e70 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20   by indices, we 
18e80 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20  disable them to 
18e90 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e  prevent redundan
18ea0 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69  t tests in the i
18eb0 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57  nner.** loop.  W
18ec0 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20  e would get the 
18ed0 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20  correct results 
18ee0 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20  if nothing were 
18ef0 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a  ever disabled,.*
18f00 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68  * but joins migh
18f10 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
18f20 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63  lower.  The tric
18f30 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20  k is to disable 
18f40 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65  as much.** as we
18f50 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73   can without dis
18f60 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e  abling too much.
18f70 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64    If we disabled
18f80 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65   in (1), we'd ge
18f90 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61  t.** the wrong a
18fa0 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b  nswer.  See tick
18fb0 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74  et #813..*/.stat
18fc0 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54  ic void disableT
18fd0 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a  erm(WhereLevel *
18fe0 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72  pLevel, WhereTer
18ff0 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28  m *pTerm){.  if(
19000 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20   pTerm.      && 
19010 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
19020 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
19030 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  .      && (pLeve
19040 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20  l->iLeftJoin==0 
19050 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
19060 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
19070 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
19080 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77   ){.    pTerm->w
19090 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
190a0 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
190b0 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
190c0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
190d0 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
190e0 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
190f0 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
19100 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
19110 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
19120 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
19130 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
19140 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
19150 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
19160 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e  Code an OP_Affin
19170 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70  ity opcode to ap
19180 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  ply the column a
19190 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a  ffinity string z
191a0 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20  Aff.** to the n 
191b0 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
191c0 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a  ng at base. .**.
191d0 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** As an optimiz
191e0 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46  ation, SQLITE_AF
191f0 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28  F_NONE entries (
19200 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73  which are no-ops
19210 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69  ) at the.** begi
19220 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66  nning and end of
19230 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65   zAff are ignore
19240 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69  d.  If all entri
19250 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a  es in zAff are.*
19260 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
19270 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20  E, then no code 
19280 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  gets generated..
19290 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
192a0 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e  ne makes its own
192b0 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f   copy of zAff so
192c0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
192d0 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d   is free.** to m
192e0 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72  odify zAff after
192f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
19300 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
19310 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41   void codeApplyA
19320 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
19330 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c  Parse, int base,
19340 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41   int n, char *zA
19350 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ff){.  Vdbe *v =
19360 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
19370 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b    if( zAff==0 ){
19380 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
19390 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
193a0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
193b0 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
193c0 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
193d0 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64   Adjust base and
193e0 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20   n to skip over 
193f0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
19400 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62  entries at the b
19410 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e  eginning.  ** an
19420 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66  d end of the aff
19430 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  inity string..  
19440 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  */.  while( n>0 
19450 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49  && zAff[0]==SQLI
19460 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
19470 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65     n--;.    base
19480 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a  ++;.    zAff++;.
19490 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31    }.  while( n>1
194a0 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53   && zAff[n-1]==S
194b0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
194c0 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a  {.    n--;.  }..
194d0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50    /* Code the OP
194e0 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
194f0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
19500 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f  thing left to do
19510 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29  . */.  if( n>0 )
19520 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
19530 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66  eAddOp2(v, OP_Af
19540 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29  finity, base, n)
19550 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19560 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
19570 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73   zAff, n);.    s
19580 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
19590 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
195a0 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  arse, base, n);.
195b0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
195c0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
195d0 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
195e0 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
195f0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
19600 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
19610 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
19620 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
19630 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
19640 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
19650 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
19660 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
19670 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
19680 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20  aint is left in 
19690 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
196a0 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74  *.** For a const
196b0 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  raint of the for
196c0 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78  m X=expr, the ex
196d0 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
196e0 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a  uated and its.**
196f0 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20   result is left 
19700 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46  on the stack.  F
19710 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
19720 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
19730 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
19740 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
19750 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
19760 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
19770 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
19780 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
19790 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
197a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
197b0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
197c0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
197d0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
197e0 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
197f0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
19800 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
19810 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
19820 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c  pLevel, /* The l
19830 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d  evel of the FROM
19840 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77   clause we are w
19850 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69  orking on */.  i
19860 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20  nt iEq,         
19870 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
19880 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
19890 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76   within this lev
198a0 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  el */.  int bRev
198b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
198c0 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d  rue for reverse-
198d0 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69  order IN operati
198e0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
198f0 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  rget         /* 
19900 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65  Attempt to leave
19910 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73   results in this
19920 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
19930 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
19940 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
19950 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
19960 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67  Vdbe;.  int iReg
19970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19980 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
19990 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  olding results *
199a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  /..  assert( iTa
199b0 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
199c0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b  pX->op==TK_EQ ){
199d0 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
199e0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
199f0 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  t(pParse, pX->pR
19a00 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
19a10 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e    }else if( pX->
19a20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
19a30 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
19a40 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  get;.    sqlite3
19a50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19a60 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b  _Null, 0, iReg);
19a70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19a80 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
19a90 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65  }else{.    int e
19aa0 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54  Type;.    int iT
19ab0 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  ab;.    struct I
19ac0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
19ad0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
19ae0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
19af0 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  p;..    if( (pLo
19b00 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
19b10 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
19b20 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  )==0.      && pL
19b30 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
19b40 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20  dex!=0.      && 
19b50 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
19b60 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
19b70 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20  r[iEq].    ){.  
19b80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45      testcase( iE
19b90 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  q==0 );.      te
19ba0 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a  stcase( bRev );.
19bb0 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52        bRev = !bR
19bc0 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ev;.    }.    as
19bd0 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
19be0 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
19bf0 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
19c00 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
19c10 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
19c20 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66  , pX, 0);.    if
19c30 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
19c40 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
19c50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19c60 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52  bRev );.      bR
19c70 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20  ev = !bRev;.    
19c80 7d 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d  }.    iTab = pX-
19c90 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c  >iTable;.    sql
19ca0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19cb0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
19cc0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54   : OP_Rewind, iT
19cd0 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  ab, 0);.    asse
19ce0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
19cf0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
19d00 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20  I_OR)==0 );.    
19d10 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
19d20 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b  = WHERE_IN_ABLE;
19d30 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
19d40 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a  >u.in.nIn==0 ){.
19d50 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64        pLevel->ad
19d60 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
19d70 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19d80 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
19d90 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20  l->u.in.nIn++;. 
19da0 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
19db0 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20  aInLoop =.      
19dc0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
19dd0 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e  cOrFree(pParse->
19de0 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  db, pLevel->u.in
19df0 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20  .aInLoop,.      
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e10 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70          sizeof(p
19e20 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
19e30 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e  oop[0])*pLevel->
19e40 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70  u.in.nIn);.    p
19e50 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  In = pLevel->u.i
19e60 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69  n.aInLoop;.    i
19e70 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20  f( pIn ){.      
19e80 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIn += pLevel->u
19e90 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20  .in.nIn - 1;.   
19ea0 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69     pIn->iCur = i
19eb0 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65  Tab;.      if( e
19ec0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
19ed0 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OWID ){.        
19ee0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
19ef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19f00 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
19f10 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20  iTab, iReg);.   
19f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19f30 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
19f40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19f50 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
19f60 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67  n, iTab, 0, iReg
19f70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19f80 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
19f90 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
19fa0 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
19fb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19fc0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
19fd0 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65  l, iReg);.    }e
19fe0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
19ff0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b  l->u.in.nIn = 0;
1a000 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1a010 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28  }.  disableTerm(
1a020 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
1a030 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
1a040 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1a050 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1a060 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20  evaluate all == 
1a070 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
1a080 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64  ts for an.** ind
1a090 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ex..**.** For ex
1a0a0 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
1a0b0 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
1a0c0 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
1a0d0 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
1a0e0 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
1a0f0 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
1a100 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
1a110 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
1a120 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
1a130 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
1a140 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
1a150 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
1a160 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
1a170 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
1a180 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
1a190 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
1a1a0 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
1a1b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
1a1c0 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
1a1d0 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
1a1e0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
1a1f0 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
1a200 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
1a210 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1a220 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
1a230 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20  ll be stored.** 
1a240 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  in consecutive r
1a250 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
1a260 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
1a270 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20  rst register is 
1a280 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1a290 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
1a2a0 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
1a2b0 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
1a2c0 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
1a2d0 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
1a2e0 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
1a2f0 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
1a300 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
1a310 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
1a320 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
1a330 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
1a340 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
1a350 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a  memory cell and.
1a360 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61  ** compute the a
1a370 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
1a380 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a390 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ne always alloca
1a3a0 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  tes at least one
1a3b0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
1a3c0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
1a3d0 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65  index of that me
1a3e0 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63  mory cell. The c
1a3f0 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c  ode that.** call
1a400 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
1a410 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d  ill use that mem
1a420 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72  ory cell to stor
1a430 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f  e the terminatio
1a440 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f  n.** key value o
1a450 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
1a460 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f  one or more IN o
1a470 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c  perators appear,
1a480 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
1a490 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
1a4a0 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45  an additional nE
1a4b0 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  q memory cells f
1a4c0 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75  or internal.** u
1a4d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  se..**.** Before
1a4e0 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41   returning, *pzA
1a4f0 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ff is set to poi
1a500 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
1a510 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63  ontaining a.** c
1a520 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
1a530 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
1a540 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  g of the index a
1a550 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a  llocated using.*
1a560 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  * sqlite3DbMallo
1a570 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74  c(). Except, ent
1a580 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79  ries in the copy
1a590 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61   of the string a
1a5a0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
1a5b0 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  h equality const
1a5c0 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20  raints that use 
1a5d0 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72  NONE affinity ar
1a5e0 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49  e set to.** SQLI
1a5f0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69  TE_AFF_NONE. Thi
1a600 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74  s is to deal wit
1a610 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68  h SQL such as th
1a620 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
1a630 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
1a640 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d  E t1(a TEXT PRIM
1a650 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20  ARY KEY, b);.** 
1a660 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
1a670 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57  M t1 AS t2, t1 W
1a680 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62  HERE t1.a = t2.b
1a690 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ;.**.** In the e
1a6a0 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
1a6b0 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29  e index on t1(a)
1a6c0 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69   has TEXT affini
1a6d0 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a  ty. But since.**
1a6e0 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
1a6f0 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61  side of the equa
1a700 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1a710 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20  (t2.b) has NONE 
1a720 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20  affinity,.** no 
1a730 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c  conversion shoul
1a740 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62  d be attempted b
1a750 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32  efore using a t2
1a760 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74  .b value as part
1a770 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20   of.** a key to 
1a780 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78  search the index
1a790 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73  . Hence the firs
1a7a0 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65  t byte in the re
1a7b0 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a  turned affinity.
1a7c0 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69  ** string in thi
1a7d0 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20  s example would 
1a7e0 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
1a7f0 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74  _AFF_NONE..*/.st
1a800 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c  atic int codeAll
1a810 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20  EqualityTerms(. 
1a820 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1a830 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1a840 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
1a850 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1a860 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65  l,   /* Which ne
1a870 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
1a880 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64   FROM we are cod
1a890 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ing */.  WhereCl
1a8a0 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f  ause *pWC,     /
1a8b0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1a8c0 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  se */.  Bitmask 
1a8d0 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
1a8e0 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20   Which parts of 
1a8f0 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65  FROM have not ye
1a900 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a  t been coded */.
1a910 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20    int bRev,     
1a920 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65 72          /* Rever
1a930 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  se the order of 
1a940 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  IN operators */.
1a950 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c    int nExtraReg,
1a960 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a970 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
1a980 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
1a990 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41   */.  char **pzA
1a9a0 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ff          /* O
1a9b0 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74  UT: Set to point
1a9c0 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72   to affinity str
1a9d0 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
1a9e0 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
1a9f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1aa00 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
1aa10 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
1aa20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62  to code */.  Vdb
1aa30 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1aa40 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
1aa50 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
1aa60 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
1aa70 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
1aa80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1aa90 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
1aaa0 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
1aab0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1aac0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
1aad0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
1aae0 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20  constraint term 
1aaf0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1ab00 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
1ab10 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
1ab20 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
1ab30 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ab50 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1ab60 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab80 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
1ab90 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b  r */.  int nReg;
1aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1abc0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  f registers to a
1abd0 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
1abe0 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20  r *zAff;        
1abf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
1ac00 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
1ac10 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
1ac20 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   This module is 
1ac30 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71  only called on q
1ac40 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20  uery plans that 
1ac50 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f  use an index. */
1ac60 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
1ac70 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73  l->pWLoop;.  ass
1ac80 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
1ac90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1aca0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
1acb0 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  .  nEq = pLoop->
1acc0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 70  u.btree.nEq;.  p
1acd0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
1ace0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61  tree.pIndex;.  a
1acf0 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
1ad00 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
1ad10 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
1ad20 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
1ad30 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
1ad40 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
1ad50 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
1ad60 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
1ad70 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Reg = pLoop->u.b
1ad80 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72  tree.nEq + nExtr
1ad90 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  aReg;.  pParse->
1ada0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20  nMem += nReg;.. 
1adb0 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44   zAff = sqlite3D
1adc0 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
1add0 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78  db, sqlite3Index
1ade0 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
1adf0 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41  Idx));.  if( !zA
1ae00 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ff ){.    pParse
1ae10 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1ae20 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = 1;.  }..  /
1ae30 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
1ae40 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1ae50 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
1ae60 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
1ae70 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a  >=nEq );.  for(j
1ae80 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
1ae90 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20  .    int r1;.   
1aea0 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
1aeb0 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61  aLTerm[j];.    a
1aec0 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
1aed0 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  );.    /* The fo
1aee0 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20 66 6f 72  llowing true for
1aef0 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 72 65   indices with re
1af00 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e  dundant columns.
1af10 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45   .    ** Ex: CRE
1af20 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
1af30 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43  t1(a,b,a); SELEC
1af40 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
1af50 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a  E a=0 AND b=0; *
1af60 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  /.    testcase( 
1af70 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
1af80 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30  & TERM_CODED)!=0
1af90 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1afa0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
1afb0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1afc0 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
1afd0 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 72  5-11662 */.    r
1afe0 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  1 = codeEquality
1aff0 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1b000 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62  rm, pLevel, j, b
1b010 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b  Rev, regBase+j);
1b020 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67  .    if( r1!=reg
1b030 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20  Base+j ){.      
1b040 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
1b050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
1b060 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1b070 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20  rse, regBase);. 
1b080 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
1b090 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   r1;.      }else
1b0a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b0b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b0c0 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67  P_SCopy, r1, reg
1b0d0 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  Base+j);.      }
1b0e0 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1b0f0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
1b100 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
1b110 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
1b120 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
1b130 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
1b140 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
1b150 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
1b160 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30  SNULL|WO_IN))==0
1b170 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1b180 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e  pRight = pTerm->
1b190 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
1b1a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b1b0 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
1b1c0 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
1b1d0 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e+j, pLevel->add
1b1e0 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  rBrk);.      if(
1b1f0 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20   zAff ){.       
1b200 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
1b210 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
1b220 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51  ht, zAff[j])==SQ
1b230 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
1b240 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
1b250 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  j] = SQLITE_AFF_
1b260 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
1b270 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1b280 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
1b290 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
1b2a0 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b  ght, zAff[j]) ){
1b2b0 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
1b2c0 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  j] = SQLITE_AFF_
1b2d0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
1b2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b2f0 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66  }.  *pzAff = zAf
1b300 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42  f;.  return regB
1b310 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ase;.}..#ifndef 
1b320 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
1b330 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  AIN./*.** This r
1b340 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70  outine is a help
1b350 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e  er for explainIn
1b360 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77  dexRange() below
1b370 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64  .**.** pStr hold
1b380 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e  s the text of an
1b390 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
1b3a0 20 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67   we are building
1b3b0 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20   up one term.** 
1b3c0 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73  at a time.  This
1b3d0 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20   routine adds a 
1b3e0 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20  new term to the 
1b3f0 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70 72 65  end of the expre
1b400 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20  ssion..** Terms 
1b410 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62 79  are separated by
1b420 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20   AND so add the 
1b430 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73  "AND" text for s
1b440 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71  econd and subseq
1b450 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e  uent.** terms on
1b460 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
1b470 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64  id explainAppend
1b480 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d  Term(.  StrAccum
1b490 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20 20   *pStr,         
1b4a0 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
1b4b0 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67  expression being
1b4c0 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20   built */.  int 
1b4d0 69 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iTerm,          
1b4e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1b4f0 20 6f 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20   of this term.  
1b500 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f  First is zero */
1b510 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b520 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f  Column,        /
1b530 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
1b540 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
1b550 63 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20  char *zOp       
1b560 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1b570 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f   the operator */
1b580 0a 29 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20  .){.  if( iTerm 
1b590 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
1b5a0 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20  mAppend(pStr, " 
1b5b0 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c  AND ", 5);.  sql
1b5c0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1b5d0 6e 64 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e  nd(pStr, zColumn
1b5e0 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , -1);.  sqlite3
1b5f0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
1b600 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20  Str, zOp, 1);.  
1b610 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1b620 70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c  ppend(pStr, "?",
1b630 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72   1);.}../*.** Ar
1b640 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65  gument pLevel de
1b650 73 63 72 69 62 65 73 20 61 20 73 74 72 61 74 65  scribes a strate
1b660 67 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20  gy for scanning 
1b670 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73  table pTab. This
1b680 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
1b690 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
1b6a0 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
1b6b0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
1b6c0 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f  description.** o
1b6d0 66 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20  f the subset of 
1b6e0 74 61 62 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e  table rows scann
1b6f0 65 64 20 62 79 20 74 68 65 20 73 74 72 61 74 65  ed by the strate
1b700 67 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f  gy in the form o
1b710 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72  f an.** SQL expr
1b720 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61  ession. Or, if a
1b730 6c 6c 20 72 6f 77 73 20 61 72 65 20 73 63 61 6e  ll rows are scan
1b740 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  ned, NULL is ret
1b750 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  urned..**.** For
1b760 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1b770 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1b780 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1b790 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62   WHERE a=1 AND b
1b7a0 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e  >2;.**.** is run
1b7b0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e   and there is an
1b7c0 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29   index on (a, b)
1b7d0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1b7e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a  tion returns a.*
1b7f0 2a 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61 72  * string similar
1b800 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d   to:.**.**   "a=
1b810 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a  ? AND b>?".**.**
1b820 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f   The returned po
1b830 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  inter points to 
1b840 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
1b850 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
1b860 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73  lloc()..** It is
1b870 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
1b880 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
1b890 72 20 74 6f 20 66 72 65 65 20 74 68 65 20 62 75  r to free the bu
1b8a0 66 66 65 72 20 77 68 65 6e 20 69 74 20 69 73 0a  ffer when it is.
1b8b0 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  ** no longer req
1b8c0 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
1b8d0 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e   char *explainIn
1b8e0 64 65 78 52 61 6e 67 65 28 73 71 6c 69 74 65 33  dexRange(sqlite3
1b8f0 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
1b900 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70  *pLoop, Table *p
1b910 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
1b920 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
1b930 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
1b940 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   int nEq = pLoop
1b950 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
1b960 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c   int i, j;.  Col
1b970 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62  umn *aCol = pTab
1b980 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61  ->aCol;.  int *a
1b990 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  iColumn = pIndex
1b9a0 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74  ->aiColumn;.  St
1b9b0 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69  rAccum txt;..  i
1b9c0 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 72  f( pIndex==0 ) r
1b9d0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 6e  eturn 0;.  if( n
1b9e0 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d  Eq==0 && (pLoop-
1b9f0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
1ba00 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
1ba10 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30  E_TOP_LIMIT))==0
1ba20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1ba30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
1ba40 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74  trAccumInit(&txt
1ba50 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d  , 0, 0, SQLITE_M
1ba60 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78  AX_LENGTH);.  tx
1ba70 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c  t.db = db;.  sql
1ba80 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1ba90 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32  nd(&txt, " (", 2
1baa0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1bab0 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65  nEq; i++){.    e
1bac0 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
1bad0 28 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61  (&txt, i, aCol[a
1bae0 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d  iColumn[i]].zNam
1baf0 65 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20  e, "=");.  }..  
1bb00 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f  j = i;.  if( pLo
1bb10 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  op->wsFlags&WHER
1bb20 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
1bb30 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d     char *z = (j=
1bb40 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
1bb50 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61   ) ? "rowid" : a
1bb60 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  Col[aiColumn[j]]
1bb70 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c  .zName;.    expl
1bb80 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74  ainAppendTerm(&t
1bb90 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29  xt, i++, z, ">")
1bba0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  ;.  }.  if( pLoo
1bbb0 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  p->wsFlags&WHERE
1bbc0 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
1bbd0 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d    char *z = (j==
1bbe0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
1bbf0 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  ) ? "rowid" : aC
1bc00 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
1bc10 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
1bc20 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
1bc30 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20  t, i, z, "<");. 
1bc40 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
1bc50 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c  ccumAppend(&txt,
1bc60 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75   ")", 1);.  retu
1bc70 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  rn sqlite3StrAcc
1bc80 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a  umFinish(&txt);.
1bc90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1bca0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1bcb0 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74  p unless current
1bcc0 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  ly processing an
1bcd0 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
1bce0 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20  LAN.** command. 
1bcf0 49 66 20 74 68 65 20 71 75 65 72 79 20 62 65 69  If the query bei
1bd00 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61  ng compiled is a
1bd10 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
1bd20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a  PLAN, a single.*
1bd30 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65  * record is adde
1bd40 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
1bd50 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
1bd60 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74  table scan strat
1bd70 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65  egy in .** pLeve
1bd80 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
1bd90 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  d explainOneScan
1bda0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1bdb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1bdc0 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
1bdd0 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
1bde0 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
1bdf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1be00 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f  le list this loo
1be10 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20  p refers to */. 
1be20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1be30 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
1be40 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74   /* Scan to writ
1be50 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63  e OP_Explain opc
1be60 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ode for */.  int
1be70 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1be90 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c  Value for "level
1bea0 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70  " column of outp
1beb0 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  ut */.  int iFro
1bec0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
1bed0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1bee0 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75   for "from" colu
1bef0 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a  mn of output */.
1bf00 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
1bf30 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
1bf40 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20  eBegin() */.){. 
1bf50 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
1bf60 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 73  lain==2 ){.    s
1bf70 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1bf80 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
1bf90 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
1bfa0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62  >iFrom];.    Vdb
1bfb0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1bfc0 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d  Vdbe;      /* VM
1bfd0 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
1bfe0 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
1bff0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1c000 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  db;     /* Datab
1c010 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
1c020 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20    char *zMsg;   
1c030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c040 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74  /* Text to add t
1c050 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a  o EQP output */.
1c060 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50      int iId = pP
1c070 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
1c080 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28    /* Select id (
1c090 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74  left-most output
1c0a0 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20   column) */.    
1c0b0 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20 20  int isSearch;   
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c0d0 20 54 72 75 65 20 66 6f 72 20 61 20 53 45 41 52   True for a SEAR
1c0e0 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43  CH. False for SC
1c0f0 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  AN. */.    Where
1c100 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
1c110 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c120 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72  controlling Wher
1c130 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
1c140 20 20 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20      u32 flags;  
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c160 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20    /* Flags that 
1c170 64 65 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f  describe this lo
1c180 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70  op */..    pLoop
1c190 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
1c1a0 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70  p;.    flags = p
1c1b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
1c1c0 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48     if( (flags&WH
1c1d0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c  ERE_MULTI_OR) ||
1c1e0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
1c1f0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
1c200 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  ) ) return;..   
1c210 20 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61   isSearch = (fla
1c220 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49  gs&(WHERE_BTM_LI
1c230 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
1c240 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20  MIT))!=0.       
1c250 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26       || ((flags&
1c260 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1c270 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70  LE)==0 && (pLoop
1c280 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29  ->u.btree.nEq>0)
1c290 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ).            ||
1c2a0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48   (wctrlFlags&(WH
1c2b0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c  ERE_ORDERBY_MIN|
1c2c0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1c2d0 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d  X));..    zMsg =
1c2e0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1c2f0 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72  db, "%s", isSear
1c300 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41  ch?"SEARCH":"SCA
1c310 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  N");.    if( pIt
1c320 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1c330 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1c340 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1c350 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55 45  zMsg, "%s SUBQUE
1c360 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74  RY %d", zMsg,pIt
1c370 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a  em->iSelectId);.
1c380 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c390 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1c3a0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1c3b0 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c  , "%s TABLE %s",
1c3c0 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e   zMsg, pItem->zN
1c3d0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ame);.    }..   
1c3e0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
1c3f0 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  as ){.      zMsg
1c400 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1c410 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1c420 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70   AS %s", zMsg, p
1c430 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1c440 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
1c450 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b  ags & (WHERE_IPK
1c460 7c 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  |WHERE_VIRTUALTA
1c470 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26  BLE))==0.     &&
1c480 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1c490 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20 29 7b  pIndex!=0.    ){
1c4a0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68  .      char *zWh
1c4b0 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64  ere = explainInd
1c4c0 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f 6f  exRange(db, pLoo
1c4d0 70 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  p, pItem->pTab);
1c4e0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
1c4f0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1c500 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e  , zMsg, "%s USIN
1c510 47 20 25 73 25 73 49 4e 44 45 58 25 73 25 73 25  G %s%sINDEX%s%s%
1c520 73 22 2c 20 7a 4d 73 67 2c 20 0a 20 20 20 20 20  s", zMsg, .     
1c530 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57       ((flags & W
1c540 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
1c550 3f 22 41 55 54 4f 4d 41 54 49 43 20 22 3a 22 22  ?"AUTOMATIC ":""
1c560 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66  ),.          ((f
1c570 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
1c580 5f 4f 4e 4c 59 29 3f 22 43 4f 56 45 52 49 4e 47  _ONLY)?"COVERING
1c590 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20   ":""),.        
1c5a0 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
1c5b0 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22  E_TEMP_INDEX)?""
1c5c0 3a 22 20 22 29 2c 0a 20 20 20 20 20 20 20 20 20  :" "),.         
1c5d0 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
1c5e0 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a  _TEMP_INDEX)?"":
1c5f0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1c600 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a  pIndex->zName),.
1c610 20 20 20 20 20 20 20 20 20 20 7a 57 68 65 72 65            zWhere
1c620 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
1c630 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1c640 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d  , zWhere);.    }
1c650 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
1c660 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 20  & WHERE_IPK)!=0 
1c670 26 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  && (flags & WHER
1c680 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30  E_CONSTRAINT)!=0
1c690 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
1c6a0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1c6b0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55  (db, zMsg, "%s U
1c6c0 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49  SING INTEGER PRI
1c6d0 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29  MARY KEY", zMsg)
1c6e0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ;..      if( fla
1c6f0 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  gs&(WHERE_COLUMN
1c700 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _EQ|WHERE_COLUMN
1c710 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _IN) ){.        
1c720 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c730 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c740 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c   "%s (rowid=?)",
1c750 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
1c760 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57  lse if( (flags&W
1c770 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29  HERE_BOTH_LIMIT)
1c780 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  ==WHERE_BOTH_LIM
1c790 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
1c7a0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1c7b0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1c7c0 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20  %s (rowid>? AND 
1c7d0 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
1c7e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1c7f0 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54  ( flags&WHERE_BT
1c800 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
1c810 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c820 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1c830 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f  sg, "%s (rowid>?
1c840 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
1c850 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1c860 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  &WHERE_TOP_LIMIT
1c870 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
1c880 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1c890 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1c8a0 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73   (rowid<?)", zMs
1c8b0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1c8c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1c8d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1c8e0 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  LE.    else if( 
1c8f0 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  (flags & WHERE_V
1c900 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
1c910 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
1c920 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1c930 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49  db, zMsg, "%s VI
1c940 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
1c950 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a  X %d:%s", zMsg,.
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1c980 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75  idxNum, pLoop->u
1c990 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
1c9a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1c9b0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c9c0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c9d0 20 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20   "%s", zMsg);.  
1c9e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c9f0 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
1ca00 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20  n, iId, iLevel, 
1ca10 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f  iFrom, zMsg, P4_
1ca20 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
1ca30 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
1ca40 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c  xplainOneScan(u,
1ca50 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
1ca60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1ca70 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a  _EXPLAIN */.../*
1ca80 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1ca90 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  e for the start 
1caa0 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68  of the iLevel-th
1cab0 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45   loop in the WHE
1cac0 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70  RE clause.** imp
1cad0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63  lementation desc
1cae0 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e  ribed by pWInfo.
1caf0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
1cb00 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  sk codeOneLoopSt
1cb10 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  art(.  WhereInfo
1cb20 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43   *pWInfo,   /* C
1cb30 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74  omplete informat
1cb40 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48  ion about the WH
1cb50 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1cb60 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
1cb70 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65       /* Which le
1cb80 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61  vel of pWInfo->a
1cb90 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64  [] should be cod
1cba0 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
1cbb0 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20  notReady     /* 
1cbc0 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  Which tables are
1cbd0 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
1cbe0 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
1cbf0 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
1cc00 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1cc10 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
1cc20 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1cc30 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1cc40 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
1cc50 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20  .  int addrNxt; 
1cc60 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
1cc70 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
1cc80 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
1cc90 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
1cca0 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20  int omitTable;  
1ccb0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1ccc0 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
1ccd0 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62   only */.  int b
1cce0 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
1ccf0 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
1cd00 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
1cd10 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
1cd20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1cd30 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65  vel;  /* The whe
1cd40 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63  re level to be c
1cd50 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
1cd60 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f  oop *pLoop;    /
1cd70 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
1cd80 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64  object being cod
1cd90 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
1cda0 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20  use *pWC;    /* 
1cdb0 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66  Decomposition of
1cdc0 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52   the entire WHER
1cdd0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
1cde0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ce00 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   A WHERE clause 
1ce10 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20  term */.  Parse 
1ce20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
1ce30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1ce40 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1ce50 20 20 56 64 62 65 20 2a 76 3b 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 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
1ce80 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e  d stmt under con
1ce90 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  structions */.  
1cea0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1ceb0 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
1cec0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
1ced0 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20  erm being coded 
1cee0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b  */.  int addrBrk
1cef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cf00 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1cf10 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
1cf20 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
1cf30 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20  int addrCont;   
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1cf60 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
1cf70 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  xt cycle */.  in
1cf80 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b  t iRowidReg = 0;
1cf90 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
1cfa0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
1cfb0 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20  is register, if 
1cfc0 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e  not zero */.  in
1cfd0 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  t iReleaseReg = 
1cfe0 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  0;      /* Temp 
1cff0 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65  register to free
1d000 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1d010 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  g */.  Bitmask n
1d020 65 77 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  ewNotReady;     
1d030 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1d040 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
1d050 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1d060 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
1d070 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  dbe;.  pWC = &pW
1d080 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 65  Info->sWC;.  pLe
1d090 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
1d0a0 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f  [iLevel];.  pLoo
1d0b0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
1d0c0 6f 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  op;.  pTabItem =
1d0d0 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
1d0e0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
1d0f0 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70  rom];.  iCur = p
1d100 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
1d110 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 57 49 6e  ;.  bRev = (pWIn
1d120 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65  fo->revMask>>iLe
1d130 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61  vel)&1;.  omitTa
1d140 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73  ble = (pLoop->ws
1d150 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
1d160 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20  X_ONLY)!=0 .    
1d170 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
1d180 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1d190 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
1d1a0 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4e 6f 6f  E)==0;.  VdbeNoo
1d1b0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  pComment((v, "Be
1d1c0 67 69 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25 64  gin Join Loop %d
1d1d0 22 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 0a 20 20  ", iLevel));..  
1d1e0 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
1d1f0 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22   for the "break"
1d200 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20   and "continue" 
1d210 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a  instructions.  *
1d220 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  * for the curren
1d230 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f  t loop.  Jump to
1d240 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61   addrBrk to brea
1d250 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e  k out of a loop.
1d260 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f  .  ** Jump to co
1d270 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61  nt to go immedia
1d280 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74  tely to the next
1d290 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
1d2a0 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a  e.  ** loop..  *
1d2b0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72  *.  ** When ther
1d2c0 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  e is an IN opera
1d2d0 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76  tor, we also hav
1d2e0 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61  e a "addrNxt" la
1d2f0 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65  bel that.  ** me
1d300 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ans to continue 
1d310 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
1d320 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69   value combinati
1d330 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74  on.  When.  ** t
1d340 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f  here are no IN o
1d350 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20  perators in the 
1d360 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
1d370 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
1d380 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  .  ** is the sam
1d390 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a  e as "addrBrk"..
1d3a0 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d    */.  addrBrk =
1d3b0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1d3c0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1d3d0 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
1d3e0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1d3f0 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65  addrCont = pLeve
1d400 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  l->addrCont = sq
1d410 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1d420 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  el(v);..  /* If 
1d430 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
1d440 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
1d450 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
1d460 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20  locate and.  ** 
1d470 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d  initialize a mem
1d480 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65  ory cell that re
1d490 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61  cords if this ta
1d4a0 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a  ble matches any.
1d4b0 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
1d4c0 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68  left table of th
1d4d0 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  e join..  */.  i
1d4e0 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  f( pLevel->iFrom
1d4f0 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
1d500 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  0].jointype & JT
1d510 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
1d520 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1d530 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  in = ++pParse->n
1d540 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
1d550 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d560 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65  _Integer, 0, pLe
1d570 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
1d580 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1d590 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20  ((v, "init LEFT 
1d5a0 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c  JOIN no-match fl
1d5b0 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ag"));.  }..  /*
1d5c0 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   Special case of
1d5d0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73   a FROM clause s
1d5e0 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e  ubquery implemen
1d5f0 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
1d600 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ine */.  if( pTa
1d610 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  bItem->viaCorout
1d620 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
1d630 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
1d640 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
1d650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d660 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1d670 65 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64  er, pTabItem->ad
1d680 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67  drFillSub-1, reg
1d690 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76  Yield);.    pLev
1d6a0 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65  el->p2 =  sqlite
1d6b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
1d6c0 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c  P_Yield, regYiel
1d6d0 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  d);.    VdbeComm
1d6e0 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f  ent((v, "next ro
1d6f0 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20  w of co-routine 
1d700 25 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70  %s", pTabItem->p
1d710 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
1d720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d730 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
1d740 67 59 69 65 6c 64 2b 31 2c 20 61 64 64 72 42 72  gYield+1, addrBr
1d750 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  k);.    pLevel->
1d760 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20  op = OP_Goto;.  
1d770 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
1d780 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1d790 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28  ALTABLE.  if(  (
1d7a0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1d7b0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1d7c0 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f  BLE)!=0 ){.    /
1d7d0 2a 20 43 61 73 65 20 31 3a 20 20 54 68 65 20 74  * Case 1:  The t
1d7e0 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61  able is a virtua
1d7f0 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68  l-table.  Use th
1d800 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e  e VFilter and VN
1d810 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ext.    **      
1d820 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68      to access th
1d830 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  e data..    */. 
1d840 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f     int iReg;   /
1d850 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f  * P3 Value for O
1d860 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20  P_VFilter */.   
1d870 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e   int addrNotFoun
1d880 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  d;.    int nCons
1d890 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e  traint = pLoop->
1d8a0 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c  nLTerm;..    sql
1d8b0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1d8c0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  h(pParse);.    i
1d8d0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1d8e0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1d8f0 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
1d900 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75  ;.    addrNotFou
1d910 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  nd = pLevel->add
1d920 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  rBrk;.    for(j=
1d930 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; j<nConstraint
1d940 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; j++){.      in
1d950 74 20 69 54 61 72 67 65 74 20 3d 20 69 52 65 67  t iTarget = iReg
1d960 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72  +j+2;.      pTer
1d970 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
1d980 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[j];.      if( 
1d990 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69  pTerm==0 ) conti
1d9a0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
1d9b0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1d9c0 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
1d9d0 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54     codeEqualityT
1d9e0 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
1d9f0 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52  m, pLevel, j, bR
1da00 65 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ev, iTarget);.  
1da10 20 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75        addrNotFou
1da20 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  nd = pLevel->add
1da30 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rNxt;.      }els
1da40 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1da50 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1da60 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e, pTerm->pExpr-
1da70 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74  >pRight, iTarget
1da80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1da90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1daa0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1dab0 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76  eger, pLoop->u.v
1dac0 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67  tab.idxNum, iReg
1dad0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1dae0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1daf0 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61  nteger, nConstra
1db00 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20  int, iReg+1);.  
1db10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1db20 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65  Op4(v, OP_VFilte
1db30 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74  r, iCur, addrNot
1db40 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20  Found, iReg,.   
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db60 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
1db70 2e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20  .idxStr,.       
1db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1db90 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  Loop->u.vtab.nee
1dba0 64 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e  dFree ? P4_MPRIN
1dbb0 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b  TF : P4_STATIC);
1dbc0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  .    pLoop->u.vt
1dbd0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
1dbe0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1dbf0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a  nConstraint && j
1dc00 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  <16; j++){.     
1dc10 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76   if( (pLoop->u.v
1dc20 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29  tab.omitMask>>j)
1dc30 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  &1 ){.        di
1dc40 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1dc50 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  , pLoop->aLTerm[
1dc60 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j]);.      }.   
1dc70 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f   }.    pLevel->o
1dc80 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20  p = OP_VNext;.  
1dc90 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
1dca0 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Cur;.    pLevel-
1dcb0 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
1dcc0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1dcd0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1dce0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
1dcf0 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73  rse, iReg, nCons
1dd00 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73  traint+2);.    s
1dd10 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1dd20 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
1dd30 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
1dd40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1dd50 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
1dd60 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
1dd70 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1dd80 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70  !=0.   && (pLoop
1dd90 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
1dda0 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45  RE_COLUMN_IN|WHE
1ddb0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d  RE_COLUMN_EQ))!=
1ddc0 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  0.  ){.    /* Ca
1ddd0 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69  se 2:  We can di
1dde0 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65  rectly reference
1ddf0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73   a single row us
1de00 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20  ing an.    **   
1de10 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
1de20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
1de30 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
1de40 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20  ld.  Or.    **  
1de50 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
1de60 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
1de70 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
1de80 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
1de90 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  **          cons
1dea0 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  truct..    */.  
1deb0 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
1dec0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20  >u.btree.nEq==1 
1ded0 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52  );.    iReleaseR
1dee0 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
1def0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
1df00 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1df10 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20  p->aLTerm[0];.  
1df20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
1df30 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1df40 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d  ( pTerm->pExpr!=
1df50 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1df60 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
1df70 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1df80 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1df90 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
1dfa0 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
1dfb0 31 36 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f 77  1662 */.    iRow
1dfc0 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61  idReg = codeEqua
1dfd0 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
1dfe0 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
1dff0 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73  0, bRev, iReleas
1e000 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e  eReg);.    addrN
1e010 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  xt = pLevel->add
1e020 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rNxt;.    sqlite
1e030 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e040 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f  P_MustBeInt, iRo
1e050 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29  widReg, addrNxt)
1e060 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1e070 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
1e080 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61  tExists, iCur, a
1e090 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65  ddrNxt, iRowidRe
1e0a0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
1e0b0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1e0c0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
1e0d0 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20  RowidReg, 1);.  
1e0e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1e0f0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1e100 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1e110 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Reg);.    VdbeCo
1e120 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
1e130 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1e140 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65   = OP_Noop;.  }e
1e150 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e  lse if( (pLoop->
1e160 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1e170 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IPK)!=0.        
1e180 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
1e190 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
1e1a0 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29  MN_RANGE)!=0.  )
1e1b0 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a  {.    /* Case 3:
1e1c0 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65    We have an ine
1e1d0 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
1e1e0 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
1e1f0 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20  OWID field..    
1e200 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f  */.    int testO
1e210 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
1e220 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
1e230 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20  int memEndValue 
1e240 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65  = 0;.    WhereTe
1e250 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e  rm *pStart, *pEn
1e260 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  d;..    assert( 
1e270 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
1e280 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70      j = 0;.    p
1e290 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30  Start = pEnd = 0
1e2a0 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
1e2b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1e2c0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74  _BTM_LIMIT ) pSt
1e2d0 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  art = pLoop->aLT
1e2e0 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66  erm[j++];.    if
1e2f0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1e300 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
1e310 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f  IT ) pEnd = pLoo
1e320 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a  p->aLTerm[j++];.
1e330 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
1e340 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53        pTerm = pS
1e350 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61  tart;.      pSta
1e360 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  rt = pEnd;.     
1e370 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20   pEnd = pTerm;. 
1e380 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74     }.    if( pSt
1e390 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
1e3a0 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
1e3b0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
1e3c0 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65  sion that define
1e3d0 73 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  s the start boun
1e3e0 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  d */.      int r
1e3f0 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20  1, rTemp;       
1e400 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f   /* Registers fo
1e410 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74  r holding the st
1e420 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a  art boundary */.
1e430 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
1e440 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74  llowing constant
1e450 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65   maps TK_xx code
1e460 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e  s into correspon
1e470 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73  ding .      ** s
1e480 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74  eek opcodes.  It
1e490 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61   depends on a pa
1e4a0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e  rticular orderin
1e4b0 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20  g of TK_xx.     
1e4c0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
1e4d0 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b  u8 aMoveOp[] = {
1e4e0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1e4f0 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GT */  OP_Seek
1e500 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Gt,.           /
1e510 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53  * TK_LE */  OP_S
1e520 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20  eekLe,.         
1e530 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f    /* TK_LT */  O
1e540 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20  P_SeekLt,.      
1e550 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f       /* TK_GE */
1e560 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20    OP_SeekGe.    
1e570 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72    };.      asser
1e580 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b  t( TK_LE==TK_GT+
1e590 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b  1 );      /* Mak
1e5a0 65 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72  e sure the order
1e5b0 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ing.. */.      a
1e5c0 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
1e5d0 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+2 );      /*
1e5e0 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f    ... of the TK_
1e5f0 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a  xx values... */.
1e600 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e610 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20  _GE==TK_GT+3 ); 
1e620 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20       /*  ... is 
1e630 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20  correcct. */..  
1e640 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
1e650 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
1e660 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
1e670 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
1e680 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 70 58  1662 */.      pX
1e690 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
1e6a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e6b0 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pX!=0 );.      a
1e6c0 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c  ssert( pStart->l
1e6d0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
1e6e0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1e6f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e700 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  p(pParse, pX->pR
1e710 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20  ight, &rTemp);. 
1e720 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e730 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f  AddOp3(v, aMoveO
1e740 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c  p[pX->op-TK_GT],
1e750 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20   iCur, addrBrk, 
1e760 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
1e770 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
1e780 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e790 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1e7a0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1e7b0 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  r1, 1);.      sq
1e7c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1e7d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d  Reg(pParse, rTem
1e7e0 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c  p);.      disabl
1e7f0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53  eTerm(pLevel, pS
1e800 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tart);.    }else
1e810 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1e820 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
1e830 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
1e840 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61  _Rewind, iCur, a
1e850 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  ddrBrk);.    }. 
1e860 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
1e870 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
1e880 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
1e890 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1e8a0 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1e8b0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
1e8c0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
1e8d0 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ur );.      test
1e8e0 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c  case( pEnd->wtFl
1e8f0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1e900 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
1e910 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
1e920 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20      memEndValue 
1e930 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1e940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e950 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1e960 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45  pX->pRight, memE
1e970 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  ndValue);.      
1e980 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  if( pX->op==TK_L
1e990 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  T || pX->op==TK_
1e9a0 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  GT ){.        te
1e9b0 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
1e9c0 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20  _Le : OP_Ge;.   
1e9d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e9e0 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
1e9f0 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
1ea00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
1ea10 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1ea20 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a  l, pEnd);.    }.
1ea30 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
1ea40 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1ea50 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65  dr(v);.    pLeve
1ea60 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
1ea70 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
1ea80 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1ea90 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
1eaa0 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
1eab0 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 3d  .    if( pStart=
1eac0 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 20 29 7b  =0 && pEnd==0 ){
1ead0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
1eae0 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
1eaf0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
1eb00 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
1eb10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1eb20 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
1eb30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 73     }.    if( tes
1eb40 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
1eb50 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20        iRowidReg 
1eb60 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  = iReleaseReg = 
1eb70 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1eb80 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
1eb90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1eba0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
1ebb0 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
1ebc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1ebd0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1ebe0 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
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 41 64 64    sqlite3VdbeAdd
1ec10 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d  Op3(v, testOp, m
1ec20 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72  emEndValue, addr
1ec30 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Brk, iRowidReg);
1ec40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ec50 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
1ec60 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
1ec70 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
1ec80 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NULL);.    }.  }
1ec90 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  else if( pLoop->
1eca0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1ecb0 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 2f  INDEXED ){.    /
1ecc0 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61 6e  * Case 4: A scan
1ecd0 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e   using an index.
1ece0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1ecf0 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45         The WHERE
1ed00 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74   clause may cont
1ed10 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ain zero or more
1ed20 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a   equality .    *
1ed30 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20  *         terms 
1ed40 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70  ("==" or "IN" op
1ed50 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65  erators) that re
1ed60 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20  fer to the N.   
1ed70 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74   **         left
1ed80 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  -most columns of
1ed90 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d   the index. It m
1eda0 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a  ay also contain.
1edb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
1edc0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1edd0 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20  aints (>, <, >= 
1ede0 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e  or <=) on the in
1edf0 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dexed.    **    
1ee00 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74       column that
1ee10 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1ee20 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c  lows the N equal
1ee30 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20  ities. Only .   
1ee40 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
1ee50 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
1ee60 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
1ee70 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
1ee80 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20  t must.    **   
1ee90 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d        use the "=
1eea0 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72  =" and "IN" oper
1eeb0 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ators. For examp
1eec0 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20  le, if the .    
1eed0 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78  **         index
1eee0 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20   is on (x,y,z), 
1eef0 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
1ef00 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61  ng clauses are a
1ef10 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ll .    **      
1ef20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20     optimized:.  
1ef30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1ef40 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a         x=5.    *
1ef50 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1ef60 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a   AND y=10.    **
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1ef80 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1ef90 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1efa0 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a  ND y>5 AND y<10.
1efb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1efc0 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e    x=5 AND y=5 AN
1efd0 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20  D z<=10.    **. 
1efe0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
1eff0 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74  e z<10 term of t
1f000 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e  he following can
1f010 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c  not be used, onl
1f020 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  y.    **        
1f030 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20   the x=5 term:. 
1f040 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f050 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1f060 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  z<10.    **.    
1f070 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79  **         N may
1f080 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72   be zero if ther
1f090 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79  e are inequality
1f0a0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
1f0b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20    **         If 
1f0c0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65  there are no ine
1f0d0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1f0e0 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61  nts, then N is a
1f0f0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1f100 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20   least one..    
1f110 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1f120 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61    This case is a
1f130 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68  lso used when th
1f140 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
1f150 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20   clause.    **  
1f160 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
1f170 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20  ts but an index 
1f180 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77  is selected anyw
1f190 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20  ay, in order.   
1f1a0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66   **         to f
1f1b0 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20  orce the output 
1f1c0 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d  order to conform
1f1d0 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e   to an ORDER BY.
1f1e0 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74  .    */  .    st
1f1f0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
1f200 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  tartOp[] = {.   
1f210 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20     0,.      0,. 
1f220 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20       OP_Rewind, 
1f230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
1f240 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
1f250 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
1f260 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  &  !bRev) */.   
1f270 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20     OP_Last,     
1f280 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21          /* 3: (!
1f290 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1f2a0 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
1f2b0 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
1f2c0 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20   OP_SeekGt,     
1f2d0 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61        /* 4: (sta
1f2e0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1f2f0 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21  && !startEq && !
1f300 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1f310 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20  P_SeekLt,       
1f320 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74      /* 5: (start
1f330 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1f340 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52   !startEq &&  bR
1f350 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1f360 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20  SeekGe,         
1f370 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63    /* 6: (start_c
1f380 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
1f390 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76  startEq && !bRev
1f3a0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1f3b0 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20 20  ekLe            
1f3c0 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 7: (start_con
1f3d0 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
1f3e0 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
1f3f0 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74  */.    };.    st
1f400 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45  atic const u8 aE
1f410 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndOp[] = {.     
1f420 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20   OP_Noop,       
1f430 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e        /* 0: (!en
1f440 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a  d_constraints) *
1f450 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45  /.      OP_IdxGE
1f460 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1f470 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  1: (end_constrai
1f480 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f  nts && !bRev) */
1f490 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20  .      OP_IdxLT 
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
1f4b0 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1f4c0 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20  ts && bRev) */. 
1f4d0 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45     };.    int nE
1f4e0 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
1f4f0 65 65 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62  ee.nEq;  /* Numb
1f500 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74  er of == or IN t
1f510 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  erms */.    int 
1f520 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20  isMinQuery = 0; 
1f530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1f540 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   this is an opti
1f550 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e  mized SELECT min
1f560 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  (x).. */.    int
1f570 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
1f580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73            /* Bas
1f590 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
1f5a0 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61  ng constraint va
1f5b0 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lues */.    int 
1f5c0 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
1f5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
1f5e0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20   register */.   
1f5f0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
1f600 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a  geStart = 0;  /*
1f610 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
1f620 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
1f630 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65  start */.    Whe
1f640 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e  reTerm *pRangeEn
1f650 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65  d = 0;    /* Ine
1f660 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1f670 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20  nt at range end 
1f680 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
1f690 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
1f6a0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1f6b0 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73 20  ange start uses 
1f6c0 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
1f6d0 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20      int endEq;  
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6f0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
1f700 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e  e end uses ==, >
1f710 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
1f720 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  nt start_constra
1f730 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53  ints;       /* S
1f740 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73  tart of range is
1f750 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a   constrained */.
1f760 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
1f770 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
1f780 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
1f790 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a  nstraint terms *
1f7a0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
1f7b0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1f7c0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
1f7d0 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
1f7e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
1f7f0 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1f800 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
1f810 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1f820 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
1f830 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20   nExtraReg = 0; 
1f840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f850 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
1f860 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f  isters needed */
1f870 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  .    int op;    
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f890 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
1f8a0 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63   opcode */.    c
1f8b0 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20  har *zStartAff; 
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1f8d0 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72  ffinity for star
1f8e0 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74  t of range const
1f8f0 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61  raint */.    cha
1f900 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20 20  r *zEndAff;     
1f910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
1f920 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66  inity for end of
1f930 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1f940 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d  t */..    pIdx =
1f950 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1f960 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64 78  pIndex;.    iIdx
1f970 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
1f980 64 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20 28  dxCur;.    k = (
1f990 6e 45 71 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  nEq==pIdx->nColu
1f9a0 6d 6e 20 3f 20 2d 31 20 3a 20 70 49 64 78 2d 3e  mn ? -1 : pIdx->
1f9b0 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3b 0a  aiColumn[nEq]);.
1f9c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1f9d0 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61  loop satisfies a
1f9e0 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72   sort order (pOr
1f9f0 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74  derBy) request t
1fa00 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20  hat .    ** was 
1fa10 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1fa20 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
1fa30 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
1fa40 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
1fa50 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74  ** query, then t
1fa60 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
1fa70 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f  nly allow the lo
1fa80 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20  op to run for.  
1fa90 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74    ** a single it
1faa0 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  eration. This me
1fab0 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72  ans that the fir
1fac0 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a  st row returned.
1fad0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f      ** should no
1fae0 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61  t have a NULL va
1faf0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78  lue stored in 'x
1fb00 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27  '. If column 'x'
1fb10 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66   is.    ** the f
1fb20 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74  irst one after t
1fb30 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20  he nEq equality 
1fb40 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
1fb50 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
1fb60 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73   this requires s
1fb70 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ome special hand
1fb80 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ling..    */.   
1fb90 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
1fba0 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
1fbb0 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20  RDERBY_MIN)!=0. 
1fbc0 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
1fbd0 62 4f 42 53 61 74 21 3d 30 29 0a 20 20 20 20 20  bOBSat!=0).     
1fbe0 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  && (pIdx->nColum
1fbf0 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  n>nEq).    ){.  
1fc00 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
1fc10 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
1fc20 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  1 ); */.      /*
1fc30 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1fc40 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69  y->a[0].pExpr->i
1fc50 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
1fc60 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a  Column[nEq] ); *
1fc70 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65  /.      isMinQue
1fc80 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45  ry = 1;.      nE
1fc90 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
1fca0 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
1fcb0 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
1fcc0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1fcd0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
1fce0 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  d end .    ** of
1fcf0 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
1fd00 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b   */.    j = nEq;
1fd10 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1fd20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1fd30 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1fd40 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d     pRangeStart =
1fd50 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1fd60 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  ++];.      nExtr
1fd70 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1fd80 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1fd90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
1fda0 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
1fdb0 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c    pRangeEnd = pL
1fdc0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1fdd0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1fde0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
1fdf0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1fe00 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
1fe10 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
1fe20 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
1fe30 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74  IN.    ** and st
1fe40 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ore the values o
1fe50 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e  f those terms in
1fe60 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
1fe70 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
1fe80 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73  arting at regBas
1fe90 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  e..    */.    re
1fea0 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45  gBase = codeAllE
1feb0 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
1fec0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4c        pParse, pL
1fed0 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65  evel, pWC, notRe
1fee0 61 64 79 2c 20 62 52 65 76 2c 20 6e 45 78 74 72  ady, bRev, nExtr
1fef0 61 52 65 67 2c 20 26 7a 53 74 61 72 74 41 66 66  aReg, &zStartAff
1ff00 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e 64  .    );.    zEnd
1ff10 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
1ff20 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
1ff30 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
1ff40 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
1ff50 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20  el->addrNxt;..  
1ff60 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1ff70 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f  oing a reverse o
1ff80 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20  rder scan on an 
1ff90 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  ascending index,
1ffa0 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72   or.    ** a for
1ffb0 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20  ward order scan 
1ffc0 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
1ffd0 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e  index, interchan
1ffe0 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  ge the .    ** s
1fff0 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72  tart and end ter
20000 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20  ms (pRangeStart 
20010 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a  and pRangeEnd)..
20020 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
20030 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  nEq<pIdx->nColum
20040 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78  n && bRev==(pIdx
20050 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
20060 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  ]==SQLITE_SO_ASC
20070 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76  )).     || (bRev
20080 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   && pIdx->nColum
20090 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  n==nEq).    ){. 
200a0 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54       SWAP(WhereT
200b0 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64  erm *, pRangeEnd
200c0 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
200d0 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63      }..    testc
200e0 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
200f0 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d   && pRangeStart-
20100 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
20110 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LE );.    testca
20120 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
20130 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  && pRangeStart->
20140 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
20150 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
20160 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
20170 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
20180 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a  ator & WO_LE );.
20190 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
201a0 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67  angeEnd && pRang
201b0 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
201c0 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73  & WO_GE );.    s
201d0 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65  tartEq = !pRange
201e0 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53  Start || pRangeS
201f0 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
20200 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
20210 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21  .    endEq =   !
20220 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61  pRangeEnd || pRa
20230 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
20240 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
20250 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  );.    start_con
20260 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67  straints = pRang
20270 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b  eStart || nEq>0;
20280 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
20290 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74  e index cursor t
202a0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
202b0 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
202c0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
202d0 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
202e0 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  geStart ){.     
202f0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
20300 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78  pRangeStart->pEx
20310 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
20320 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
20330 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
20340 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
20350 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
20360 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
20370 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
20380 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20390 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
203a0 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c  lJump(v, pRight,
203b0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
203c0 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  drNxt);.      }.
203d0 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74        if( zStart
203e0 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
203f0 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
20400 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
20410 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
20420 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
20430 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
20440 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
20450 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
20460 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
20470 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
20480 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
20490 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
204a0 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
204b0 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
204c0 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
204d0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
204e0 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
204f0 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
20500 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
20510 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
20520 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
20530 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
20540 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
20550 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
20560 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
20570 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
20580 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
20590 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
205a0 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
205b0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
205c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
205d0 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74   pRangeStart->wt
205e0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
205f0 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
20600 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
20610 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
20620 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20  MinQuery ){.    
20630 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20640 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
20650 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  0, regBase+nEq);
20660 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
20670 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72  nt++;.      star
20680 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  tEq = 0;.      s
20690 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
206a0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
206b0 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
206c0 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
206d0 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20  e, nConstraint, 
206e0 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
206f0 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73  op = aStartOp[(s
20700 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
20710 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c  <<2) + (startEq<
20720 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20  <1) + bRev];.   
20730 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29   assert( op!=0 )
20740 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20750 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b  op==OP_Rewind );
20760 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
20770 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20  p==OP_Last );.  
20780 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
20790 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20  OP_SeekGt );.   
207a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
207b0 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20  P_SeekGe );.    
207c0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
207d0 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74  _SeekLe );.    t
207e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
207f0 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71  SeekLt );.    sq
20800 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
20810 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
20820 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
20830 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
20840 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  );..    /* Load 
20850 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
20860 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
20870 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65  straint at the e
20880 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
20890 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e   range (if any).
208a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e  .    */.    nCon
208b0 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20  straint = nEq;. 
208c0 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64     if( pRangeEnd
208d0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
208e0 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45  pRight = pRangeE
208f0 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  nd->pExpr->pRigh
20900 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
20910 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
20920 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b  pParse, regBase+
20930 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  nEq, 1);.      s
20940 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
20950 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
20960 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
20970 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e     if( (pRangeEn
20980 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
20990 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
209a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
209b0 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
209c0 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  (v, pRight, regB
209d0 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
209e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
209f0 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a   if( zEndAff ){.
20a00 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
20a10 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
20a20 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41  ty(pRight, zEndA
20a30 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
20a40 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
20a50 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
20a60 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
20a70 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
20a80 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
20a90 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
20aa0 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
20ab0 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
20ac0 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
20ad0 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
20ae0 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
20af0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
20b00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
20b10 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  EndAff[nEq] = SQ
20b20 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
20b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20b40 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
20b50 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
20b60 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45  hange(pRight, zE
20b70 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  ndAff[nEq]) ){. 
20b80 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66           zEndAff
20b90 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
20ba0 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
20bb0 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20   }.      }  .   
20bc0 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
20bd0 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
20be0 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e  Base, nEq+1, zEn
20bf0 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f  dAff);.      nCo
20c00 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
20c10 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
20c20 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
20c30 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
20c40 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
20c50 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  11662 */.    }. 
20c60 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
20c70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74  (pParse->db, zSt
20c80 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c  artAff);.    sql
20c90 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
20ca0 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b  e->db, zEndAff);
20cb0 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  ..    /* Top of 
20cc0 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f  the loop body */
20cd0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
20ce0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
20cf0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
20d00 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
20d10 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69  e index cursor i
20d20 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
20d30 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
20d40 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b      op = aEndOp[
20d50 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45  (pRangeEnd || nE
20d60 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d  q) * (1 + bRev)]
20d70 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20d80 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20  op==OP_Noop );. 
20d90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20da0 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
20db0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
20dc0 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69  P_IdxLT );.    i
20dd0 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  f( op!=OP_Noop )
20de0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
20df0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
20e00 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
20e10 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
20e20 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
20e30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
20e40 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21  angeP5(v, endEq!
20e50 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20  =bRev ?1:0);.   
20e60 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
20e70 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69  ere are inequali
20e80 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
20e90 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
20ea0 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  alue.    ** of t
20eb0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
20ec0 74 68 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c  that the inequal
20ed0 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73  ity contrains is
20ee0 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a   not NULL..    *
20ef0 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70  * If it is, jump
20f00 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
20f10 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
20f20 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
20f30 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
20f40 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
20f50 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 6f     testcase( pLo
20f60 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
20f70 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b  ERE_BTM_LIMIT );
20f80 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
20f90 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
20fa0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
20fb0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  );.    if( (pLoo
20fc0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
20fd0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48  ERE_BTM_LIMIT|WH
20fe0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21  ERE_TOP_LIMIT))!
20ff0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
21000 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
21010 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78   OP_Column, iIdx
21020 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20  Cur, nEq, r1);. 
21030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21040 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
21050 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e  ull, r1, addrCon
21060 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
21070 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
21080 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
21090 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
210a0 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20  e table cursor, 
210b0 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
210c0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
210d0 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61  Level, pRangeSta
210e0 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65  rt);.    disable
210f0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
21100 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28  ngeEnd);.    if(
21110 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20   !omitTable ){. 
21120 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d       iRowidReg =
21130 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73   iReleaseReg = s
21140 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
21150 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
21160 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21170 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64  2(v, OP_IdxRowid
21180 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69  , iIdxCur, iRowi
21190 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
211a0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
211b0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
211c0 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
211d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
211e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
211f0 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  eek, iCur, iRowi
21200 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72  dReg);  /* Defer
21210 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20  red seek */.    
21220 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  }..    /* Record
21230 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
21240 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61   used to termina
21250 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73  te the loop. Dis
21260 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45  able .    ** WHE
21270 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
21280 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62  made redundant b
21290 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67  y the index rang
212a0 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  e scan..    */. 
212b0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
212c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
212d0 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 4c  EROW ){.      pL
212e0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
212f0 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  op;.    }else if
21300 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
21310 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
21320 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Prev;.    }else{
21330 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
21340 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  p = OP_Next;.   
21350 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70   }.    pLevel->p
21360 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  1 = iIdxCur;.   
21370 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
21380 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e  lags & WHERE_CON
21390 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20  STRAINT)==0 ){. 
213a0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
213b0 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
213c0 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
213d0 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  P;.    }else{.  
213e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
213f0 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
21400 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
21410 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21420 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
21430 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
21440 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
21450 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20  TI_OR ){.    /* 
21460 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20  Case 5:  Two or 
21470 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20  more separately 
21480 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
21490 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20  nnected by OR.  
214a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
214b0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
214c0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
214d0 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20  E t1(a,b,c,d);. 
214e0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
214f0 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29  NDEX i1 ON t1(a)
21500 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
21510 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31  E INDEX i2 ON t1
21520 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (b);.    **   CR
21530 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
21540 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20   t1(c);.    **. 
21550 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a     **   SELECT *
21560 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
21570 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d  =5 OR b=7 OR (c=
21580 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20  11 AND d=13).   
21590 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68   **.    ** In th
215a0 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65  e example, there
215b0 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78   are three index
215c0 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
215d0 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a  ed by OR..    **
215e0 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
215f0 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  loop looks like 
21600 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
21610 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
21620 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
21630 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
21640 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
21650 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  g 1.    **.    *
21660 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68  * Then, for each
21670 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74   indexed term, t
21680 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68  he following. Th
21690 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
216a0 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74     ** RowSetTest
216b0 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74   are such that t
216c0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
216d0 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69  current row is i
216e0 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69  nserted.    ** i
216f0 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20  nto the RowSet. 
21700 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
21710 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f   present, contro
21720 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20  l skips the.    
21730 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20  ** Gosub opcode 
21740 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67  and jumps straig
21750 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ht to the code g
21760 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72  enerated by Wher
21770 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  eEnd()..    **. 
21780 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
21790 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c  ite3WhereBegin(<
217a0 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20  term>).    **   
217b0 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73         RowSetTes
217c0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
217d0 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69     # Insert rowi
217e0 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20  d into rowset.  
217f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
21800 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20  sub      2 A.   
21810 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
21820 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20  e3WhereEnd().   
21830 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f   **.    ** Follo
21840 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20  wing the above, 
21850 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74  code to terminat
21860 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65  e the loop. Labe
21870 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a  l A, the target.
21880 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f      ** of the Go
21890 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73  sub above, jumps
218a0 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
218b0 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20  ion right after 
218c0 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a  the Goto..    **
218d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
218e0 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
21900 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
21910 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20  n reg 1.    **  
21920 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20          Goto    
21930 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20     B            
21940 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69      # The loop i
21950 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20  s finished..    
21960 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
21970 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20  A: <loop body>  
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
21990 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68   Return data, wh
219a0 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  atever..    **. 
219b0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
219c0 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20  eturn     2     
219d0 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d             # Jum
219e0 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f  p back to the Go
219f0 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sub.    **.    *
21a00 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65  *       B: <afte
21a10 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20  r the loop>.    
21a20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68  **.    */.    Wh
21a30 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
21a40 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63  ;    /* The OR-c
21a50 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74  lause broken out
21a60 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
21a70 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  /.    SrcList *p
21a80 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  OrTab;       /* 
21a90 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
21aa0 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73  list or OR-claus
21ab0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
21ac0 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20      Index *pCov 
21ad0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
21ae0 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f   /* Potential co
21af0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72  vering index (or
21b00 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e   NULL) */.    in
21b10 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72  t iCovCur = pPar
21b20 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20  se->nTab++;  /* 
21b30 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  Cursor used for 
21b40 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20  index scans (if 
21b50 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  any) */..    int
21b60 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70   regReturn = ++p
21b70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
21b80 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
21b90 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f  er used with OP_
21ba0 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74  Gosub */.    int
21bb0 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20   regRowset = 0; 
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bd0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
21be0 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62  er for RowSet ob
21bf0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
21c00 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  regRowid = 0;   
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
21c30 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20  r holding rowid 
21c40 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70  */.    int iLoop
21c50 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
21c60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
21c70 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f   /* Start of loo
21c80 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e  p body */.    in
21c90 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20  t iRetInit;     
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cb0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
21cc0 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20  ss of regReturn 
21cd0 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  init */.    int 
21ce0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
21cf0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
21d00 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74  * Some terms not
21d10 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74   completely test
21d20 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  ed */.    int ii
21d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21d50 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
21d60 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78      Expr *pAndEx
21d70 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pr = 0;         
21d80 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e         /* An "..
21d90 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72   AND (...)" expr
21da0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20  ession */.   .  
21db0 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
21dc0 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  >aLTerm[0];.    
21dd0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
21de0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21df0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
21e00 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20   & WO_OR );.    
21e10 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
21e20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
21e30 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20  RINFO)!=0 );.   
21e40 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d   pOrWc = &pTerm-
21e50 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
21e60 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
21e70 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20   OP_Return;.    
21e80 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67  pLevel->p1 = reg
21e90 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Return;..    /* 
21ea0 53 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63  Set up a new Src
21eb0 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63  List in pOrTab c
21ec0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
21ed0 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  ble being scanne
21ee0 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
21ef0 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30   loop in the a[0
21f00 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e  ] slot and all n
21f10 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69  otReady tables i
21f20 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a  n a[1..] slots..
21f30 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f      ** This beco
21f40 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  mes the SrcList 
21f50 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65  in the recursive
21f60 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
21f70 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20  WhereBegin()..  
21f80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49    */.    if( pWI
21f90 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b  nfo->nLevel>1 ){
21fa0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52  .      int nNotR
21fb0 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
21fc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
21fd0 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20  ber of notReady 
21fe0 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
21ff0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22000 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20  tem *origSrc;   
22010 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69    /* Original li
22020 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
22030 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20        nNotReady 
22040 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
22050 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20   - iLevel - 1;. 
22060 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71       pOrTab = sq
22070 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52  lite3StackAllocR
22080 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  aw(pParse->db,. 
22090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220a0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
220b0 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74  f(*pOrTab)+ nNot
220c0 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72  Ready*sizeof(pOr
220d0 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  Tab->a[0]));.   
220e0 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30     if( pOrTab==0
220f0 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61   ) return notRea
22100 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  dy;.      pOrTab
22110 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36 29  ->nAlloc = (i16)
22120 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b  (nNotReady + 1);
22130 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e  .      pOrTab->n
22140 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41  Src = pOrTab->nA
22150 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63  lloc;.      memc
22160 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54  py(pOrTab->a, pT
22170 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a  abItem, sizeof(*
22180 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20  pTabItem));.    
22190 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e    origSrc = pWIn
221a0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b  fo->pTabList->a;
221b0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20  .      for(k=1; 
221c0 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b  k<=nNotReady; k+
221d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  +){.        memc
221e0 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  py(&pOrTab->a[k]
221f0 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65  , &origSrc[pLeve
22200 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a  l[k].iFrom], siz
22210 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  eof(pOrTab->a[k]
22220 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
22230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72  }else{.      pOr
22240 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Tab = pWInfo->pT
22250 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20  abList;.    }.. 
22260 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
22270 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69   the rowset regi
22280 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ster to contain 
22290 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c  NULL. An SQL NUL
222a0 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75  L is .    ** equ
222b0 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d  ivalent to an em
222c0 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20  pty rowset..    
222d0 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69  **.    ** Also i
222e0 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74  nitialize regRet
222f0 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  urn to contain t
22300 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
22310 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20  e instruction . 
22320 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
22330 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
22340 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65  OP_Return at the
22350 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
22360 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  oop. This.    **
22370 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
22380 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45  a few obscure LE
22390 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68  FT JOIN cases wh
223a0 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70  ere control jump
223b0 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68  s.    ** over th
223c0 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
223d0 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  p into the body 
223e0 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63  of it. In this c
223f0 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ase the .    ** 
22400 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65  correct response
22410 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d   for the end-of-
22420 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f  loop code (the O
22430 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20  P_Return) is to 
22440 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72  .    ** fall thr
22450 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
22460 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75   instruction, ju
22470 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74  st as an OP_Next
22480 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20   does if.    ** 
22490 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69  called on an uni
224a0 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f  nitialized curso
224b0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
224c0 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
224d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
224e0 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
224f0 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 73  ){.      regRows
22500 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
22510 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f  Mem;.      regRo
22520 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
22530 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
22540 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22550 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
22560 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20  Rowset);.    }. 
22570 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71     iRetInit = sq
22580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22590 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
225a0 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
225b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 72 69     /* If the ori
225c0 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ginal WHERE clau
225d0 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65 20 66  se is z of the f
225e0 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78 32 20  orm:  (x1 OR x2 
225f0 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20  OR ...) AND y.  
22600 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65 76    ** Then for ev
22610 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65 76 61  ery term xN, eva
22620 6c 75 61 74 65 20 61 73 20 74 68 65 20 73 75 62  luate as the sub
22630 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41  expression: xN A
22640 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74  ND z.    ** That
22650 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e 20 79   way, terms in y
22660 20 74 68 61 74 20 61 72 65 20 66 61 63 74 6f 72   that are factor
22670 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69 73 6a  ed into the disj
22680 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  unction will.   
22690 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20 75 70   ** be picked up
226a0 20 62 79 20 74 68 65 20 72 65 63 75 72 73 69 76   by the recursiv
226b0 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  e calls to sqlit
226c0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 62  e3WhereBegin() b
226d0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  elow..    **.   
226e0 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65 61   ** Actually, ea
226f0 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ch subexpression
22700 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f   is converted to
22710 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68 65 72   "xN AND w" wher
22720 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20 74 68  e w is.    ** th
22730 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22 20  e "interesting" 
22740 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72  terms of z - ter
22750 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f 74 20  ms that did not 
22760 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
22770 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53  .    ** ON or US
22780 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
22790 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74  LEFT JOIN, and t
227a0 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 75 73  erms that are us
227b0 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  able as .    ** 
227c0 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
227d0 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69      ** This opti
227e0 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e  mization also on
227f0 6c 79 20 61 70 70 6c 69 65 73 20 69 66 20 74 68  ly applies if th
22800 65 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e  e (x1 OR x2 OR .
22810 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20  ..) term.    ** 
22820 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
22830 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
22840 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
22850 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 69 63  ..    ** See tic
22860 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  ket http://www.s
22870 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
22880 66 6f 2f 66 32 33 36 39 33 30 34 65 34 0a 20 20  fo/f2369304e4.  
22890 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 43    */.    if( pWC
228a0 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20  ->nTerm>1 ){.   
228b0 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20     int iTerm;.  
228c0 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b      for(iTerm=0;
228d0 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72   iTerm<pWC->nTer
228e0 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  m; iTerm++){.   
228f0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
22900 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d   = pWC->a[iTerm]
22910 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
22920 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
22930 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
22940 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e  omJoin) ) contin
22950 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
22960 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74  pWC->a[iTerm].wt
22970 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
22980 52 54 55 41 4c 7c 54 45 52 4d 5f 4f 52 49 4e 46  RTUAL|TERM_ORINF
22990 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  O) ) continue;. 
229a0 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d         if( (pWC-
229b0 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61  >a[iTerm].eOpera
229c0 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30  tor & WO_ALL)==0
229d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
229e0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
229f0 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
22a00 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30  se->db, pExpr, 0
22a10 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45  );.        pAndE
22a20 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
22a30 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
22a40 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72   pAndExpr, pExpr
22a50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22a60 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
22a70 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
22a80 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
22a90 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c  (pParse, TK_AND,
22aa0 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29   0, pAndExpr, 0)
22ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22ac0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
22ad0 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20  i<pOrWc->nTerm; 
22ae0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65  ii++){.      Whe
22af0 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20  reTerm *pOrTerm 
22b00 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b  = &pOrWc->a[ii];
22b10 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
22b20 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
22b30 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d  iCur || (pOrTerm
22b40 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
22b50 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
22b60 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70      WhereInfo *p
22b70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  SubWInfo;       
22b80 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73     /* Info for s
22b90 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63  ingle OR-term sc
22ba0 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  an */.        Ex
22bb0 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f  pr *pOrExpr = pO
22bc0 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  rTerm->pExpr;.  
22bd0 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
22be0 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72  pr && !ExprHasPr
22bf0 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20  operty(pOrExpr, 
22c00 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
22c10 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78            pAndEx
22c20 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45  pr->pLeft = pOrE
22c30 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  xpr;.          p
22c40 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70  OrExpr = pAndExp
22c50 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
22c60 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
22c70 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
22c80 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
22c90 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
22ca0 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f         pSubWInfo
22cb0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
22cc0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72  egin(pParse, pOr
22cd0 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c  Tab, pOrExpr, 0,
22ce0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
22d00 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
22d10 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  E | WHERE_AND_ON
22d20 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  LY |.           
22d30 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
22d40 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c  RE_FORCE_TABLE |
22d50 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
22d60 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a  ONLY, iCovCur);.
22d70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22d80 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61  pSubWInfo || pPa
22d90 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61  rse->nErr || pPa
22da0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
22db0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
22dc0 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29   if( pSubWInfo )
22dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
22de0 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b  eLoop *pSubLoop;
22df0 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61  .          expla
22e00 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
22e10 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
22e20 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49   pOrTab, &pSubWI
22e30 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65  nfo->a[0], iLeve
22e40 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  l, pLevel->iFrom
22e50 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b  , 0.          );
22e60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
22e70 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
22e80 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
22e90 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
22eb0 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72  iSet = ((ii==pOr
22ec0 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a  Wc->nTerm-1)?-1:
22ed0 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii);.           
22ee0 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20   int r;.        
22ef0 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45      r = sqlite3E
22f00 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
22f10 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
22f20 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75  m->pTab, -1, iCu
22f30 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
22f60 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20  Rowid, 0);.     
22f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22f80 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
22f90 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65  P_RowSetTest, re
22fa0 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20 20  gRowset,.       
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22fd0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
22fe0 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b  (v)+2, r, iSet);
22ff0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23010 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
23020 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c  osub, regReturn,
23030 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20   iLoopBody);..  
23040 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
23050 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  SubWInfo->untest
23060 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61  edTerms flag mea
23070 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52 20  ns that this OR 
23080 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a  term.          *
23090 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20  * contained one 
230a0 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d  or more AND term
230b0 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79   from a notReady
230c0 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20   table.  The.   
230d0 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20         ** terms 
230e0 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64  from the notRead
230f0 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f  y table could no
23100 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64 20  t be tested and 
23110 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a  will.          *
23120 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73  * need to be tes
23130 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20  ted later..     
23140 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23150 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d    if( pSubWInfo-
23160 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  >untestedTerms )
23170 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
23180 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f   1;..          /
23190 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
231a0 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
231b0 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64  ms are optimized
231c0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a   using the same.
231d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
231e0 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ex, and the inde
231f0 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  x is opened usin
23200 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f  g the same curso
23210 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20  r number.       
23220 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61     ** by each ca
23230 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
23240 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62  reBegin() made b
23250 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20  y this loop, it 
23260 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  may.          **
23270 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
23280 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20 61  use that index a
23290 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
232a0 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ex..          **
232b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
232c0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
232d0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
232e0 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20   above resulted 
232f0 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20  in a scan that. 
23300 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73           ** uses
23310 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74   an index, and t
23320 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74 68  his is either th
23330 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65  e first OR-conne
23340 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20  cted term.      
23350 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
23360 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69 73   or the index is
23370 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 61   the same as tha
23380 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72  t used by all pr
23390 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
233a0 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70   ** terms, set p
233b0 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69  Cov to the candi
233c0 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e  date covering in
233d0 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  dex. Otherwise, 
233e0 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  set .          *
233f0 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74  * pCov to NULL t
23400 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
23410 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76  no candidate cov
23420 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c  ering index will
23430 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
23440 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20  e available..   
23450 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23460 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70      pSubLoop = p
23470 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70  SubWInfo->a[0].p
23480 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  WLoop;.         
23490 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e   if( (pSubLoop->
234a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
234b0 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
234c0 20 20 20 20 20 20 20 26 26 20 28 70 53 75 62 4c         && (pSubL
234d0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
234e0 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
234f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
23500 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62  & (ii==0 || pSub
23510 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
23520 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20  ndex==pCov).    
23530 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
23540 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
23550 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64  bWInfo->a[0].iId
23560 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b  xCur==iCovCur );
23570 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
23580 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e  v = pSubLoop->u.
23590 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
235a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
235b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
235c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
235d0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ..          /* F
235e0 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74  inish the loop t
235f0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
23600 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
23610 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
23620 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23630 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62 57  e3WhereEnd(pSubW
23640 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  Info);.        }
23650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23660 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f     pLevel->u.pCo
23670 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20  vidx = pCov;.   
23680 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76   if( pCov ) pLev
23690 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43  el->iIdxCur = iC
236a0 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70  ovCur;.    if( p
236b0 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20  AndExpr ){.     
236c0 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
236d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
236e0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
236f0 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78  arse->db, pAndEx
23700 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  pr);.    }.    s
23710 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
23720 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20  P1(v, iRetInit, 
23730 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
23740 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
23750 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23760 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
23770 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
23780 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
23790 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
237a0 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
237b0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
237c0 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65  Level>1 ) sqlite
237d0 33 53 74 61 63 6b 46 72 65 65 28 70 50 61 72 73  3StackFree(pPars
237e0 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a  e->db, pOrTab);.
237f0 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65      if( !unteste
23800 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65  dTerms ) disable
23810 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
23820 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  rm);.  }else.#en
23830 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
23840 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
23850 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f  ON */..  {.    /
23860 2a 20 43 61 73 65 20 36 3a 20 20 54 68 65 72 65  * Case 6:  There
23870 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e   is no usable in
23880 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f  dex.  We must do
23890 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20   a complete.    
238a0 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e  **          scan
238b0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
238c0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
238d0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
238e0 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f   aStep[] = { OP_
238f0 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b  Next, OP_Prev };
23900 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
23910 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20  t u8 aStart[] = 
23920 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f  { OP_Rewind, OP_
23930 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65  Last };.    asse
23940 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62  rt( bRev==0 || b
23950 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70 4c  Rev==1 );.    pL
23960 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70  evel->op = aStep
23970 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76  [bRev];.    pLev
23980 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
23990 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
239a0 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
239b0 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b  ddOp2(v, aStart[
239c0 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64  bRev], iCur, add
239d0 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65  rBrk);.    pLeve
239e0 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
239f0 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
23a00 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e  AN_STEP;.  }.  n
23a10 65 77 4e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74  ewNotReady = not
23a20 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b  Ready & ~getMask
23a30 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
23a40 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a  et, iCur);..  /*
23a50 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
23a60 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78  test every subex
23a70 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61  pression that ca
23a80 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  n be completely.
23a90 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73    ** computed us
23aa0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
23ab0 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20  set of tables.. 
23ac0 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
23ad0 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39  NTATION-OF: R-49
23ae0 35 32 35 2d 35 30 39 33 35 20 54 65 72 6d 73 20  525-50935 Terms 
23af0 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 73  that cannot be s
23b00 61 74 69 73 66 69 65 64 20 74 68 72 6f 75 67 68  atisfied through
23b10 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66  .  ** the use of
23b20 20 69 6e 64 69 63 65 73 20 62 65 63 6f 6d 65 20   indices become 
23b30 74 65 73 74 73 20 74 68 61 74 20 61 72 65 20 65  tests that are e
23b40 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74  valuated against
23b50 20 65 61 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a   each row of.  *
23b60 2a 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 69  * the relevant i
23b70 6e 70 75 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a  nput tables..  *
23b80 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  /.  for(pTerm=pW
23b90 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65  C->a, j=pWC->nTe
23ba0 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54  rm; j>0; j--, pT
23bb0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  erm++){.    Expr
23bc0 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61   *pE;.    testca
23bd0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
23be0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
23bf0 4c 20 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33  L ); /* IMP: R-3
23c00 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
23c10 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
23c20 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
23c30 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69  M_CODED );.    i
23c40 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
23c50 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
23c60 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
23c70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
23c80 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
23c90 41 6c 6c 20 26 20 6e 65 77 4e 6f 74 52 65 61 64  All & newNotRead
23ca0 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  y)!=0 ){.      t
23cb0 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d  estcase( pWInfo-
23cc0 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d  >untestedTerms==
23cd0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
23ce0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
23cf0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
23d00 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d  ONETABLE_ONLY)!=
23d10 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  0 );.      pWInf
23d20 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
23d30 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 1;.      cont
23d40 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
23d50 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
23d60 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
23d70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  E!=0 );.    if( 
23d80 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
23d90 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  n && !ExprHasPro
23da0 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
23db0 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
23dc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
23dd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
23de0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
23df0 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  E, addrCont, SQL
23e00 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
23e10 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
23e20 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
23e30 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73  D;.  }..  /* Ins
23e40 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
23e50 20 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e   for implied con
23e60 73 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f  straints based o
23e70 6e 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20  n transitivity. 
23e80 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20   ** of the "==" 
23e90 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
23ea0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20   ** Example: If 
23eb0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
23ec0 20 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d   contains "t1.a=
23ed0 74 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d  t2.b" and "t2.b=
23ee0 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65  123".  ** and we
23ef0 20 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20   are coding the 
23f00 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20  t1 loop and the 
23f10 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20  t2 loop has not 
23f20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20  yet coded,.  ** 
23f30 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75  then we cannot u
23f40 73 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e  se the "t1.a=t2.
23f50 62 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62  b" constraint, b
23f60 75 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20  ut we can code. 
23f70 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20   ** the implied 
23f80 22 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74  "t1.a=123" const
23f90 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
23fa0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
23fb0 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e  j=pWC->nTerm; j>
23fc0 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
23fd0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a  {.    Expr *pE;.
23fe0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
23ff0 41 6c 74 3b 0a 20 20 20 20 45 78 70 72 20 73 45  Alt;.    Expr sE
24000 71 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  q;.    if( pTerm
24010 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
24020 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
24030 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
24040 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
24050 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f  >eOperator!=(WO_
24060 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63  EQUIV|WO_EQ) ) c
24070 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
24080 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
24090 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  or!=iCur ) conti
240a0 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54  nue;.    pE = pT
240b0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
240c0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
240d0 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
240e0 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20  FromJoin) );.   
240f0 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
24100 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
24110 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ewNotReady)!=0 )
24120 3b 0a 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e  ;.    pAlt = fin
24130 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
24140 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
24150 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20  lumn, notReady, 
24160 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
24170 0a 20 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30  .    if( pAlt==0
24180 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24190 20 69 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61   if( pAlt->wtFla
241a0 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44  gs & (TERM_CODED
241b0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
241c0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
241d0 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61  t((v, "begin tra
241e0 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
241f0 6e 74 22 29 29 3b 0a 20 20 20 20 73 45 71 20 3d  nt"));.    sEq =
24200 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20   *pAlt->pExpr;. 
24210 20 20 20 73 45 71 2e 70 4c 65 66 74 20 3d 20 70     sEq.pLeft = p
24220 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 73 71  E->pLeft;.    sq
24230 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24240 28 70 50 61 72 73 65 2c 20 26 73 45 71 2c 20 61  (pParse, &sEq, a
24250 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
24260 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d  JUMPIFNULL);.  }
24270 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
24280 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
24290 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
242a0 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
242b0 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
242c0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
242d0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
242e0 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
242f0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
24300 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
24310 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
24320 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
24330 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
24340 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
24350 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
24360 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24370 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
24380 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
24390 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
243a0 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
243b0 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
243c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
243d0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
243e0 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
243f0 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
24400 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
24410 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
24420 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
24430 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
24440 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49  VIRTUAL );  /* I
24450 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  MP: R-30575-1166
24460 32 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  2 */.      testc
24470 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
24480 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
24490 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
244a0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
244b0 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
244c0 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
244d0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
244e0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
244f0 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21   & newNotReady)!
24500 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
24510 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e  sert( pWInfo->un
24520 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20  testedTerms );. 
24530 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
24540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
24550 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
24560 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  xpr );.      sql
24570 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
24580 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
24590 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Expr, addrCont, 
245a0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
245b0 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  L);.      pTerm-
245c0 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
245d0 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
245e0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
245f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
24600 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
24610 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 4e 6f 74  .  return newNot
24620 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66  Ready;.}..#ifdef
24630 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
24640 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
24650 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
24660 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ct for debugging
24670 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61   purposes.*/.sta
24680 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
24690 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f  opPrint(WhereLoo
246a0 70 20 2a 70 2c 20 53 72 63 4c 69 73 74 20 2a 70  p *p, SrcList *p
246b0 54 61 62 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20  TabList){.  int 
246c0 6e 62 20 3d 20 31 2b 28 70 54 61 62 4c 69 73 74  nb = 1+(pTabList
246d0 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73  ->nSrc+7)/8;.  s
246e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
246f0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 54 61 62  em *pItem = pTab
24700 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61  List->a + p->iTa
24710 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  b;.  Table *pTab
24720 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
24730 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24740 69 6e 74 66 28 22 25 63 20 25 32 64 2e 25 30 2a  intf("%c %2d.%0*
24750 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e  llx.%0*llx", p->
24760 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cId,.           
24770 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61            p->iTa
24780 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65  b, nb, p->maskSe
24790 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65  lf, nb, p->prere
247a0 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  q);.  sqlite3Deb
247b0 75 67 50 72 69 6e 74 66 28 22 20 25 38 73 22 2c  ugPrintf(" %8s",
247c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
247d0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c        pItem->zAl
247e0 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c  ias ? pItem->zAl
247f0 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d  ias : pTab->zNam
24800 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73  e);.  if( (p->ws
24810 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
24820 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
24830 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62  {.    if( p->u.b
24840 74 72 65 65 2e 70 49 6e 64 65 78 20 29 7b 0a 20  tree.pIndex ){. 
24850 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
24860 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  *zName = p->u.bt
24870 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
24880 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61  e;.      if( zNa
24890 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d 65 20 3d 20  me==0 ) zName = 
248a0 22 69 70 6b 22 3b 0a 20 20 20 20 20 20 69 66 28  "ipk";.      if(
248b0 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20   strncmp(zName, 
248c0 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
248d0 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20  x_", 17)==0 ){. 
248e0 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73         int i = s
248f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
24900 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20  Name) - 1;.     
24910 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b     while( zName[
24920 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20  i]!='_' ) i--;. 
24930 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20         zName += 
24940 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  i;.      }.     
24950 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24960 6e 74 66 28 22 2e 25 2d 31 32 73 20 25 32 64 22  ntf(".%-12s %2d"
24970 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74  , zName, p->u.bt
24980 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65  ree.nEq);.    }e
24990 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
249a0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
249b0 31 36 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a  16s","");.    }.
249c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
249d0 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d  r *z;.    if( p-
249e0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29  >u.vtab.idxStr )
249f0 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
24a00 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64  te3_mprintf("(%d
24a10 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20  ,\"%s\",%x)",.  
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
24a30 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
24a40 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
24a50 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  , p->u.vtab.omit
24a60 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Mask);.    }else
24a70 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
24a80 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64  te3_mprintf("(%d
24a90 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62  ,%x)", p->u.vtab
24aa0 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74  .idxNum, p->u.vt
24ab0 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
24ac0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
24ad0 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31  ebugPrintf(" %-1
24ae0 35 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  5s", z);.    sql
24af0 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
24b00 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
24b10 50 72 69 6e 74 66 28 22 20 66 67 20 25 30 35 78  Printf(" fg %05x
24b20 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61   N %d", p->wsFla
24b30 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a  gs, p->nLTerm);.
24b40 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24b50 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25  intf(" cost %d,%
24b60 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74  d,%d\n", p->rSet
24b70 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  up, p->rRun, p->
24b80 6e 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  nOut);.}.#endif.
24b90 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62  ./*.** Convert b
24ba0 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20  ulk memory into 
24bb0 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f  a valid WhereLoo
24bc0 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61  p that can be pa
24bd0 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65  ssed.** to where
24be0 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65  LoopClear harmle
24bf0 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssly..*/.static 
24c00 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e  void whereLoopIn
24c10 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  it(WhereLoop *p)
24c20 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  {.  p->aLTerm = 
24c30 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a  p->aLTermSpace;.
24c40 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b    p->nLTerm = 0;
24c50 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41  .  p->nLSlot = A
24c60 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65  rraySize(p->aLTe
24c70 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77  rmSpace);.  p->w
24c80 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f  sFlags = 0;.}../
24c90 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57  *.** Clear the W
24ca0 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e  hereLoop.u union
24cb0 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f  .  Leave WhereLo
24cc0 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74  op.pLTerm intact
24cd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24ce0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
24cf0 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  nion(sqlite3 *db
24d00 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
24d10 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
24d20 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55  s & (WHERE_VIRTU
24d30 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 54 45  ALTABLE|WHERE_TE
24d40 4d 50 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  MP_INDEX) ){.   
24d50 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
24d60 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
24d70 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e  TABLE)!=0 && p->
24d80 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
24d90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24da0 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e  _free(p->u.vtab.
24db0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70  idxStr);.      p
24dc0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
24dd0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  e = 0;.      p->
24de0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
24df0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
24e00 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
24e10 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
24e20 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65  !=0 && p->u.btre
24e30 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  e.pIndex!=0 ){. 
24e40 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
24e50 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
24e60 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66  e.pIndex->zColAf
24e70 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
24e80 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
24e90 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a  .btree.pIndex);.
24ea0 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65        p->u.btree
24eb0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
24ec0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
24ed0 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72  Deallocate inter
24ee0 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  nal memory used 
24ef0 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  by a WhereLoop o
24f00 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
24f10 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c  void whereLoopCl
24f20 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ear(sqlite3 *db,
24f30 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
24f40 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
24f50 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
24f60 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
24f70 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
24f80 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
24f90 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20  Union(db, p);.  
24fa0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
24fb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  ;.}../*.** Incre
24fc0 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ase the memory a
24fd0 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c  llocation for pL
24fe0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f  oop->aLTerm[] to
24ff0 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a   be at least n..
25000 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
25010 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71  ereLoopResize(sq
25020 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
25030 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b  Loop *p, int n){
25040 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70  .  WhereTerm **p
25050 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  aNew;.  if( p->n
25060 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72  LSlot>=n ) retur
25070 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e  n SQLITE_OK;.  n
25080 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70   = (n+7)&~7;.  p
25090 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
250a0 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
250b0 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
250c0 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e  ])*n);.  if( paN
250d0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
250e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
250f0 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e  emcpy(paNew, p->
25100 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70  aLTerm, sizeof(p
25110 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e  ->aLTerm[0])*p->
25120 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70  nLSlot);.  if( p
25130 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
25140 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
25150 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
25160 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c  aLTerm);.  p->aL
25170 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20  Term = paNew;.  
25180 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20  p->nLSlot = n;. 
25190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
251a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  K;.}../*.** Tran
251b0 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f  sfer content fro
251c0 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f  m the second pLo
251d0 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73  op into the firs
251e0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
251f0 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73   whereLoopXfer(s
25200 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
25210 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72  eLoop *pTo, Wher
25220 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20  eLoop *pFrom){. 
25230 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
25240 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46  size(db, pTo, pF
25250 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 20 72  rom->nLTerm) ) r
25260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
25270 45 4d 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  EM;.  whereLoopC
25280 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54  learUnion(db, pT
25290 6f 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f  o);.  memcpy(pTo
252a0 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c  , pFrom, WHERE_L
252b0 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20  OOP_XFER_SZ);.  
252c0 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
252d0 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
252e0 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
252f0 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
25300 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46  m[0]));.  if( pF
25310 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
25320 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
25330 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E ){.    pFrom->
25340 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
25350 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
25360 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73   (pFrom->wsFlags
25370 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
25380 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  DEX)!=0 ){.    p
25390 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49  From->u.btree.pI
253a0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
253b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
253c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
253d0 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  e a WhereLoop ob
253e0 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
253f0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c  oid whereLoopDel
25400 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
25410 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
25420 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
25430 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  (db, p);.  sqlit
25440 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
25450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
25460 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
25470 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
25480 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
25490 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
254a0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
254b0 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
254c0 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77  pWInfo) ){.    w
254d0 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
254e0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
254f0 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
25500 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20  ->pLoops ){.    
25510 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d    WhereLoop *p =
25520 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b   pWInfo->pLoops;
25530 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
25540 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
25550 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72  Loop;.      wher
25560 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
25570 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
25580 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25590 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
255a0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20  /*.** Insert or 
255b0 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c  replace a WhereL
255c0 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20  oop entry using 
255d0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70  the template sup
255e0 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  plied..**.** An 
255f0 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
25600 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62  op entry might b
25610 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
25620 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
25630 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61  e.** is better a
25640 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70  nd has fewer dep
25650 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74  endencies.  Or t
25660 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c  he template will
25670 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61   be ignored.** a
25680 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c  nd no insert wil
25690 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78  l occur if an ex
256a0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
256b0 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68   is faster and h
256c0 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65  as.** fewer depe
256d0 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
256e0 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68  e template.  Oth
256f0 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65  erwise a new Whe
25700 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64  reLoop is.** add
25710 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
25720 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  template..**.** 
25730 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65  If pBuilder->pBe
25740 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  st is not NULL t
25750 68 65 6e 20 77 65 20 6f 6e 6c 79 20 63 61 72 65  hen we only care
25760 20 61 62 6f 75 74 20 74 68 65 20 76 65 72 79 0a   about the very.
25770 2a 2a 20 62 65 73 74 20 74 65 6d 70 6c 61 74 65  ** best template
25780 20 61 6e 64 20 74 68 61 74 20 74 65 6d 70 6c 61   and that templa
25790 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  te should be sto
257a0 72 65 64 20 69 6e 20 70 42 75 69 6c 64 65 72 2d  red in pBuilder-
257b0 3e 70 42 65 73 74 2e 0a 2a 2a 20 49 66 20 70 42  >pBest..** If pB
257c0 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73  uilder->pBest is
257d0 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 6c 69 73   NULL then a lis
257e0 74 20 6f 66 20 74 68 65 20 62 65 73 74 20 74 65  t of the best te
257f0 6d 70 6c 61 74 65 73 20 61 72 65 20 73 74 6f 72  mplates are stor
25800 65 64 0a 2a 2a 20 69 6e 20 70 42 75 69 6c 64 65  ed.** in pBuilde
25810 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  r->pWInfo->pLoop
25820 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63  s..**.** When ac
25830 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69  cumulating multi
25840 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20  ple loops (when 
25850 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20  pBuilder->pBest 
25860 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73  is NULL) we.** s
25870 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77  till might overw
25880 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f  rite similar loo
25890 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ps with the new 
258a0 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a  template if the.
258b0 2a 2a 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62  ** template is b
258c0 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61  etter.  Loops ma
258d0 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  y be overwritten
258e0 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
258f0 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  g .** conditions
25900 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
25910 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76     (1)  They hav
25920 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e  e the same iTab.
25930 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79  .**    (2)  They
25940 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
25950 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28  SortIdx..**    (
25960 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  3)  The template
25970 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77   has same or few
25980 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
25990 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
259a0 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20   loop.**    (4) 
259b0 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
259c0 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
259d0 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68  wer cost than th
259e0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
259f0 2a 20 20 20 20 28 35 29 20 20 54 68 65 20 74 65  *    (5)  The te
25a00 6d 70 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65  mplate uses more
25a10 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61   terms of the sa
25a20 6d 65 20 69 6e 64 65 78 20 62 75 74 20 68 61 73  me index but has
25a30 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a   no additional.*
25a40 2a 20 20 20 20 20 20 20 20 20 64 65 70 65 6e 64  *         depend
25a50 65 6e 63 69 65 73 20 20 20 20 20 20 20 20 20 20  encies          
25a60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
25a70 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
25a80 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
25a90 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
25aa0 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
25ab0 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
25ac0 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65  ppPrev, *p, *pNe
25ad0 78 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 49  xt = 0;.  WhereI
25ae0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
25af0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
25b00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
25b10 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
25b20 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75  db;..  /* If pBu
25b30 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73 20  ilder->pBest is 
25b40 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
25b50 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
25b60 20 74 68 65 20 73 69 6e 67 6c 65 0a 20 20 2a 2a   the single.  **
25b70 20 62 65 73 74 20 57 68 65 72 65 4c 6f 6f 70 2e   best WhereLoop.
25b80 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73    pBuilder->pBes
25b90 74 2d 3e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 69  t->maskSelf==0 i
25ba0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 6e 6f  ndicates that no
25bb0 0a 20 20 2a 2a 20 70 72 69 6f 72 20 57 68 65 72  .  ** prior Wher
25bc0 65 4c 6f 6f 70 73 20 68 61 76 65 20 62 65 65 6e  eLoops have been
25bd0 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74   evaluated and t
25be0 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
25bf0 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2a 20 69  pTemplate.  ** i
25c00 73 20 74 68 65 72 65 66 6f 72 65 20 74 68 65 20  s therefore the 
25c10 66 69 72 73 74 20 61 6e 64 20 68 65 6e 63 65 20  first and hence 
25c20 74 68 65 20 62 65 73 74 20 61 6e 64 20 73 68 6f  the best and sho
25c30 75 6c 64 20 62 65 20 72 65 74 61 69 6e 65 64 2e  uld be retained.
25c40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 20 3d  .  */.  if( (p =
25c50 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74   pBuilder->pBest
25c60 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
25c70 70 2d 3e 6d 61 73 6b 53 65 6c 66 21 3d 30 20 29  p->maskSelf!=0 )
25c80 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6f 73  {.      WhereCos
25c90 74 20 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43  t rCost = whereC
25ca0 6f 73 74 41 64 64 28 70 2d 3e 72 52 75 6e 2c 70  ostAdd(p->rRun,p
25cb0 2d 3e 72 53 65 74 75 70 29 3b 0a 20 20 20 20 20  ->rSetup);.     
25cc0 20 57 68 65 72 65 43 6f 73 74 20 72 54 65 6d 70   WhereCost rTemp
25cd0 6c 61 74 65 20 3d 20 77 68 65 72 65 43 6f 73 74  late = whereCost
25ce0 41 64 64 28 70 54 65 6d 70 6c 61 74 65 2d 3e 72  Add(pTemplate->r
25cf0 52 75 6e 2c 70 54 65 6d 70 6c 61 74 65 2d 3e 72  Run,pTemplate->r
25d00 53 65 74 75 70 29 3b 0a 20 20 20 20 20 20 69 66  Setup);.      if
25d10 28 20 72 43 6f 73 74 20 3c 20 72 54 65 6d 70 6c  ( rCost < rTempl
25d20 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 67  ate ){.        g
25d30 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  oto whereLoopIns
25d40 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20  ert_noop;.      
25d50 7d 0a 20 20 20 20 20 20 69 66 28 20 72 43 6f 73  }.      if( rCos
25d60 74 20 3d 3d 20 72 54 65 6d 70 6c 61 74 65 20 26  t == rTemplate &
25d70 26 20 70 2d 3e 70 72 65 72 65 71 20 3c 3d 20 70  & p->prereq <= p
25d80 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
25d90 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
25da0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
25db0 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  _noop;.      }. 
25dc0 20 20 20 7d 0a 23 69 66 20 57 48 45 52 45 54 52     }.#if WHERETR
25dd0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
25de0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25df0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
25e00 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25e10 67 50 72 69 6e 74 66 28 70 2d 3e 6d 61 73 6b 53  gPrintf(p->maskS
25e20 65 6c 66 3d 3d 30 20 3f 20 22 69 6e 73 2d 69 6e  elf==0 ? "ins-in
25e30 69 74 3a 20 22 20 3a 20 22 69 6e 73 2d 62 65 73  it: " : "ins-bes
25e40 74 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65  t: ");.      whe
25e50 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
25e60 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e 70  plate, pWInfo->p
25e70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  TabList);.    }.
25e80 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72 65  #endif.    where
25e90 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20  LoopXfer(db, p, 
25ea0 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20  pTemplate);.    
25eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25ec0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72  ;.  }..  /* Sear
25ed0 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
25ee0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  ng WhereLoop to 
25ef0 6f 76 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68  overwrite, or wh
25f00 69 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70  ich takes.  ** p
25f10 72 69 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65  riority over pTe
25f20 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66  mplate..  */.  f
25f30 6f 72 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66  or(ppPrev=&pWInf
25f40 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70  o->pLoops, p=*pp
25f50 50 72 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d  Prev; p; ppPrev=
25f60 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70  &p->pNextLoop, p
25f70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69  =*ppPrev){.    i
25f80 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
25f90 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70  plate->iTab || p
25fa0 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d  ->iSortIdx!=pTem
25fb0 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20  plate->iSortIdx 
25fc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25fd0 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
25fe0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
25ff0 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20  eq)==p->prereq. 
26000 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
26010 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
26020 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72  tup.     && p->r
26030 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run<=pTemplate->
26040 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  rRun.    ){.    
26050 20 20 2f 2a 20 70 20 69 73 20 65 71 75 61 6c 20    /* p is equal 
26060 6f 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  or better than p
26070 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
26080 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 3c    if( p->nLTerm<
26090 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72  pTemplate->nLTer
260a0 6d 0a 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e  m.       && (p->
260b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
260c0 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
260d0 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
260e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
260f0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
26100 20 20 20 20 20 26 26 20 70 2d 3e 75 2e 62 74 72       && p->u.btr
26110 65 65 2e 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70  ee.pIndex==pTemp
26120 6c 61 74 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49  late->u.btree.pI
26130 6e 64 65 78 0a 20 20 20 20 20 20 20 26 26 20 70  ndex.       && p
26140 2d 3e 70 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c  ->prereq==pTempl
26150 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20  ate->prereq.    
26160 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
26170 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69  Overwrite an exi
26180 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
26190 77 69 74 68 20 61 6e 20 73 69 6d 69 6c 61 72 20  with an similar 
261a0 6f 6e 65 20 74 68 61 74 20 75 73 65 73 0a 20 20  one that uses.  
261b0 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65        ** more te
261c0 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
261d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 78   */.        pNex
261e0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  t = p->pNextLoop
261f0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
26200 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
26210 20 70 2d 3e 6e 4f 75 74 3e 70 54 65 6d 70 6c 61   p->nOut>pTempla
26220 74 65 2d 3e 6e 4f 75 74 0a 20 20 20 20 20 20 20  te->nOut.       
26230 26 26 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54  && p->rSetup==pT
26240 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a  emplate->rSetup.
26250 20 20 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75         && p->rRu
26260 6e 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n==pTemplate->rR
26270 75 6e 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  un.      ){.    
26280 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
26290 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
262a0 72 65 4c 6f 6f 70 20 77 69 74 68 20 74 68 65 20  reLoop with the 
262b0 73 61 6d 65 20 63 6f 73 74 20 62 75 74 20 6d 6f  same cost but mo
262c0 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  re.        ** ou
262d0 74 70 75 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  tputs */.       
262e0 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
262f0 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 62  tLoop;.        b
26300 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
26310 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 54  e{.        /* pT
26320 65 6d 70 6c 61 74 65 20 69 73 20 6e 6f 74 20 68  emplate is not h
26330 65 6c 70 66 75 6c 2e 0a 20 20 20 20 20 20 20 20  elpful..        
26340 2a 2a 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  ** Return withou
26350 74 20 63 68 61 6e 67 69 6e 67 20 6f 72 20 61 64  t changing or ad
26360 64 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  ding anything */
26370 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68  .        goto wh
26380 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f  ereLoopInsert_no
26390 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  op;.      }.    
263a0 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  }.    if( (p->pr
263b0 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
263c0 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70  ->prereq)==pTemp
263d0 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20  late->prereq.   
263e0 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3e 3d    && p->rSetup>=
263f0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
26400 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  p.     && p->rRu
26410 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
26420 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  un.    ){.      
26430 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20  /* Overwrite an 
26440 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
26450 6f 70 20 77 69 74 68 20 61 20 62 65 74 74 65 72  op with a better
26460 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e   one */.      pN
26470 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f  ext = p->pNextLo
26480 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  op;.      break;
26490 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
264a0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
264b0 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73  s point it means
264c0 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d   that either p[]
264d0 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77   should be overw
264e0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68  ritten.  ** with
264f0 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20   pTemplate[] if 
26500 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69  p[] exists, or i
26510 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61  f p==NULL then a
26520 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20  llocate a new.  
26530 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64  ** WhereLoop and
26540 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f   insert it..  */
26550 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
26560 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
26570 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
26580 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28  & 0x8 ){.    if(
26590 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p!=0 ){.      s
265a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
265b0 66 28 22 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b  f("ins-del:  ");
265c0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
265d0 50 72 69 6e 74 28 70 2c 20 70 57 49 6e 66 6f 2d  Print(p, pWInfo-
265e0 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20  >pTabList);.    
265f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
26600 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65  ugPrintf("ins-ne
26610 77 3a 20 20 22 29 3b 0a 20 20 20 20 77 68 65 72  w:  ");.    wher
26620 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
26630 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54  late, pWInfo->pT
26640 61 62 4c 69 73 74 29 3b 0a 20 20 7d 0a 23 65 6e  abList);.  }.#en
26650 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
26660 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
26670 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
26680 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
26690 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
266a0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
266b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65  E_NOMEM;.    whe
266c0 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20  reLoopInit(p);. 
266d0 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58 66   }.  whereLoopXf
266e0 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c  er(db, p, pTempl
266f0 61 74 65 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  ate);.  p->pNext
26700 4c 6f 6f 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20  Loop = pNext;.  
26710 2a 70 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 69  *ppPrev = p;.  i
26720 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
26730 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
26740 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49  BLE)==0 ){.    I
26750 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70  ndex *pIndex = p
26760 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
26770 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
26780 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d   && pIndex->tnum
26790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
267a0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
267b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
267c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
267d0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
267e0 65 20 69 66 20 74 68 65 20 69 6e 73 65 72 74 20  e if the insert 
267f0 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68  is a no-op */.wh
26800 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f  ereLoopInsert_no
26810 6f 70 3a 0a 23 69 66 20 57 48 45 52 45 54 52 41  op:.#if WHERETRA
26820 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
26830 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
26840 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
26850 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26860 74 66 28 70 42 75 69 6c 64 65 72 2d 3e 70 42 65  tf(pBuilder->pBe
26870 73 74 20 3f 20 22 69 6e 73 2d 73 6b 69 70 3a 20  st ? "ins-skip: 
26880 22 20 3a 20 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22  " : "ins-noop: "
26890 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
268a0 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
268b0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
268c0 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
268d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
268e0 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65  K;  .}../*.** We
268f0 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
26900 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
26910 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
26920 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
26930 64 65 78 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54  dex pIndex..** T
26940 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20  ry to match one 
26950 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  more..**.** If p
26960 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20  Probe->tnum==0, 
26970 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65  that means pInde
26980 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65  x is a fake inde
26990 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a  x used for the.*
269a0 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
269b0 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  Y KEY..*/.static
269c0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
269d0 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57  dBtreeIndex(.  W
269e0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
269f0 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f  *pBuilder,     /
26a00 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
26a10 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72  factory */.  str
26a20 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
26a30 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20   *pSrc,      /* 
26a40 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
26a50 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
26a60 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
26a70 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  be,             
26a80 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
26a90 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 57 68   on pSrc */.  Wh
26aa0 65 72 65 43 6f 73 74 20 6e 49 6e 4d 75 6c 20 20  ereCost nInMul  
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26ac0 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69   log(Number of i
26ad0 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f  terations due to
26ae0 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   IN) */.){.  Whe
26af0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
26b00 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
26b10 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61  o;  /* WHERE ana
26b20 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lyse context */.
26b30 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
26b40 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
26b50 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ;        /* Pars
26b60 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
26b70 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
26b80 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
26b90 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
26ba0 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63  nection malloc c
26bb0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
26bc0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26be0 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
26bf0 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  p under construc
26c00 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
26c10 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
26c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
26c30 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63  hereTerm under c
26c40 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
26c50 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20    int opMask;   
26c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c70 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61    /* Valid opera
26c80 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61  tors for constra
26c90 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53  ints */.  WhereS
26ca0 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20  can scan;       
26cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
26cc0 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20  rator for WHERE 
26cd0 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
26ce0 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b  sk saved_prereq;
26cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
26d00 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
26d10 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a  pNew->prereq */.
26d20 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65    u16 saved_nLTe
26d30 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
26d40 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
26d50 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54  lue of pNew->nLT
26d60 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  erm */.  int sav
26d70 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20  ed_nEq;         
26d80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
26d90 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
26da0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
26db0 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77  */.  u32 saved_w
26dc0 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
26dd0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
26de0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
26df0 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 57 68 65  wsFlags */.  Whe
26e00 72 65 43 6f 73 74 20 73 61 76 65 64 5f 6e 4f 75  reCost saved_nOu
26e10 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
26e20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
26e30 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a  f pNew->nOut */.
26e40 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e60 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
26e70 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
26e80 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
26e90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
26ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26eb0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57  turn code */.  W
26ec0 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 45 73 74  hereCost nRowEst
26ed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
26ee0 2a 20 45 73 74 69 6d 61 74 65 64 20 69 6e 64 65  * Estimated inde
26ef0 78 20 73 65 6c 65 63 74 69 76 69 74 79 20 2a 2f  x selectivity */
26f00 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f  .  WhereCost rLo
26f10 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
26f20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
26f30 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f  of table size */
26f40 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
26f50 6f 70 2c 20 2a 70 42 74 6d 3b 20 20 20 20 20 20  op, *pBtm;      
26f60 20 20 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f     /* Top and bo
26f70 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74  ttom range const
26f80 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65  raints */..  pNe
26f90 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
26fa0 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ew;.  if( db->ma
26fb0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
26fc0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
26fd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  ;..  assert( (pN
26fe0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
26ff0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
27000 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
27010 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
27020 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f  nEq<=pProbe->nCo
27030 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
27040 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
27050 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
27060 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  IT)==0 );.  if( 
27070 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
27080 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
27090 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  ){.    opMask = 
270a0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
270b0 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d  else if( pProbe-
270c0 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72  >tnum<=0 || (pSr
270d0 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  c->jointype & JT
270e0 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
270f0 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
27100 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_IN|WO_GT|WO_G
27110 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
27120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61   }else{.    opMa
27130 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
27140 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54  |WO_ISNULL|WO_GT
27150 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
27160 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  LE;.  }.  if( pP
27170 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
27180 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57   ) opMask &= ~(W
27190 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
271a0 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 69 66 28 20  |WO_LE);..  if( 
271b0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
271c0 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  q < pProbe->nCol
271d0 75 6d 6e 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  umn ){.    iCol 
271e0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
271f0 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  mn[pNew->u.btree
27200 2e 6e 45 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45  .nEq];.    nRowE
27210 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70  st = whereCost(p
27220 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b  Probe->aiRowEst[
27230 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
27240 71 2b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  q+1]);.  }else{.
27250 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20      iCol = -1;. 
27260 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 0a     nRowEst = 0;.
27270 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 77 68    }.  pTerm = wh
27280 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
27290 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  n, pBuilder->pWC
272a0 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  , pSrc->iCursor,
272b0 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20   iCol,.         
272c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
272d0 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a  pMask, pProbe);.
272e0 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e    saved_nEq = pN
272f0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
27300 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20  .  saved_nLTerm 
27310 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a  = pNew->nLTerm;.
27320 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20    saved_wsFlags 
27330 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b  = pNew->wsFlags;
27340 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20  .  saved_prereq 
27350 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a  = pNew->prereq;.
27360 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70    saved_nOut = p
27370 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65  New->nOut;.  pNe
27380 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
27390 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
273a0 6f 67 28 77 68 65 72 65 43 6f 73 74 28 70 50 72  og(whereCost(pPr
273b0 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  obe->aiRowEst[0]
273c0 29 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d  ));.  for(; rc==
273d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
273e0 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77  rm!=0; pTerm = w
273f0 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
27400 61 6e 29 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49  an)){.    int nI
27410 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  n = 0;.    if( p
27420 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
27430 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
27440 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  lf ) continue;. 
27450 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
27460 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
27470 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
27480 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
27490 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nEq;.    pNew->n
274a0 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
274b0 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68  Term;.    if( wh
274c0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
274d0 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
274e0 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b  Term+1) ) break;
274f0 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70   /* OOM */.    p
27500 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
27510 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54  ->nLTerm++] = pT
27520 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  erm;.    pNew->p
27530 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70  rereq = (saved_p
27540 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70  rereq | pTerm->p
27550 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70  rereqRight) & ~p
27560 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
27570 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
27580 72 4c 6f 67 53 69 7a 65 3b 20 2f 2a 20 42 61 73  rLogSize; /* Bas
27590 65 6c 69 6e 65 20 63 6f 73 74 20 69 73 20 6c 6f  eline cost is lo
275a0 67 32 28 4e 29 2e 20 20 41 64 6a 75 73 74 6d 65  g2(N).  Adjustme
275b0 6e 74 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  nts below */.   
275c0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
275d0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b  rator & WO_IN ){
275e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
275f0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
27600 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  r;.      pNew->w
27610 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
27620 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20  COLUMN_IN;.     
27630 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
27640 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
27650 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
27660 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
27670 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55  ELECT ...)":  TU
27680 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54  NING: the SELECT
27690 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
276a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
276b0 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
276c0 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29  6==whereCost(25)
276d0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   );.      }else 
276e0 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
276f0 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78  ->x.pList && pEx
27700 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
27710 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
27720 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20  * "x IN (value, 
27730 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a  value, ...)" */.
27740 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 77 68          nIn = wh
27750 65 72 65 43 6f 73 74 28 70 45 78 70 72 2d 3e 78  ereCost(pExpr->x
27760 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  .pList->nExpr);.
27770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
27780 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 3b  ew->rRun += nIn;
27790 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
277a0 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
277b0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
277c0 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20  RowEst + nInMul 
277d0 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  + nIn;.    }else
277e0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
277f0 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 29 20  rator & (WO_EQ) 
27800 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
27810 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
27820 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
27830 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  NULL|WHERE_COLUM
27840 4e 5f 49 4e 29 29 21 3d 30 0a 20 20 20 20 20 20  N_IN))!=0.      
27850 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e              || n
27860 49 6e 4d 75 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  InMul==0 );.    
27870 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
27880 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
27890 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  EQ;.      if( iC
278a0 6f 6c 3c 30 20 20 0a 20 20 20 20 20 20 20 7c 7c  ol<0  .       ||
278b0 20 28 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f   (pProbe->onErro
278c0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 6e 49  r!=OE_None && nI
278d0 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  nMul==0.        
278e0 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
278f0 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d  ree.nEq==pProbe-
27900 3e 6e 43 6f 6c 75 6d 6e 2d 31 29 0a 20 20 20 20  >nColumn-1).    
27910 20 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73    ){.        tes
27920 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 77 73 46  tcase( pNew->wsF
27930 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
27940 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20  UMN_IN );.      
27950 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
27960 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  |= WHERE_ONEROW;
27970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
27980 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27990 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ++;.      pNew->
279a0 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b  nOut = nRowEst +
279b0 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d 65 6c   nInMul;.    }el
279c0 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f  se if( pTerm->eO
279d0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53  perator & (WO_IS
279e0 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 70  NULL) ){.      p
279f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
27a00 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
27a10 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  L;.      pNew->u
27a20 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20  .btree.nEq++;.  
27a30 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49      /* TUNING: I
27a40 53 20 4e 55 4c 4c 20 73 65 6c 65 63 74 73 20 32  S NULL selects 2
27a50 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 6e   rows */.      n
27a60 49 6e 20 3d 20 31 30 3b 20 20 61 73 73 65 72 74  In = 10;  assert
27a70 28 20 31 30 3d 3d 77 68 65 72 65 43 6f 73 74 28  ( 10==whereCost(
27a80 32 29 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  2) );.      pNew
27a90 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74  ->nOut = nRowEst
27aa0 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b   + nInMul + nIn;
27ab0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
27ac0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27ad0 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20  & (WO_GT|WO_GE) 
27ae0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
27af0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
27b00 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
27b10 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
27b20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d      pBtm = pTerm
27b30 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30  ;.      pTop = 0
27b40 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
27b50 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
27b60 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
27b70 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
27b80 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
27b90 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
27ba0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
27bb0 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72       pTop = pTer
27bc0 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  m;.      pBtm = 
27bd0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
27be0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
27bf0 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
27c00 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
27c10 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
27c20 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20  LTerm-2] : 0;.  
27c30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4e 65 77    }.    if( pNew
27c40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
27c50 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
27c60 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
27c70 74 20 6e 4f 75 74 20 61 6e 64 20 72 52 75 6e 20  t nOut and rRun 
27c80 66 6f 72 20 53 54 41 54 33 20 72 61 6e 67 65 20  for STAT3 range 
27c90 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20  values */.      
27ca0 57 68 65 72 65 43 6f 73 74 20 72 44 69 76 3b 0a  WhereCost rDiv;.
27cb0 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65        whereRange
27cc0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
27cd0 70 50 72 6f 62 65 2c 20 70 4e 65 77 2d 3e 75 2e  pProbe, pNew->u.
27ce0 62 74 72 65 65 2e 6e 45 71 2c 0a 20 20 20 20 20  btree.nEq,.     
27cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d00 20 20 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26     pBtm, pTop, &
27d10 72 44 69 76 29 3b 0a 20 20 20 20 20 20 70 4e 65  rDiv);.      pNe
27d20 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
27d30 6e 4f 75 74 3e 72 44 69 76 2b 31 30 20 3f 20 73  nOut>rDiv+10 ? s
27d40 61 76 65 64 5f 6e 4f 75 74 20 2d 20 72 44 69 76  aved_nOut - rDiv
27d50 20 3a 20 31 30 3b 0a 20 20 20 20 7d 0a 23 69 66   : 10;.    }.#if
27d60 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
27d70 45 5f 53 54 41 54 33 0a 20 20 20 20 69 66 28 20  E_STAT3.    if( 
27d80 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
27d90 71 3d 3d 31 20 26 26 20 70 50 72 6f 62 65 2d 3e  q==1 && pProbe->
27da0 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20  nSample ){.     
27db0 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20   tRowcnt nOut = 
27dc0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  0;.      if( (pT
27dd0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
27de0 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
27df0 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  L))!=0 ){.      
27e00 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
27e10 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
27e20 20 70 50 72 6f 62 65 2c 20 70 54 65 72 6d 2d 3e   pProbe, pTerm->
27e30 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
27e40 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  nOut);.      }el
27e50 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
27e60 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
27e70 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
27e80 26 20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  &  !ExprHasPrope
27e90 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
27ea0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
27eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27ec0 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
27ed0 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20  pParse, pProbe, 
27ee0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e  pTerm->pExpr->x.
27ef0 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  pList, &nOut);. 
27f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
27f10 77 2d 3e 6e 4f 75 74 20 3d 20 77 68 65 72 65 43  w->nOut = whereC
27f20 6f 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20 7d  ost(nOut);.    }
27f30 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
27f40 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
27f50 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
27f60 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20  |WHERE_IPK))==0 
27f70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68  ){.      /* Each
27f80 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20   row involves a 
27f90 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65  step of the inde
27fa0 78 2c 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79  x, then a binary
27fb0 20 73 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20   search of.     
27fc0 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62   ** the main tab
27fd0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  le */.      pNew
27fe0 2d 3e 72 52 75 6e 20 3d 20 20 77 68 65 72 65 43  ->rRun =  whereC
27ff0 6f 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  ostAdd(pNew->rRu
28000 6e 2c 20 72 4c 6f 67 53 69 7a 65 3e 32 37 20 3f  n, rLogSize>27 ?
28010 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20 31   rLogSize-17 : 1
28020 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
28030 20 53 74 65 70 20 63 6f 73 74 20 66 6f 72 20 65   Step cost for e
28040 61 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20 2a  ach output row *
28050 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  /.    pNew->rRun
28060 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
28070 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77  pNew->rRun, pNew
28080 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20  ->nOut);.    /* 
28090 54 42 44 3a 20 41 64 6a 75 73 74 20 6e 4f 75 74  TBD: Adjust nOut
280a0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
280b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
280c0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
280d0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
280e0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28  , pNew);.    if(
280f0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
28100 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
28110 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e  T)==0.     && pN
28120 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
28130 28 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  (pProbe->nColumn
28140 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d   + (pProbe->zNam
28150 65 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20 20  e!=0)).    ){.  
28160 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
28170 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
28180 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
28190 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a  e, nInMul+nIn);.
281a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
281b0 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64  ->prereq = saved
281c0 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d  _prereq;.  pNew-
281d0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
281e0 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77  aved_nEq;.  pNew
281f0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
28200 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65  d_wsFlags;.  pNe
28210 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
28220 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  nOut;.  pNew->nL
28230 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
28240 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  erm;.  return rc
28250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
28260 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20  n True if it is 
28270 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49  possible that pI
28280 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73  ndex might be us
28290 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65  eful in.** imple
282a0 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45  menting the ORDE
282b0 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70  R BY clause in p
282c0 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52  Builder..**.** R
282d0 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70  eturn False if p
282e0 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74  Builder does not
282f0 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45   contain an ORDE
28300 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a  R BY clause or.*
28310 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * if there is no
28320 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20   way for pIndex 
28330 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20  to be useful in 
28340 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61  implementing tha
28350 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  t.** ORDER BY cl
28360 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
28370 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65  int indexMightHe
28380 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20  lpWithOrderBy(. 
28390 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
283a0 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49  r *pBuilder,.  I
283b0 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20  ndex *pIndex,.  
283c0 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20  int iCursor.){. 
283d0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a   ExprList *pOB;.
283e0 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20    int ii, jj;.. 
283f0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e   if( pIndex->bUn
28400 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e  ordered ) return
28410 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d   0;.  if( (pOB =
28420 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
28430 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20  o->pOrderBy)==0 
28440 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
28450 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
28460 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
28470 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
28480 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
28490 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69  ollate(pOB->a[ii
284a0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
284b0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
284c0 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
284d0 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  0;.    if( pExpr
284e0 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f  ->iTable==iCurso
284f0 72 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  r ){.      for(j
28500 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e  j=0; jj<pIndex->
28510 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b 2b 29 7b 0a  nColumn; jj++){.
28520 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
28530 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  r->iColumn==pInd
28540 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d  ex->aiColumn[jj]
28550 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
28560 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
28570 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
28580 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74  .** Return a bit
28590 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e  mask where 1s in
285a0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
285b0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
285c0 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74  lumn of.** the t
285d0 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20  able is used by 
285e0 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  an index.  Only 
285f0 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
28600 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65  umns are conside
28610 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  red..*/.static B
28620 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e  itmask columnsIn
28630 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
28640 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20  x){.  Bitmask m 
28650 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
28660 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(j=pIdx->nCol
28670 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  umn-1; j>=0; j--
28680 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
28690 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
286a0 3b 0a 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d  ;.    if( x<BMS-
286b0 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54  1 ) m |= MASKBIT
286c0 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (x);.  }.  retur
286d0 6e 20 6d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  n m;.}.../*.** A
286e0 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
286f0 20 6f 62 6a 65 63 74 73 20 61 20 73 69 6e 67 6c   objects a singl
28700 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  e table of the j
28710 6f 69 6e 20 77 65 72 65 20 74 68 65 20 74 61 62  oin were the tab
28720 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65  le.** is idenfie
28730 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70  d by pBuilder->p
28740 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
28750 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
28760 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20  teed to be.** a 
28770 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f  b-tree table, no
28780 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
28790 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
287a0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
287b0 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ee(.  WhereLoopB
287c0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
287d0 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  , /* WHERE claus
287e0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
287f0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72  .  Bitmask mExtr
28800 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a              /
28810 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65  * Extra prereque
28820 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20  sites for using 
28830 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
28840 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
28850 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
28860 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
28870 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
28880 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
28890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
288a0 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
288b0 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
288c0 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
288d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
288e0 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
288f0 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
28900 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  key */.  tRowcnt
28910 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
28920 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
28930 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  wEst[] value for
28940 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
28950 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e  /.  int aiColumn
28960 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
28970 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
28980 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
28990 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72  Pk index */.  Sr
289a0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
289b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
289c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
289d0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
289e0 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a  _item *pSrc;  /*
289f0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
28a00 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20 61   btree term to a
28a10 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  dd */.  WhereLoo
28a20 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  p *pNew;        
28a30 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
28a40 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
28a50 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
28a60 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
28a70 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
28a80 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 49   */.  int iSortI
28a90 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  dx = 1;         
28aa0 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65    /* Index numbe
28ab0 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20  r */.  int b;   
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20     /* A boolean 
28ae0 76 61 6c 75 65 20 2a 2f 0a 20 20 57 68 65 72 65  value */.  Where
28af0 43 6f 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20  Cost rSize;     
28b00 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72         /* number
28b10 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
28b20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  table */.  Where
28b30 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  Cost rLogSize;  
28b40 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69         /* Logari
28b50 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  thm of the numbe
28b60 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
28b70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 0a 20 20 70   table */.  .  p
28b80 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
28b90 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  pNew;.  pWInfo =
28ba0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
28bb0 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  o;.  pTabList = 
28bc0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
28bd0 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c  ;.  pSrc = pTabL
28be0 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
28bf0 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Tab;.  assert( !
28c00 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e  IsVirtual(pSrc->
28c10 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28 20  pTab) );..  if( 
28c20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a  pSrc->pIndex ){.
28c30 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45      /* An INDEXE
28c40 44 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63  D BY clause spec
28c50 69 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c  ifies a particul
28c60 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  ar index to use 
28c70 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20  */.    pProbe = 
28c80 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pSrc->pIndex;.  
28c90 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
28ca0 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45  ere is no INDEXE
28cb0 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72  D BY clause.  Cr
28cc0 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65  eate a fake Inde
28cd0 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61  x object in loca
28ce0 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  l.    ** variabl
28cf0 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65  e sPk to represe
28d00 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  nt the rowid pri
28d10 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20  mary key index. 
28d20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a   Make this.    *
28d30 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65  * fake index the
28d40 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69   first in a chai
28d50 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63  n of Index objec
28d60 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74  ts with all of t
28d70 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69  he real.    ** i
28d80 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77  ndices to follow
28d90 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
28da0 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
28db0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
28dc0 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73   of real indices
28dd0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
28de0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
28df0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
28e00 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f  x));.    sPk.nCo
28e10 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50  lumn = 1;.    sP
28e20 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69  k.aiColumn = &ai
28e30 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50  ColumnPk;.    sP
28e40 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52  k.aiRowEst = aiR
28e50 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b  owEstPk;.    sPk
28e60 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65  .onError = OE_Re
28e70 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70  place;.    sPk.p
28e80 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
28e90 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  ab;.    aiRowEst
28ea0 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70 54  Pk[0] = pSrc->pT
28eb0 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20  ab->nRowEst;.   
28ec0 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d   aiRowEstPk[1] =
28ed0 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d   1;.    pFirst =
28ee0 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
28ef0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72  dex;.    if( pSr
28f00 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  c->notIndexed==0
28f10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
28f20 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66   real indices of
28f30 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f   the table are o
28f40 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69  nly considered i
28f50 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e  f the.      ** N
28f60 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69  OT INDEXED quali
28f70 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  fier is omitted 
28f80 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c  from the FROM cl
28f90 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50  ause */.      sP
28fa0 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74  k.pNext = pFirst
28fb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f  ;.    }.    pPro
28fc0 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20  be = &sPk;.  }. 
28fd0 20 72 53 69 7a 65 20 3d 20 77 68 65 72 65 43 6f   rSize = whereCo
28fe0 73 74 28 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e  st(pSrc->pTab->n
28ff0 52 6f 77 45 73 74 29 3b 0a 20 20 72 4c 6f 67 53  RowEst);.  rLogS
29000 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69  ize = estLog(rSi
29010 7a 65 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 6f 6d  ze);..  /* Autom
29020 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a  atic indexes */.
29030 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d    if( !pBuilder-
29040 3e 70 42 65 73 74 0a 20 20 20 26 26 20 28 70 57  >pBest.   && (pW
29050 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
29060 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
29070 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20  _AutoIndex)!=0. 
29080 20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65    && pSrc->pInde
29090 78 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63  x==0.   && !pSrc
290a0 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20  ->viaCoroutine. 
290b0 20 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49    && !pSrc->notI
290c0 6e 64 65 78 65 64 0a 20 20 20 26 26 20 21 70 53  ndexed.   && !pS
290d0 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  rc->isCorrelated
290e0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e  .  ){.    /* Gen
290f0 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78  erate auto-index
29100 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20   WhereLoops */. 
29110 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
29120 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
29130 70 57 43 3b 0a 20 20 20 20 57 68 65 72 65 54 65  pWC;.    WhereTe
29140 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57  rm *pTerm;.    W
29150 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
29160 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
29170 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28  >nTerm;.    for(
29180 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63  pTerm=pWC->a; rc
29190 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
291a0 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
291b0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
291c0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
291d0 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
291e0 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
291f0 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43  .      if( termC
29200 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
29210 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a  rm, pSrc, 0) ){.
29220 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
29230 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
29240 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
29250 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
29260 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
29270 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
29280 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
29290 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
292a0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
292b0 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
292c0 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
292d0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
292e0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70  s.        ** app
292f0 72 6f 78 69 6d 61 74 65 6c 79 20 36 2a 4e 2a 6c  roximately 6*N*l
29300 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
29310 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
29320 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
29330 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
29340 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20  ng indexed. */. 
29350 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
29360 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b  tup = rLogSize +
29370 20 72 53 69 7a 65 20 2b 20 32 36 3b 20 20 61 73   rSize + 26;  as
29380 73 65 72 74 28 20 32 36 3d 3d 77 68 65 72 65 43  sert( 26==whereC
29390 6f 73 74 28 36 29 20 29 3b 0a 20 20 20 20 20 20  ost(6) );.      
293a0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63    /* TUNING: Eac
293b0 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79  h index lookup y
293c0 69 65 6c 64 73 20 31 30 20 72 6f 77 73 20 69 6e  ields 10 rows in
293d0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
293e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
293f0 20 3d 20 33 33 3b 20 20 61 73 73 65 72 74 28 20   = 33;  assert( 
29400 33 33 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 30  33==whereCost(10
29410 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
29420 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43  w->rRun = whereC
29430 6f 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  ostAdd(rLogSize,
29440 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20  pNew->nOut);.   
29450 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
29460 67 73 20 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs = WHERE_TEMP_
29470 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70  INDEX;.        p
29480 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
29490 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72  xtra | pTerm->pr
294a0 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
294b0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
294c0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
294d0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
294e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
294f0 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
29500 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f  ndices.  */.  fo
29510 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
29520 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72  K && pProbe; pPr
29530 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78  obe=pProbe->pNex
29540 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a  t, iSortIdx++){.
29550 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
29560 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70  e.nEq = 0;.    p
29570 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
29580 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74  .    pNew->iSort
29590 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Idx = 0;.    pNe
295a0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
295b0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
295c0 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e  = mExtra;.    pN
295d0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
295e0 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20  ex = pProbe;.   
295f0 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48   b = indexMightH
29600 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 70  elpWithOrderBy(p
29610 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c  Builder, pProbe,
29620 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b   pSrc->iCursor);
29630 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50  .    /* The ONEP
29640 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67  ASS_DESIRED flag
29650 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74  s never occurs t
29660 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52 44  ogether with ORD
29670 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73  ER BY */.    ass
29680 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63  ert( (pWInfo->wc
29690 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
296a0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
296b0 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a  )==0 || b==0 );.
296c0 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
296d0 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  tnum<=0 ){.     
296e0 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d   /* Integer prim
296f0 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f  ary key index */
29700 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
29710 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b  lags = WHERE_IPK
29720 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  ;..      /* Full
29730 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
29740 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
29750 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
29760 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 70 4e  dx : 0;.      pN
29770 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
29780 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
29790 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20  G: Cost of full 
297a0 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33 2a  table scan is 3*
297b0 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20  (N + log2(N)).. 
297c0 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20       **  +  The 
297d0 65 78 74 72 61 20 33 20 66 61 63 74 6f 72 20 69  extra 3 factor i
297e0 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74  s to encourage t
297f0 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78 65  he use of indexe
29800 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20  d lookups.      
29810 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c 6c  **     over full
29820 20 73 63 61 6e 73 2e 20 20 41 20 73 6d 61 6c 6c   scans.  A small
29830 65 72 20 63 6f 6e 73 74 61 6e 74 20 32 20 69 73  er constant 2 is
29840 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 69   used for coveri
29850 6e 67 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ng.      **     
29860 69 6e 64 65 78 20 73 63 61 6e 73 20 73 6f 20 74  index scans so t
29870 68 61 74 20 61 20 63 6f 76 65 72 69 6e 67 20 69  hat a covering i
29880 6e 64 65 78 20 73 63 61 6e 20 77 69 6c 6c 20 62  ndex scan will b
29890 65 20 66 61 76 6f 72 65 64 20 6f 76 65 72 0a 20  e favored over. 
298a0 20 20 20 20 20 2a 2a 20 20 20 20 20 61 20 74 61       **     a ta
298b0 62 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  ble scan. */.   
298c0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
298d0 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 53 69  whereCostAdd(rSi
298e0 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20 31  ze,rLogSize) + 1
298f0 36 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  6;.      rc = wh
29900 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
29910 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
29920 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
29930 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
29940 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
29950 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
29960 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  & ~columnsInInde
29970 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20  x(pProbe);.     
29980 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
29990 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45   (m==0) ? (WHERE
299a0 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f  _IDX_ONLY|WHERE_
299b0 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45  INDEXED) : WHERE
299c0 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20 20 20  _INDEXED;..     
299d0 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76 69   /* Full scan vi
299e0 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  a index */.     
299f0 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c 7c   if( b.       ||
29a00 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20   ( m==0.        
29a10 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f   && pProbe->bUno
29a20 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
29a30 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
29a40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
29a50 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
29a60 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  D)==0.         &
29a70 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
29a80 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20  onfig.bUseCis.  
29a90 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
29aa0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57  zationEnabled(pW
29ab0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
29ac0 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64  , SQLITE_CoverId
29ad0 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20  xScan).         
29ae0 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20   ).      ){.    
29af0 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
29b00 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64  dx = b ? iSortId
29b10 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 70  x : 0;.        p
29b20 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
29b30 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  e;.        if( m
29b40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
29b50 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
29b60 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67 20 69   of a covering i
29b70 6e 64 65 78 20 73 63 61 6e 20 69 73 20 32 2a 28  ndex scan is 2*(
29b80 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20  N + log2(N))..  
29b90 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54          **  +  T
29ba0 68 65 20 65 78 74 72 61 20 32 20 66 61 63 74 6f  he extra 2 facto
29bb0 72 20 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67  r is to encourag
29bc0 65 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64  e the use of ind
29bd0 65 78 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20  exed lookups.   
29be0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 76         **     ov
29bf0 65 72 20 69 6e 64 65 78 20 73 63 61 6e 73 2e 20  er index scans. 
29c00 20 41 20 74 61 62 6c 65 20 73 63 61 6e 20 75 73   A table scan us
29c10 65 73 20 61 20 66 61 63 74 6f 72 20 6f 66 20 33  es a factor of 3
29c20 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   so that.       
29c30 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20     **     index 
29c40 73 63 61 6e 73 20 61 72 65 20 66 61 76 6f 72 65  scans are favore
29c50 64 20 6f 76 65 72 20 74 61 62 6c 65 20 73 63 61  d over table sca
29c60 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns..          **
29c70 20 20 2b 20 20 49 66 20 74 68 69 73 20 63 6f 76    +  If this cov
29c80 65 72 69 6e 67 20 69 6e 64 65 78 20 6d 69 67 68  ering index migh
29c90 74 20 61 6c 73 6f 20 68 65 6c 70 20 73 61 74 69  t also help sati
29ca0 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
29cb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
29cc0 20 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74    clause, then t
29cd0 68 65 20 63 6f 73 74 20 69 73 20 66 75 64 67 65  he cost is fudge
29ce0 64 20 64 6f 77 6e 20 73 6c 69 67 68 74 6c 79 20  d down slightly 
29cf0 73 6f 20 74 68 61 74 20 74 68 69 73 0a 20 20 20  so that this.   
29d00 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
29d10 64 65 78 20 69 73 20 66 61 76 6f 72 65 64 20 61  dex is favored a
29d20 62 6f 76 65 20 6f 74 68 65 72 20 69 6e 64 69 63  bove other indic
29d30 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 20  es that have no 
29d40 68 6f 70 65 20 6f 66 0a 20 20 20 20 20 20 20 20  hope of.        
29d50 20 20 2a 2a 20 20 20 20 20 68 65 6c 70 69 6e 67    **     helping
29d60 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
29d70 42 59 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  BY. */.         
29d80 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 31 30   pNew->rRun = 10
29d90 20 2b 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   + whereCostAdd(
29da0 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20  rSize,rLogSize) 
29db0 2d 20 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  - b;.        }el
29dc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
29dd0 73 65 72 74 28 20 62 21 3d 30 20 29 3b 20 0a 20  sert( b!=0 ); . 
29de0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
29df0 4e 47 3a 20 43 6f 73 74 20 6f 66 20 73 63 61 6e  NG: Cost of scan
29e00 6e 69 6e 67 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  ning a non-cover
29e10 69 6e 67 20 69 6e 64 65 78 20 69 73 20 28 4e 2b  ing index is (N+
29e20 31 29 2a 6c 6f 67 32 28 4e 29 0a 20 20 20 20 20  1)*log2(N).     
29e30 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 65       ** which we
29e40 20 77 69 6c 6c 20 73 69 6d 70 6c 69 66 79 20 74   will simplify t
29e50 6f 20 6a 75 73 74 20 4e 2a 6c 6f 67 32 28 4e 29  o just N*log2(N)
29e60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 4e   */.          pN
29e70 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
29e80 20 2b 20 72 4c 6f 67 53 69 7a 65 3b 0a 20 20 20   + rLogSize;.   
29e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
29ea0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
29eb0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
29ec0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
29ed0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
29ee0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
29ef0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
29f00 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
29f10 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
29f20 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  e, 0);..    /* I
29f30 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
29f40 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
29f50 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
29f60 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
29f70 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
29f80 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
29f90 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b  ->pIndex ) break
29fa0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
29fb0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
29fc0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
29fd0 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64  LTABLE./*.** Add
29fe0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
29ff0 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61 62  bjects for a tab
2a000 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69  le of the join i
2a010 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20  dentified by.** 
2a020 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
2a030 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
2a040 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
2a050 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  to be a virtual 
2a060 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
2a070 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2a080 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72  dVirtual(.  Wher
2a090 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2a0a0 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52  uilder,  /* WHER
2a0b0 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
2a0c0 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
2a0d0 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
2a0e0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
2a0f0 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f  prerequesites fo
2a100 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62  r using this tab
2a110 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  le */.){.  Where
2a120 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
2a130 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
2a140 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
2a150 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
2a160 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
2a170 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
2a180 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
2a190 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2a1a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a1b0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2a1c0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
2a1d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
2a1e0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
2a1f0 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
2a200 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20  arch */.  Table 
2a210 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
2a220 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *db;.  sqlite3_
2a230 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
2a240 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  Info;.  struct s
2a250 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
2a260 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
2a270 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
2a280 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
2a290 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
2a2a0 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
2a2b0 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pTerm;.  int i,
2a2c0 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   j;.  int iTerm,
2a2d0 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   mxTerm;.  int n
2a2e0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e  Constraint;.  in
2a2f0 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20  t seenIn = 0;   
2a300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a310 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72  ue if an IN oper
2a320 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a  ator is seen */.
2a330 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20    int seenVar = 
2a340 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2a350 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d  * True if a non-
2a360 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61  constant constra
2a370 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  int is seen */. 
2a380 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20   int iPhase;    
2a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a3a0 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e   0: const w/o IN
2a3b0 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e  , 1: const, 2: n
2a3c0 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a  o IN,  2: IN */.
2a3d0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
2a3e0 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
2a3f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e  LITE_OK;..  pWIn
2a400 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2a410 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20  WInfo;.  pParse 
2a420 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2a430 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
2a440 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  >db;.  pWC = pBu
2a450 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e  ilder->pWC;.  pN
2a460 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
2a470 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70  New;.  pSrc = &p
2a480 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2a490 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a  >a[pNew->iTab];.
2a4a0 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70    pTab = pSrc->p
2a4b0 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49  Tab;.  assert( I
2a4c0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
2a4d0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61  ;.  pIdxInfo = a
2a4e0 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
2a4f0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
2a500 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  rc, pBuilder->pO
2a510 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70  rderBy);.  if( p
2a520 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  IdxInfo==0 ) ret
2a530 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2a540 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  ;.  pNew->prereq
2a550 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53   = 0;.  pNew->rS
2a560 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
2a570 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
2a580 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
2a590 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2a5a0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
2a5b0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
2a5c0 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
2a5d0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
2a5e0 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74  tUsage;.  nConst
2a5f0 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
2a600 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
2a610 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
2a620 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e  size(db, pNew, n
2a630 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 20 72 65  Constraint) ) re
2a640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2a650 4d 3b 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65  M;..  for(iPhase
2a660 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69  =0; iPhase<=3; i
2a670 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66  Phase++){.    if
2a680 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50  ( !seenIn && (iP
2a690 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20  hase&1)!=0 ){.  
2a6a0 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20      iPhase++;.  
2a6b0 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e 33      if( iPhase>3
2a6c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
2a6d0 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61 72      if( !seenVar
2a6e0 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20 62   && iPhase>1 ) b
2a6f0 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f  reak;.    pIdxCo
2a700 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
2a710 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2a720 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
2a730 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
2a740 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2a750 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
2a760 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
2a770 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a  Cons++){.      j
2a780 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
2a790 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
2a7a0 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
2a7b0 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  j];.      switch
2a7c0 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20  ( iPhase ){.    
2a7d0 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f      case 0:    /
2a7e0 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  * Constants with
2a7f0 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  out IN operator 
2a800 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  */.          pId
2a810 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2a820 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
2a830 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2a840 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
2a850 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
2a860 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  enIn = 1;.      
2a870 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
2a880 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
2a890 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2a8a0 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a     seenVar = 1;.
2a8b0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2a8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
2a8d0 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2a8e0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
2a8f0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2a900 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
2a910 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20     /* Constants 
2a920 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f 72  with IN operator
2a930 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  s */.          a
2a940 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29 3b  ssert( seenIn );
2a950 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43  .          pIdxC
2a960 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
2a970 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
2a980 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t==0);.         
2a990 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2a9a0 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56 61  case 2:    /* Va
2a9b0 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20  riables without 
2a9c0 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
2a9d0 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
2a9e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
2a9f0 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2aa00 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2aa10 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20  r & WO_IN)==0;. 
2aa20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2aa30 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
2aa40 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20     /* Variables 
2aa50 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20  with IN */.     
2aa60 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
2aa70 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20 29  nVar && seenIn )
2aa80 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
2aa90 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31  Cons->usable = 1
2aaa0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2aab0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2aac0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73 61  .    memset(pUsa
2aad0 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55  ge, 0, sizeof(pU
2aae0 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66  sage[0])*pIdxInf
2aaf0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  o->nConstraint);
2ab00 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
2ab10 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2ab20 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72  Str ) sqlite3_fr
2ab30 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
2ab40 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49 6e  Str);.    pIdxIn
2ab50 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a  fo->idxStr = 0;.
2ab60 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
2ab70 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49  xNum = 0;.    pI
2ab80 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
2ab90 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
2aba0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
2abb0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
2abc0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
2abd0 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53  stimatedCost = S
2abe0 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20  QLITE_BIG_DBL / 
2abf0 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20 72  (double)2;.    r
2ac00 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65  c = vtabBestInde
2ac10 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  x(pParse, pTab, 
2ac20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pIdxInfo);.    i
2ac30 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65  f( rc ) goto whe
2ac40 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
2ac50 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  it;.    pIdxCons
2ac60 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
2ac70 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
2ac80 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
2ac90 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
2aca0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
2acb0 3d 20 30 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20  = 0;.    mxTerm 
2acc0 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
2acd0 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d  ( pNew->nLSlot>=
2ace0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20  nConstraint );. 
2acf0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
2ad00 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20  onstraint; i++) 
2ad10 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20  pNew->aLTerm[i] 
2ad20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  = 0;.    pNew->u
2ad30 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d  .vtab.omitMask =
2ad40 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
2ad50 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
2ad60 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
2ad70 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54 65  {.      if( (iTe
2ad80 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61  rm = pUsage[i].a
2ad90 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30  rgvIndex - 1)>=0
2ada0 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   ){.        j = 
2adb0 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
2adc0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
2add0 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74  f( iTerm>=nConst
2ade0 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20 7c  raint.         |
2adf0 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  | j<0.         |
2ae00 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a  | j>=pWC->nTerm.
2ae10 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77           || pNew
2ae20 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21  ->aLTerm[iTerm]!
2ae30 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
2ae40 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2ae50 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
2ae60 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2ae70 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
2ae80 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 61  .xBestIndex() ma
2ae90 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62  lfunction", pTab
2aea0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2aeb0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f      goto whereLo
2aec0 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
2aed0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2aee0 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
2aef0 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e  a[j];.        pN
2af00 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54  ew->prereq |= pT
2af10 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
2af20 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2af30 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c  ( iTerm<pNew->nL
2af40 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Slot );.        
2af50 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65  pNew->aLTerm[iTe
2af60 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  rm] = pTerm;.   
2af70 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d       if( iTerm>m
2af80 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d  xTerm ) mxTerm =
2af90 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   iTerm;.        
2afa0 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20  if( iTerm<16 && 
2afb0 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29  pUsage[i].omit )
2afc0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
2afd0 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65  itMask |= 1<<iTe
2afe0 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
2aff0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2b000 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
2b010 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2b020 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30  Usage[i].omit==0
2b030 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b040 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  /* Do not attemp
2b050 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63  t to use an IN c
2b060 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68 65  onstraint if the
2b070 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20   virtual table. 
2b080 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61             ** sa
2b090 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75 69  ys that the equi
2b0a0 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72  valent EQ constr
2b0b0 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73  aint cannot be s
2b0c0 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20  afely omitted.. 
2b0d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66             ** If
2b0e0 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74   we do attempt t
2b0f0 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e  o use such a con
2b100 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f  straint, some ro
2b110 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20  ws might be.    
2b120 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61          ** repea
2b130 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ted in the outpu
2b140 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
2b150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2b160 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
2b170 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * A virtual tabl
2b180 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  e that is constr
2b190 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63  ained by an IN c
2b1a0 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20  lause may not.  
2b1b0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75          ** consu
2b1c0 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  me the ORDER BY 
2b1d0 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28  clause because (
2b1e0 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  1) the order of 
2b1f0 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20  IN terms.       
2b200 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63     ** is not nec
2b210 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64  essarily related
2b220 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66   to the order of
2b230 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e   output terms an
2b240 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28  d.          ** (
2b250 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70  2) Multiple outp
2b260 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  uts from a singl
2b270 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20  e IN value will 
2b280 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20  not merge.      
2b290 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e      ** together.
2b2a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
2b2b0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2b2c0 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
2b2d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2b2e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
2b2f0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a  =nConstraint ){.
2b300 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
2b310 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20  rm = mxTerm+1;. 
2b320 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
2b330 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d  w->nLTerm<=pNew-
2b340 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
2b350 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
2b360 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
2b370 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70  >idxNum;.      p
2b380 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2b390 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Free = pIdxInfo-
2b3a0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2b3b0 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  r;.      pIdxInf
2b3c0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2b3d0 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Str = 0;.      p
2b3e0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
2b3f0 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  tr = pIdxInfo->i
2b400 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65  dxStr;.      pNe
2b410 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
2b420 72 65 64 20 3d 20 28 75 38 29 28 28 70 49 64 78  red = (u8)((pIdx
2b430 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21 3d  Info->nOrderBy!=
2b440 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
2b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b460 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 49          && pIdxI
2b470 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
2b480 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70 4e 65  umed);.      pNe
2b490 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2b4a0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2b4b0 3d 20 77 68 65 72 65 43 6f 73 74 46 72 6f 6d 44  = whereCostFromD
2b4c0 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e  ouble(pIdxInfo->
2b4d0 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
2b4e0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2b4f0 20 45 76 65 72 79 20 76 69 72 74 75 61 6c 20 74   Every virtual t
2b500 61 62 6c 65 20 71 75 65 72 79 20 72 65 74 75 72  able query retur
2b510 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
2b520 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2b530 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36   46;  assert( 46
2b540 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29 20  ==whereCost(25) 
2b550 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
2b560 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2b570 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2b580 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  if( pNew->u.vtab
2b590 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
2b5a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2b5b0 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69  e(pNew->u.vtab.i
2b5c0 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
2b5d0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2b5e0 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
2b5f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a   }.    }.  }  ..
2b600 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
2b610 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49 64  _exit:.  if( pId
2b620 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2b630 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
2b640 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
2b650 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
2b660 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
2b670 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  dxInfo);.  retur
2b680 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
2b690 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
2b6a0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
2b6b0 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
2b6c0 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
2b6d0 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
2b6e0 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
2b6f0 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
2b700 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
2b710 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2b720 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
2b730 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2b740 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74 6d   *pBuilder, Bitm
2b750 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20 57  ask mExtra){.  W
2b760 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2b770 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
2b780 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  nfo;.  WhereClau
2b790 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
2b7a0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68  Loop *pNew;.  Wh
2b7b0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
2b7c0 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72  *pWCEnd;.  int r
2b7d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2b7e0 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65   int iCur;.  Whe
2b7f0 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
2b800 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2b810 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20  der sSubBuild;. 
2b820 20 57 68 65 72 65 4c 6f 6f 70 20 73 42 65 73 74   WhereLoop sBest
2b830 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
2b840 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2b850 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c    .  pWC = pBuil
2b860 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20  der->pWC;.  if( 
2b870 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2b880 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f  gs & WHERE_AND_O
2b890 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c  NLY ) return SQL
2b8a0 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64  ITE_OK;.  pWCEnd
2b8b0 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
2b8c0 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d  >nTerm;.  pNew =
2b8d0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2b8e0 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ..  for(pTerm=pW
2b8f0 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
2b900 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  nd && rc==SQLITE
2b910 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  _OK; pTerm++){. 
2b920 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
2b930 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
2b940 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
2b950 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
2b960 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77  indexable & pNew
2b970 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a  ->maskSelf)!=0 .
2b980 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65      ){.      Whe
2b990 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74  reClause * const
2b9a0 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d   pOrWC = &pTerm-
2b9b0 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
2b9c0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
2b9d0 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64  * const pOrWCEnd
2b9e0 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72   = &pOrWC->a[pOr
2b9f0 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20  WC->nTerm];.    
2ba00 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
2ba10 54 65 72 6d 3b 0a 20 20 20 20 20 20 57 68 65 72  Term;.      Wher
2ba20 65 43 6f 73 74 20 72 54 6f 74 61 6c 20 3d 20 30  eCost rTotal = 0
2ba30 3b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6f 73  ;.      WhereCos
2ba40 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  t nRow = 0;.    
2ba50 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
2ba60 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 0a   = mExtra;.    .
2ba70 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49        whereLoopI
2ba80 6e 69 74 28 26 73 42 65 73 74 29 3b 0a 20 20 20  nit(&sBest);.   
2ba90 20 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66     pItem = pWInf
2baa0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
2bab0 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 20   pNew->iTab;.   
2bac0 20 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d     iCur = pItem-
2bad0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
2bae0 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75  sSubBuild = *pBu
2baf0 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75  ilder;.      sSu
2bb00 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20  bBuild.pOrderBy 
2bb10 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42  = 0;.      sSubB
2bb20 75 69 6c 64 2e 70 42 65 73 74 20 3d 20 26 73 42  uild.pBest = &sB
2bb30 65 73 74 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  est;..      for(
2bb40 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61  pOrTerm=pOrWC->a
2bb50 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
2bb60 26 26 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43  && pOrTerm<pOrWC
2bb70 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  End; pOrTerm++){
2bb80 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
2bb90 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
2bba0 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b   & WO_AND)!=0 ){
2bbb0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42  .          sSubB
2bbc0 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54  uild.pWC = &pOrT
2bbd0 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d  erm->u.pAndInfo-
2bbe0 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  >wc;.        }el
2bbf0 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
2bc00 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
2bc10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
2bc20 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57  mpWC.pWInfo = pW
2bc30 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20  C->pWInfo;.     
2bc40 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74       tempWC.pOut
2bc50 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20  er = pWC;.      
2bc60 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20      tempWC.op = 
2bc70 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  TK_AND;.        
2bc80 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d    tempWC.nTerm =
2bc90 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   1;.          te
2bca0 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d  mpWC.a = pOrTerm
2bcb0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  ;.          sSub
2bcc0 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d  Build.pWC = &tem
2bcd0 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  pWC;.        }el
2bce0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  se{.          co
2bcf0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2bd00 7d 0a 20 20 20 20 20 20 20 20 73 42 65 73 74 2e  }.        sBest.
2bd10 6d 61 73 6b 53 65 6c 66 20 3d 20 30 3b 0a 20 20  maskSelf = 0;.  
2bd20 20 20 20 20 20 20 73 42 65 73 74 2e 72 53 65 74        sBest.rSet
2bd30 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  up = 0;.        
2bd40 73 42 65 73 74 2e 72 52 75 6e 20 3d 20 30 3b 0a  sBest.rRun = 0;.
2bd50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2bd60 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2bd70 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
2bd80 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
2bd90 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
2bda0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2bdb0 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42  ddVirtual(&sSubB
2bdc0 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
2bdd0 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
2bde0 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
2bdf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2be00 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26  reLoopAddBtree(&
2be10 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72  sSubBuild, mExtr
2be20 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a);.        }.  
2be30 20 20 20 20 20 20 69 66 28 20 73 42 65 73 74 2e        if( sBest.
2be40 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 29 20 62 72  maskSelf==0 ) br
2be50 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eak;.        ass
2be60 65 72 74 28 20 73 42 65 73 74 2e 72 53 65 74 75  ert( sBest.rSetu
2be70 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  p==0 );.        
2be80 72 54 6f 74 61 6c 20 3d 20 77 68 65 72 65 43 6f  rTotal = whereCo
2be90 73 74 41 64 64 28 72 54 6f 74 61 6c 2c 20 73 42  stAdd(rTotal, sB
2bea0 65 73 74 2e 72 52 75 6e 29 3b 0a 20 20 20 20 20  est.rRun);.     
2beb0 20 20 20 6e 52 6f 77 20 3d 20 77 68 65 72 65 43     nRow = whereC
2bec0 6f 73 74 41 64 64 28 6e 52 6f 77 2c 20 73 42 65  ostAdd(nRow, sBe
2bed0 73 74 2e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  st.nOut);.      
2bee0 20 20 70 72 65 72 65 71 20 7c 3d 20 73 42 65 73    prereq |= sBes
2bef0 74 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20  t.prereq;.      
2bf00 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2bf10 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 31 20  pNew->nLSlot>=1 
2bf20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 42 65  );.      if( sBe
2bf30 73 74 2e 6d 61 73 6b 53 65 6c 66 20 29 7b 0a 20  st.maskSelf ){. 
2bf40 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
2bf50 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
2bf60 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
2bf70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
2bf80 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2bf90 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
2bfa0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2bfb0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
2bfc0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2bfd0 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20   rTotal;.       
2bfe0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52   pNew->nOut = nR
2bff0 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ow;.        pNew
2c000 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72 65  ->prereq = prere
2c010 71 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  q;.        memse
2c020 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73  t(&pNew->u, 0, s
2c030 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b  izeof(pNew->u));
2c040 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
2c050 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2c060 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2c070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 65       }.      whe
2c080 72 65 4c 6f 6f 70 43 6c 65 61 72 28 70 57 49 6e  reLoopClear(pWIn
2c090 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  fo->pParse->db, 
2c0a0 26 73 42 65 73 74 29 3b 0a 20 20 20 20 7d 0a 20  &sBest);.    }. 
2c0b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c0c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
2c0d0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2c0e0 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ts for all table
2c0f0 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s .*/.static int
2c100 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c   whereLoopAddAll
2c110 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
2c120 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
2c130 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2c140 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2c150 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20  Info;.  Bitmask 
2c160 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69  mExtra = 0;.  Bi
2c170 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30  tmask mPrior = 0
2c180 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
2c190 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2c1a0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
2c1b0 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
2c1c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2c1d0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
2c1e0 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
2c1f0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54  se->db;.  int nT
2c200 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
2c210 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72  >nLevel;.  int r
2c220 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c230 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70   u8 priorJoinTyp
2c240 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f  e = 0;.  WhereLo
2c250 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20  op *pNew;..  /* 
2c260 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61  Loop over the ta
2c270 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
2c280 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
2c290 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d  ight */.  pNew =
2c2a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2c2b0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
2c2c0 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54  (pNew);.  for(iT
2c2d0 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62  ab=0, pItem=pTab
2c2e0 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54  List->a; iTab<nT
2c2f0 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20  abList; iTab++, 
2c300 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e  pItem++){.    pN
2c310 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b  ew->iTab = iTab;
2c320 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  .    pNew->maskS
2c330 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70  elf = getMask(&p
2c340 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
2c350 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
2c360 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65  ;.    if( ((pIte
2c370 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f  m->jointype|prio
2c380 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28 4a 54  rJoinType) & (JT
2c390 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
2c3a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78  !=0 ){.      mEx
2c3b0 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20  tra = mPrior;.  
2c3c0 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69    }.    priorJoi
2c3d0 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a  nType = pItem->j
2c3e0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28  ointype;.    if(
2c3f0 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
2c400 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
2c410 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2c420 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64  ddVirtual(pBuild
2c430 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
2c440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2c450 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
2c460 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  tree(pBuilder, m
2c470 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
2c480 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c490 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2c4a0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
2c4b0 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
2c4c0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50  a);.    }.    mP
2c4d0 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61  rior |= pNew->ma
2c4e0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20  skSelf;.    if( 
2c4f0 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rc || db->malloc
2c500 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
2c510 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43    }.  whereLoopC
2c520 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lear(db, pNew);.
2c530 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c540 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20  /*.** Examine a 
2c550 57 68 65 72 65 50 61 74 68 20 28 77 69 74 68 20  WherePath (with 
2c560 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
2c570 74 68 65 20 65 78 74 72 61 20 57 68 65 72 65 4c  the extra WhereL
2c580 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a 2a  oop of the 5th.*
2c590 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f  * parameters) to
2c5a0 20 73 65 65 20 69 66 20 69 74 20 6f 75 74 70 75   see if it outpu
2c5b0 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72  ts rows in the r
2c5c0 65 71 75 65 73 74 65 64 20 4f 52 44 45 52 20 42  equested ORDER B
2c5d0 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42  Y.** (or GROUP B
2c5e0 59 29 20 77 69 74 68 6f 75 74 20 72 65 71 75 69  Y) without requi
2c5f0 72 69 6e 67 20 61 20 73 65 70 61 72 61 74 65 20  ring a separate 
2c600 73 6f 75 72 63 65 20 6f 70 65 72 61 74 69 6f 6e  source operation
2c610 2e 20 20 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a 2a  .  Return:.** .*
2c620 2a 20 20 20 20 30 3a 20 20 4f 52 44 45 52 20 42  *    0:  ORDER B
2c630 59 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69  Y is not satisfi
2c640 65 64 2e 20 20 53 6f 72 74 69 6e 67 20 72 65 71  ed.  Sorting req
2c650 75 69 72 65 64 0a 2a 2a 20 20 20 20 31 3a 20 20  uired.**    1:  
2c660 4f 52 44 45 52 20 42 59 20 69 73 20 73 61 74 69  ORDER BY is sati
2c670 73 66 69 65 64 2e 20 20 20 20 20 20 4f 6d 69 74  sfied.      Omit
2c680 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 20 20 2d 31   sorting.**   -1
2c690 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61 74 20 74 68  :  Unknown at th
2c6a0 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2f 0a 73 74  is time.**.*/.st
2c6b0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61  atic int wherePa
2c6c0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
2c6d0 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
2c6e0 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
2c6f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2c700 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2c710 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
2c720 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
2c730 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
2c740 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
2c750 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
2c760 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
2c770 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
2c780 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
2c790 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
2c7a0 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  * Might contain 
2c7b0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72  WHERE_GROUPBY or
2c7c0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
2c7d0 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70  Y */.  u16 nLoop
2c7e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2c7f0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
2c800 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  s in pPath->aLoo
2c810 70 5b 5d 20 2a 2f 0a 20 20 75 38 20 69 73 4c 61  p[] */.  u8 isLa
2c820 73 74 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 2f  stLoop,        /
2c830 2a 20 54 72 75 65 20 69 66 20 70 4c 61 73 74 20  * True if pLast 
2c840 69 73 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  is the inner-mos
2c850 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72  t loop */.  Wher
2c860 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20  eLoop *pLast,   
2c870 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68    /* Add this Wh
2c880 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65  ereLoop to the e
2c890 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f  nd of pPath->aLo
2c8a0 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  op[] */.  Bitmas
2c8b0 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20  k *pRevMask     
2c8c0 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
2c8d0 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75  WhereLoops to ru
2c8e0 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
2c8f0 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65  er */.){.  u8 re
2c900 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  vSet;           
2c910 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20   /* True if rev 
2c920 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38  is known */.  u8
2c930 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
2c940 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65      /* Composite
2c950 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
2c960 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20   u8 revIdx;     
2c970 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2c980 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
2c990 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  u8 isOrderDistin
2c9a0 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69  ct;   /* All pri
2c9b0 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72  or WhereLoops ar
2c9c0 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
2c9d0 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63   */.  u8 distinc
2c9e0 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54  tColumns;   /* T
2c9f0 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20  rue if the loop 
2ca00 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  has UNIQUE NOT N
2ca10 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
2ca20 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20   u8 isMatch;    
2ca30 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d         /* iColum
2ca40 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d  n matches a term
2ca50 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
2ca60 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
2ca70 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   nColumn;       
2ca80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ca90 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65  columns in pInde
2caa0 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65  x */.  u16 nOrde
2cab0 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
2cac0 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20  Number terms in 
2cad0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2cae0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  use */.  int iLo
2caf0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  op;            /
2cb00 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65  * Index of Where
2cb10 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65  Loop in pPath be
2cb20 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  ing processed */
2cb30 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
2cb40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2cb50 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
2cb60 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
2cb70 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
2cb80 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e  umber for curren
2cb90 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20  t WhereLoop */. 
2cba0 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
2cbb0 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75         /* A colu
2cbc0 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e  mn number within
2cbd0 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20   table iCur */. 
2cbe0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
2cbf0 70 3b 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  p;     /* Curren
2cc00 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e  t WhereLoop bein
2cc10 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a  g processed. */.
2cc20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2cc30 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e  rm;     /* A sin
2cc40 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
2cc50 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2cc60 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b    Expr *pOBExpr;
2cc70 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
2cc80 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
2cc90 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2cca0 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e */.  CollSeq *
2ccb0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20  pColl;       /* 
2ccc0 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e  COLLATE function
2ccd0 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42   from an ORDER B
2cce0 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  Y clause term */
2ccf0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
2cd00 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
2cd10 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
2cd20 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20   with pLoop */. 
2cd30 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2cd40 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
2cd50 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  b;  /* Database 
2cd60 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
2cd70 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20  Bitmask obSat = 
2cd80 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  0;    /* Mask of
2cd90 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
2cda0 73 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72  satisfied so far
2cdb0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
2cdc0 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Done;       /* M
2cdd0 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52  ask of all ORDER
2cde0 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42   BY terms */.  B
2cdf0 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74  itmask orderDist
2ce00 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61  inctMask;  /* Ma
2ce10 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f  sk of all well-o
2ce20 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a  rdered loops */.
2ce30 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b    Bitmask ready;
2ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ce50 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c   Mask of inner l
2ce60 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  oops */..  /*.  
2ce70 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
2ce80 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d  ereLoop is "one-
2ce90 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72  row" if it gener
2cea0 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  ates no more tha
2ceb0 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f  n one.  ** row o
2cec0 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65  f output.  A Whe
2ced0 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f  reLoop is one-ro
2cee0 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  w if all of the 
2cef0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
2cf00 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c  ue:.  **  (a) Al
2cf10 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
2cf20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45  match with WHERE
2cf30 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a  _COLUMN_EQ..  **
2cf40 20 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20    (b) The index 
2cf50 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41  is unique.  ** A
2cf60 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74  ny WhereLoop wit
2cf70 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d  h an WHERE_COLUM
2cf80 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  N_EQ constraint 
2cf90 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20  on the rowid is 
2cfa0 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76  one-row..  ** Ev
2cfb0 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72  ery one-row Wher
2cfc0 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20  eLoop will have 
2cfd0 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  the WHERE_ONEROW
2cfe0 20 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c   bit set in wsFl
2cff0 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ags..  **.  ** W
2d000 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
2d010 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69  oop is "order-di
2d020 73 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73  stinct" if the s
2d030 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72  et of columns fr
2d040 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65  om.  ** that Whe
2d050 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20  reLoop that are 
2d060 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
2d070 63 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65  clause are diffe
2d080 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20  rent for every. 
2d090 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57   ** row of the W
2d0a0 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79  hereLoop.  Every
2d0b0 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
2d0c0 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  op is automatica
2d0d0 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64  lly.  ** order-d
2d0e0 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65  istinct.   A Whe
2d0f0 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20  reLoop that has 
2d100 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  no columns in th
2d110 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2d120 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72  e.  ** is not or
2d130 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f  der-distinct. To
2d140 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
2d150 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20  ct is not quite 
2d160 74 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e  the same as bein
2d170 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69  g.  ** UNIQUE si
2d180 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c  nce a UNIQUE col
2d190 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  umn or index can
2d1a0 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72   have multiple r
2d1b0 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61  ows that .  ** a
2d1c0 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c  re NULL and NULL
2d1d0 20 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69   values are equi
2d1e0 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70  valent for the p
2d1f0 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d  urpose of order-
2d200 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54  distinct..  ** T
2d210 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69  o be order-disti
2d220 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73  nct, the columns
2d230 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20   must be UNIQUE 
2d240 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20  and NOT NULL..  
2d250 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  **.  ** The rowi
2d260 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73  d for a table is
2d270 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61   always UNIQUE a
2d280 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77  nd NOT NULL so w
2d290 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a  henever the.  **
2d2a0 20 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69   rowid appears i
2d2b0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
2d2c0 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65  lause, the corre
2d2d0 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f  sponding WhereLo
2d2e0 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d  op is.  ** autom
2d2f0 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64  atically order-d
2d300 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20  istinct..  */.. 
2d310 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
2d320 79 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f  y!=0 );..  /* So
2d330 72 74 61 62 69 6c 69 74 79 20 6f 66 20 76 69 72  rtability of vir
2d340 74 75 61 6c 20 74 61 62 6c 65 73 20 69 73 20 64  tual tables is d
2d350 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
2d360 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
2d370 6f 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 76  od.  ** of the v
2d380 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 74 73  irtual table its
2d390 65 6c 66 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61  elf */.  if( pLa
2d3a0 73 74 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  st->wsFlags & WH
2d3b0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2d3c0 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
2d3d0 28 20 6e 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a  ( nLoop>0 );  /*
2d3e0 20 54 72 75 65 20 77 68 65 6e 20 6f 75 74 65 72   True when outer
2d3f0 20 6c 6f 6f 70 73 20 61 72 65 20 6f 6e 65 2d 72   loops are one-r
2d400 6f 77 20 61 6e 64 20 6d 61 74 63 68 20 0a 20 20  ow and match .  
2d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d420 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 20 4f 52          ** no OR
2d430 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
2d440 20 20 20 20 72 65 74 75 72 6e 20 70 4c 61 73 74      return pLast
2d450 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
2d460 65 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c  ed;.  }.  if( nL
2d470 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  oop && Optimizat
2d480 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
2d490 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64  SQLITE_OrderById
2d4a0 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  xJoin) ) return 
2d4b0 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d  0;..  nOrderBy =
2d4c0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
2d4d0 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79  ;.  if( nOrderBy
2d4e0 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20  >BMS-1 ) return 
2d4f0 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70  0;  /* Cannot op
2d500 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61  timize overly la
2d510 72 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f  rge ORDER BYs */
2d520 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  .  isOrderDistin
2d530 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65  ct = 1;.  obDone
2d540 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65   = MASKBIT(nOrde
2d550 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44  rBy)-1;.  orderD
2d560 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b  istinctMask = 0;
2d570 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20  .  ready = 0;.  
2d580 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f  for(iLoop=0; isO
2d590 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20  rderDistinct && 
2d5a0 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20  obSat<obDone && 
2d5b0 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c  iLoop<=nLoop; iL
2d5c0 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  oop++){.    if( 
2d5d0 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20  iLoop>0 ) ready 
2d5e0 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
2d5f0 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  lf;.    pLoop = 
2d600 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50  iLoop<nLoop ? pP
2d610 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  ath->aLoop[iLoop
2d620 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 61  ] : pLast;.    a
2d630 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
2d640 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2d650 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
2d660 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57  );.    iCur = pW
2d670 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
2d680 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69  a[pLoop->iTab].i
2d690 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20  Cursor;..    /* 
2d6a0 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44  Mark off any ORD
2d6b0 45 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61  ER BY term X tha
2d6c0 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
2d6d0 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20   the table of.  
2d6e0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
2d6f0 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20   loop for which 
2d700 74 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e  there is term in
2d710 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a   the WHERE.    *
2d720 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
2d730 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f  form X IS NULL o
2d740 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72  r X=? that refer
2d750 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a  ence only outer.
2d760 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20      ** loops..  
2d770 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
2d780 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
2d790 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41  +){.      if( MA
2d7a0 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
2d7b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d7c0 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
2d7d0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2d7e0 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
2d7f0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
2d800 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
2d810 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
2d820 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
2d830 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
2d840 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
2d850 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  ue;.      pTerm 
2d860 3d 20 66 69 6e 64 54 65 72 6d 28 26 70 57 49 6e  = findTerm(&pWIn
2d870 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70  fo->sWC, iCur, p
2d880 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c  OBExpr->iColumn,
2d890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d8a0 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20          ~ready, 
2d8b0 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c  WO_EQ|WO_ISNULL,
2d8c0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
2d8d0 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Term==0 ) contin
2d8e0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ue;.      if( pO
2d8f0 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  BExpr->iColumn>=
2d900 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
2d910 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a 32  st char *z1, *z2
2d920 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
2d930 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2d940 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lSeq(pWInfo->pPa
2d950 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
2d960 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
2d970 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2d980 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
2d990 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
2d9a0 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  z1 = pColl->zNam
2d9b0 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  e;.        pColl
2d9c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2d9d0 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
2d9e0 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
2d9f0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
2da00 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
2da10 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
2da20 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 43  .        z2 = pC
2da30 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
2da40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
2da50 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21 3d  trICmp(z1, z2)!=
2da60 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2da70 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61      }.      obSa
2da80 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
2da90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2daa0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2dab0 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
2dac0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2dad0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2dae0 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20   WHERE_IPK ){.  
2daf0 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30        pIndex = 0
2db00 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d  ;.        nColum
2db10 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  n = 0;.      }el
2db20 73 65 20 69 66 28 20 28 70 49 6e 64 65 78 20 3d  se if( (pIndex =
2db30 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2db40 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49  pIndex)==0 || pI
2db50 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
2db60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2db70 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
2db80 65 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  e{.        nColu
2db90 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  mn = pIndex->nCo
2dba0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 73  lumn;.        is
2dbb0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2dbc0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
2dbd0 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20 20 20 20  =OE_None;.      
2dbe0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  }..      /* For 
2dbf0 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
2dc00 65 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e index that is 
2dc10 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d  constrained by =
2dc20 3d 20 6f 72 20 49 53 20 4e 55 4c 4c 2c 0a 20 20  = or IS NULL,.  
2dc30 20 20 20 20 2a 2a 20 6d 61 72 6b 20 6f 66 66 20      ** mark off 
2dc40 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 4f 52  corresponding OR
2dc50 44 45 52 20 42 59 20 74 65 72 6d 73 20 77 68 65  DER BY terms whe
2dc60 72 65 76 65 72 20 74 68 65 79 20 6f 63 63 75 72  rever they occur
2dc70 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
2dc80 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2dc90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2dca0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 6f 6f   for(i=0; i<pLoo
2dcb0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20  p->u.btree.nEq; 
2dcc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  i++){.        pT
2dcd0 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
2dce0 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  erm[i];.        
2dcf0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2dd00 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
2dd10 4f 5f 49 53 4e 55 4c 4c 29 29 3d 3d 30 20 29 20  O_ISNULL))==0 ) 
2dd20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2dd30 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72    iColumn = pTer
2dd40 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
2dd50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
2dd60 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b  ; j<nOrderBy; j+
2dd70 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2dd80 28 20 4d 41 53 4b 42 49 54 28 6a 29 20 26 20 6f  ( MASKBIT(j) & o
2dd90 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
2dda0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78  .          pOBEx
2ddb0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2ddc0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
2ddd0 65 72 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  erBy->a[j].pExpr
2dde0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2ddf0 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
2de00 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
2de10 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
2de20 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
2de30 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
2de40 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
2de50 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  ( pOBExpr->iColu
2de60 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  mn!=iColumn ) co
2de70 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2de80 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30    if( iColumn>=0
2de90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dea0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2deb0 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
2dec0 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
2ded0 72 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  rBy->a[j].pExpr)
2dee0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2def0 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
2df00 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
2df10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2df20 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2df30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
2df40 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
2df50 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2df60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2df70 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
2df80 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20  MASKBIT(j);.    
2df90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2dfa0 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20  ( obSat==obDone 
2dfb0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
2dfc0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f    }..      /* Lo
2dfd0 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63  op through all c
2dfe0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
2dff0 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74  dex and deal wit
2e000 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20  h the ones.     
2e010 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74   ** that are not
2e020 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
2e030 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20  == or IN..      
2e040 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72  */.      rev = r
2e050 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  evSet = 0;.     
2e060 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
2e070 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
2e080 6a 3d 30 3b 20 6a 3c 3d 6e 43 6f 6c 75 6d 6e 3b  j=0; j<=nColumn;
2e090 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   j++){.        u
2e0a0 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72  8 bOnce;   /* Tr
2e0b0 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52  ue to run the OR
2e0c0 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f  DER BY search lo
2e0d0 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  op */..        /
2e0e0 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61  * Skip over == a
2e0f0 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73  nd IS NULL terms
2e100 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2e110 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
2e120 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
2e130 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c   ((i = pLoop->aL
2e140 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74  Term[j]->eOperat
2e150 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  or) & (WO_EQ|WO_
2e160 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20  ISNULL))!=0.    
2e170 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2e180 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53 4e 55   if( i & WO_ISNU
2e190 4c 4c 20 29 20 69 73 4f 72 64 65 72 44 69 73 74  LL ) isOrderDist
2e1a0 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
2e1b0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a      continue;  .
2e1c0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2e1d0 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f     /* Get the co
2e1e0 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74  lumn number in t
2e1f0 68 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d  he table (iColum
2e200 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65  n) and sort orde
2e210 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65  r.        ** (re
2e220 76 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d  vIdx) for the j-
2e230 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
2e240 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
2e250 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  */.        if( j
2e260 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  <nColumn ){.    
2e270 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20        /* Normal 
2e280 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f  index columns */
2e290 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
2e2a0 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
2e2b0 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
2e2c0 20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e      revIdx = pIn
2e2d0 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
2e2e0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j];.          if
2e2f0 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65  ( iColumn==pInde
2e300 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  x->pTable->iPKey
2e310 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b   ) iColumn = -1;
2e320 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2e330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2e340 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 61 74   ROWID column at
2e350 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20   the end */.    
2e360 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
2e370 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  -1;.          re
2e380 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  vIdx = 0;.      
2e390 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2e3a0 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  An unconstrained
2e3b0 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67   column that mig
2e3c0 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73  ht be NULL means
2e3d0 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20   that this.     
2e3e0 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20     ** WhereLoop 
2e3f0 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65  is not well-orde
2e400 72 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  red .        */.
2e410 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
2e420 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20  derDistinct.    
2e430 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e       && iColumn>
2e440 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a  =0.         && j
2e450 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  >=pLoop->u.btree
2e460 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
2e470 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
2e480 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e  >aCol[iColumn].n
2e490 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20  otNull==0.      
2e4a0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2e4b0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2e4c0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
2e4d0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74         /* Find t
2e4e0 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
2e4f0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
2e500 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f  s to the j-th co
2e510 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  lumn.        ** 
2e520 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
2e530 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f   and mark that O
2e540 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66  RDER BY term off
2e550 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
2e560 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a       bOnce = 1;.
2e570 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
2e580 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
2e590 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69  (i=0; bOnce && i
2e5a0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
2e5b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d  .          if( M
2e5c0 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
2e5d0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
2e5e0 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72 20          pOBExpr 
2e5f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2e600 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
2e610 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2e620 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
2e630 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
2e640 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
2e650 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
2e660 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
2e670 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
2e680 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
2e690 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
2e6a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
2e6b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
2e6c0 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
2e6d0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
2e6e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
2e6f0 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
2e700 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2e710 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20   iColumn>=0 ){. 
2e720 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
2e730 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2e740 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
2e750 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
2e760 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
2e770 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
2e780 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
2e790 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2e7a0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2e7b0 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
2e7c0 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  l->zName, pIndex
2e7d0 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20  ->azColl[j])!=0 
2e7e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2e7f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e800 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20    isMatch = 1;. 
2e810 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2e820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e830 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
2e840 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2e850 43 6f 6c 75 6d 6e 3c 30 20 29 20 64 69 73 74 69  Column<0 ) disti
2e860 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a  nctColumns = 1;.
2e870 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
2e880 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
2e890 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57           if( (pW
2e8a0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2e8b0 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
2e8c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2e8d0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
2e8e0 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20   the sort order 
2e8f0 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e  is compatible in
2e900 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2e910 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20  use..           
2e920 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69   ** Sort order i
2e930 73 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72  s irrelevant for
2e940 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
2e950 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
2e960 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b     if( revSet ){
2e970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2e980 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78  f( (rev ^ revIdx
2e990 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  )!=pOrderBy->a[i
2e9a0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65  ].sortOrder ) re
2e9b0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
2e9c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e9d0 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72           rev = r
2e9e0 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79  evIdx ^ pOrderBy
2e9f0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2ea00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ea10 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d  if( rev ) *pRevM
2ea20 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  ask |= MASKBIT(i
2ea30 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Loop);.         
2ea40 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b       revSet = 1;
2ea50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2ea60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ea70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ea80 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20      /* No match 
2ea90 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
2eaa0 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a     if( j==0 || j
2eab0 3c 6e 43 6f 6c 75 6d 6e 20 29 20 69 73 4f 72 64  <nColumn ) isOrd
2eac0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
2ead0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2eae0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2eaf0 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f   } /* end Loop o
2eb00 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f  ver all index co
2eb10 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69  lumns */.      i
2eb20 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  f( distinctColum
2eb30 6e 73 20 29 20 69 73 4f 72 64 65 72 44 69 73 74  ns ) isOrderDist
2eb40 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 7d 20  inct = 1;.    } 
2eb50 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e  /* end-if not on
2eb60 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e-row */..    /*
2eb70 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74   Mark off any ot
2eb80 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  her ORDER BY ter
2eb90 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ms that referenc
2eba0 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  e pLoop */.    i
2ebb0 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
2ebc0 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  ct ){.      orde
2ebd0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d  rDistinctMask |=
2ebe0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2ebf0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
2ec00 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
2ec10 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
2ec20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  *p;.        if( 
2ec30 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
2ec40 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
2ec50 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65         p = pOrde
2ec60 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
2ec70 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65 78  .        if( (ex
2ec80 70 72 54 61 62 6c 65 55 73 61 67 65 28 26 70 57  prTableUsage(&pW
2ec90 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
2eca0 70 29 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63  p)&~orderDistinc
2ecb0 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  tMask)==0 ){.   
2ecc0 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
2ecd0 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
2ece0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2ecf0 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74    }.  } /* End t
2ed00 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  he loop over all
2ed10 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d   WhereLoops from
2ed20 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e   outer-most down
2ed30 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a   to inner-most *
2ed40 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f  /.  if( obSat==o
2ed50 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 31  bDone ) return 1
2ed60 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65 72  ;.  if( !isOrder
2ed70 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
2ed80 6e 20 30 3b 0a 20 20 69 66 28 20 69 73 4c 61 73  n 0;.  if( isLas
2ed90 74 4c 6f 6f 70 20 29 20 72 65 74 75 72 6e 20 31  tLoop ) return 1
2eda0 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ;.  return -1;.}
2edb0 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
2edc0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
2edd0 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
2ede0 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
2edf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
2ee00 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
2ee10 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
2ee20 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
2ee30 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
2ee40 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
2ee50 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
2ee60 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
2ee70 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
2ee80 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
2ee90 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
2eea0 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
2eeb0 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
2eec0 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
2eed0 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
2eee0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
2eef0 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74  * Given the list
2ef00 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
2ef10 6a 65 63 74 73 20 6f 6e 20 70 57 49 6e 66 6f 2d  jects on pWInfo-
2ef20 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f  >pLoops, this ro
2ef30 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74  utine.** attempt
2ef40 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f  s to find the lo
2ef50 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74  west cost path t
2ef60 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20  hat visits each 
2ef70 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63  WhereLoop.** onc
2ef80 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73  e.  This path is
2ef90 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74   then loaded int
2efa0 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b  o the pWInfo->a[
2efb0 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e  ].pWLoop fields.
2efc0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
2efd0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
2efe0 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ss or SQLITE_NOM
2eff0 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61  EM of a memory a
2f000 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72  llocation.** err
2f010 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
2f020 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61  atic int wherePa
2f030 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e  thSolver(WhereIn
2f040 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 57 68 65 72  fo *pWInfo, Wher
2f050 65 43 6f 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a  eCost nRowEst){.
2f060 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20    int mxChoice; 
2f070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2f080 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2f090 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61   simultaneous pa
2f0a0 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20  ths tracked */. 
2f0b0 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20   int nLoop;     
2f0c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2f0d0 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
2f0e0 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50   the join */.  P
2f0f0 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
2f100 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
2f110 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
2f120 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
2f130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2f140 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2f150 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
2f160 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
2f170 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2f180 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65  nter over the te
2f190 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  rms of the join 
2f1a0 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  */.  int ii, jj;
2f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f1c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
2f1d0 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72  */.  WhereCost r
2f1e0 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cost;           
2f1f0 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 61 20 70    /* Cost of a p
2f200 61 74 68 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ath */.  WhereCo
2f210 73 74 20 6d 78 43 6f 73 74 3b 20 20 20 20 20 20  st mxCost;      
2f220 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
2f230 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f   cost of a set o
2f240 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 57 68 65  f paths */.  Whe
2f250 72 65 43 6f 73 74 20 72 53 6f 72 74 43 6f 73 74  reCost rSortCost
2f260 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73  ;         /* Cos
2f270 74 20 74 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a  t to do a sort *
2f280 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72  /.  int nTo, nFr
2f290 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om;           /*
2f2a0 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
2f2b0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b   entries in aTo[
2f2c0 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f  ] and aFrom[] */
2f2d0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46  .  WherePath *aF
2f2e0 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
2f2f0 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20  All nFrom paths 
2f300 61 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  at the previous 
2f310 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
2f320 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20  Path *aTo;      
2f330 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20       /* The nTo 
2f340 62 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68  best paths at th
2f350 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20  e current level 
2f360 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
2f370 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  pFrom;         /
2f380 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  * An element of 
2f390 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20  aFrom[] that we 
2f3a0 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
2f3b0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
2f3c0 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
2f3d0 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
2f3e0 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65  To[] that we are
2f3f0 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
2f400 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f   WhereLoop *pWLo
2f410 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  op;        /* On
2f420 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  e of the WhereLo
2f430 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
2f440 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20  WhereLoop **pX; 
2f450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2f460 64 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65  d to divy up the
2f470 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a   pSpace memory *
2f480 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
2f490 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f4a0 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   Temporary memor
2f4b0 79 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72  y used by this r
2f4c0 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61  outine */..  pPa
2f4d0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
2f4e0 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
2f4f0 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70  rse->db;.  nLoop
2f500 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
2f510 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  l;.  /* TUNING: 
2f520 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69  For simple queri
2f530 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73  es, only the bes
2f540 74 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65  t path is tracke
2f550 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61  d..  ** For 2-wa
2f560 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62  y joins, the 5 b
2f570 65 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f  est paths are fo
2f580 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  llowed..  ** For
2f590 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d   joins of 3 or m
2f5a0 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63  ore tables, trac
2f5b0 6b 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61  k the 10 best pa
2f5c0 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63  ths */.  mxChoic
2f5d0 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f  e = (nLoop==1) ?
2f5e0 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f   1 : (nLoop==2 ?
2f5f0 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65   5 : 10);.  asse
2f600 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66  rt( nLoop<=pWInf
2f610 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
2f620 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43  c );.  WHERETRAC
2f630 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20  E(0x002, ("---- 
2f640 62 65 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29  begin solver\n")
2f650 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
2f660 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2f670 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f 20 61   space for aTo a
2f680 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69  nd aFrom */.  ii
2f690 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65   = (sizeof(Where
2f6a0 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65  Path)+sizeof(Whe
2f6b0 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a  reLoop*)*nLoop)*
2f6c0 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53  mxChoice*2;.  pS
2f6d0 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62  pace = sqlite3Db
2f6e0 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69 69  MallocRaw(db, ii
2f6f0 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d  );.  if( pSpace=
2f700 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2f710 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20  TE_NOMEM;.  aTo 
2f720 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53  = (WherePath*)pS
2f730 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20  pace;.  aFrom = 
2f740 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20  aTo+mxChoice;.  
2f750 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c  memset(aFrom, 0,
2f760 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d   sizeof(aFrom[0]
2f770 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72  ));.  pX = (Wher
2f780 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d  eLoop**)(aFrom+m
2f790 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28  xChoice);.  for(
2f7a0 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70  ii=mxChoice*2, p
2f7b0 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20  From=aTo; ii>0; 
2f7c0 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70  ii--, pFrom++, p
2f7d0 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20  X += nLoop){.   
2f7e0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20   pFrom->aLoop = 
2f7f0 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  pX;.  }..  /* Se
2f800 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69  ed the search wi
2f810 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  th a single Wher
2f820 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67  ePath containing
2f830 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73   zero WhereLoops
2f840 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49  ..  **.  ** TUNI
2f850 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74  NG: Do not let t
2f860 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65  he number of ite
2f870 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65  rations go above
2f880 20 32 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73   25.  If the cos
2f890 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74  t.  ** of comput
2f8a0 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
2f8b0 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61   index is not pa
2f8c0 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74  id back within t
2f8d0 68 65 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a  he first 25.  **
2f8e0 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e   rows, then do n
2f8f0 6f 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d  ot use the autom
2f900 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  atic index. */. 
2f910 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d   aFrom[0].nRow =
2f920 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75   MIN(pParse->nQu
2f930 65 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61  eryLoop, 46);  a
2f940 73 73 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65  ssert( 46==where
2f950 43 6f 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46  Cost(25) );.  nF
2f960 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50  rom = 1;..  /* P
2f970 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  recompute the co
2f980 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68  st of sorting th
2f990 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73  e final result s
2f9a0 65 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65  et, if the calle
2f9b0 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65  r.  ** to sqlite
2f9c0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 77 61  3WhereBegin() wa
2f9d0 73 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  s concerned abou
2f9e0 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72  t sorting */.  r
2f9f0 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 0a 20 20  SortCost = 0;.  
2fa00 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
2fa10 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45  erBy==0 || nRowE
2fa20 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 46 72  st==0 ){.    aFr
2fa30 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 56  om[0].isOrderedV
2fa40 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  alid = 1;.  }els
2fa50 65 7b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  e{.    /* TUNING
2fa60 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74  : Estimated cost
2fa70 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 73 20 4e   of sorting is N
2fa80 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e  *log2(N) where N
2fa90 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e   is the.    ** n
2faa0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
2fab0 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 72 53 6f  rows. */.    rSo
2fac0 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74  rtCost = nRowEst
2fad0 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73   + estLog(nRowEs
2fae0 74 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  t);.    WHERETRA
2faf0 43 45 28 30 78 30 30 32 2c 28 22 2d 2d 2d 2d 20  CE(0x002,("---- 
2fb00 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 5c 6e  sort cost=%-3d\n
2fb10 22 2c 20 72 53 6f 72 74 43 6f 73 74 29 29 3b 0a  ", rSortCost));.
2fb20 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
2fb30 65 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c  e successively l
2fb40 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74 68 73  onger WherePaths
2fb50 20 75 73 69 6e 67 20 74 68 65 20 70 72 65 76 69   using the previ
2fb60 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20  ous generation. 
2fb70 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68   ** of WherePath
2fb80 73 20 61 73 20 74 68 65 20 62 61 73 69 73 20 66  s as the basis f
2fb90 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65  or the next.  Ke
2fba0 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
2fbb0 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65  mxChoice.  ** be
2fbc0 73 74 20 70 61 74 68 73 20 61 74 20 65 61 63 68  st paths at each
2fbd0 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
2fbe0 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c   for(iLoop=0; iL
2fbf0 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  oop<nLoop; iLoop
2fc00 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30  ++){.    nTo = 0
2fc10 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20  ;.    for(ii=0, 
2fc20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c  pFrom=aFrom; ii<
2fc30 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72  nFrom; ii++, pFr
2fc40 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72  om++){.      for
2fc50 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e  (pWLoop=pWInfo->
2fc60 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20  pLoops; pWLoop; 
2fc70 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70  pWLoop=pWLoop->p
2fc80 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20  NextLoop){.     
2fc90 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e     Bitmask maskN
2fca0 65 77 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  ew;.        Bitm
2fcb0 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b  ask revMask = 0;
2fcc0 0a 20 20 20 20 20 20 20 20 75 38 20 69 73 4f 72  .        u8 isOr
2fcd0 64 65 72 65 64 56 61 6c 69 64 20 3d 20 70 46 72  deredValid = pFr
2fce0 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  om->isOrderedVal
2fcf0 69 64 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69  id;.        u8 i
2fd00 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d  sOrdered = pFrom
2fd10 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20  ->isOrdered;.   
2fd20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
2fd30 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f  ->prereq & ~pFro
2fd40 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
2fd50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2fd60 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
2fd70 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f  >maskSelf & pFro
2fd80 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
2fd90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2fda0 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
2fdb0 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20  oint, pWLoop is 
2fdc0 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
2fdd0 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e  e the next loop.
2fde0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d   .        ** Com
2fdf0 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f  pute its cost */
2fe00 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d  .        rCost =
2fe10 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 70 57   whereCostAdd(pW
2fe20 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c  Loop->rSetup,pWL
2fe30 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f  oop->rRun + pFro
2fe40 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  m->nRow);.      
2fe50 20 20 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43    rCost = whereC
2fe60 6f 73 74 41 64 64 28 72 43 6f 73 74 2c 20 70 46  ostAdd(rCost, pF
2fe70 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20  rom->rCost);.   
2fe80 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70       maskNew = p
2fe90 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c  From->maskLoop |
2fea0 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   pWLoop->maskSel
2feb0 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  f;.        if( !
2fec0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29  isOrderedValid )
2fed0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74  {.          swit
2fee0 63 68 28 20 77 68 65 72 65 50 61 74 68 53 61 74  ch( wherePathSat
2fef0 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
2ff00 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
2ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
2ff20 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  nfo->pOrderBy, p
2ff30 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63  From, pWInfo->wc
2ff40 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  trlFlags,.      
2ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff60 20 69 4c 6f 6f 70 2c 20 69 4c 6f 6f 70 3d 3d 6e   iLoop, iLoop==n
2ff70 4c 6f 6f 70 2d 31 2c 20 70 57 4c 6f 6f 70 2c 20  Loop-1, pWLoop, 
2ff80 26 72 65 76 4d 61 73 6b 29 20 29 7b 0a 20 20 20  &revMask) ){.   
2ff90 20 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a           case 1:
2ffa0 20 20 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f 6d    /* Yes.  pFrom
2ffb0 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61 74  +pWLoop does sat
2ffc0 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
2ffd0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  Y clause */.    
2ffe0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
2fff0 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  red = 1;.       
30000 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
30010 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Valid = 1;.     
30020 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
30030 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
30040 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46 72   0:  /* No.  pFr
30050 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20 72  om+pWLoop will r
30060 65 71 75 69 72 65 20 61 20 73 65 70 61 72 61 74  equire a separat
30070 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20  e sort */.      
30080 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
30090 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
300a0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
300b0 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  lid = 1;.       
300c0 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77         rCost = w
300d0 68 65 72 65 43 6f 73 74 41 64 64 28 72 43 6f 73  hereCostAdd(rCos
300e0 74 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20  t, rSortCost);. 
300f0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
30100 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
30110 64 65 66 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e  default: /* Cann
30120 6f 74 20 74 65 6c 6c 20 79 65 74 2e 20 20 54 72  ot tell yet.  Tr
30130 79 20 61 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e  y again on the n
30140 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ext iteration */
30150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
30160 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
30170 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
30180 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61  .          revMa
30190 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c  sk = pFrom->revL
301a0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oop;.        }. 
301b0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
301c0 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70  to see if pWLoop
301d0 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64   should be added
301e0 20 74 6f 20 74 68 65 20 6d 78 43 68 6f 69 63 65   to the mxChoice
301f0 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a   best so far */.
30200 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30          for(jj=0
30210 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54  , pTo=aTo; jj<nT
30220 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  o; jj++, pTo++){
30230 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
30240 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61  To->maskLoop==ma
30250 73 6b 4e 65 77 20 26 26 20 70 54 6f 2d 3e 69 73  skNew && pTo->is
30260 4f 72 64 65 72 65 64 56 61 6c 69 64 3d 3d 69 73  OrderedValid==is
30270 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b 0a  OrderedValid ){.
30280 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
30290 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
302a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
302b0 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a   if( jj>=nTo ){.
302c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54            if( nT
302d0 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26 26 20 72  o>=mxChoice && r
302e0 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a  Cost>=mxCost ){.
302f0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
30300 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
30310 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
30320 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
30330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30340 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
30350 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20 63  ntf("Skip   %s c
30360 6f 73 74 3d 25 33 64 20 6f 72 64 65 72 3d 25 63  ost=%3d order=%c
30370 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
30380 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
30390 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
303a0 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
303b0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
303c0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
303d0 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64  lid ? (isOrdered
303e0 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
303f0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
30400 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
30410 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
30420 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30430 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20         /* Add a 
30440 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68 65 20  new Path to the 
30450 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20 20  aTo[] set */.   
30460 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d         if( nTo<m
30470 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
30480 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61         /* Increa
30490 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
304a0 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e  he aTo set by on
304b0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
304c0 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20   jj = nTo++;.   
304d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
304e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
304f0 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74   path replaces t
30500 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74  he prior worst t
30510 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c  o keep count bel
30520 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20  ow mxChoice */. 
30530 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
30540 6a 3d 6e 54 6f 2d 31 3b 20 61 54 6f 5b 6a 6a 5d  j=nTo-1; aTo[jj]
30550 2e 72 43 6f 73 74 3c 6d 78 43 6f 73 74 3b 20 6a  .rCost<mxCost; j
30560 6a 2d 2d 29 7b 20 61 73 73 65 72 74 28 6a 6a 3e  j--){ assert(jj>
30570 30 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  0); }.          
30580 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20  }.          pTo 
30590 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64  = &aTo[jj];.#ifd
305a0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
305b0 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20  ABLED.          
305c0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
305d0 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
305e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
305f0 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77  DebugPrintf("New
30600 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64      %s cost=%-3d
30610 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
30620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
30630 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
30640 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
30650 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20  ), rCost,.      
30660 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
30670 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72  redValid ? (isOr
30680 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
30690 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
306a0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
306b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
306c0 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
306d0 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 29 7b 0a  rCost<=rCost ){.
306e0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
306f0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
30700 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
30710 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
30720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30730 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
30740 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
30750 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20 25         "Skip   %
30760 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65  s cost=%-3d orde
30770 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
30780 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
30790 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
307a0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
307b0 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ost,.           
307c0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
307d0 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72  Valid ? (isOrder
307e0 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
307f0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
30800 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
30810 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20  ugPrintf("   vs 
30820 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64  %s cost=%-3d ord
30830 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
30840 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
30850 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
30860 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
30870 3e 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20  >rCost,.        
30880 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
30890 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
308a0 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20  (pTo->isOrdered 
308b0 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
308c0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
308d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
308e0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
308f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30900 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 61        /* A new a
30910 6e 64 20 62 65 74 74 65 72 20 73 63 6f 72 65 20  nd better score 
30920 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79  for a previously
30930 20 63 72 65 61 74 65 64 20 65 71 75 69 76 61 6c   created equival
30940 65 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69 66 64  ent path */.#ifd
30950 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
30960 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20  ABLED.          
30970 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
30980 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
30990 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
309a0 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
309b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 70               "Up
309c0 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33  date %s cost=%-3
309d0 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
309e0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
309f0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
30a00 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
30a10 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20  , rCost,.       
30a20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
30a30 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64  edValid ? (isOrd
30a40 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
30a50 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
30a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
30a70 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20  ugPrintf("  was 
30a80 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64  %s cost=%-3d ord
30a90 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
30aa0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
30ab0 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
30ac0 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
30ad0 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cost,.          
30ae0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
30af0 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f  eredValid ? (pTo
30b00 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59  ->isOrdered ? 'Y
30b10 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
30b20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
30b30 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
30b40 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20        /* pWLoop 
30b50 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64  is a winner.  Ad
30b60 64 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20  d it to the set 
30b70 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  of best so far *
30b80 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d  /.        pTo->m
30b90 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d  askLoop = pFrom-
30ba0 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f  >maskLoop | pWLo
30bb0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
30bc0 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f        pTo->revLo
30bd0 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  op = revMask;.  
30be0 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20        pTo->nRow 
30bf0 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20  = pFrom->nRow + 
30c00 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20  pWLoop->nOut;.  
30c10 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74        pTo->rCost
30c20 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20   = rCost;.      
30c30 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
30c40 56 61 6c 69 64 20 3d 20 69 73 4f 72 64 65 72 65  Valid = isOrdere
30c50 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20  dValid;.        
30c60 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d  pTo->isOrdered =
30c70 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20   isOrdered;.    
30c80 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e      memcpy(pTo->
30c90 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c  aLoop, pFrom->aL
30ca0 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72  oop, sizeof(Wher
30cb0 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a  eLoop*)*iLoop);.
30cc0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f          pTo->aLo
30cd0 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f  op[iLoop] = pWLo
30ce0 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
30cf0 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b  nTo>=mxChoice ){
30d00 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73  .          mxCos
30d10 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74  t = aTo[0].rCost
30d20 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
30d30 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31  jj=1, pTo=&aTo[1
30d40 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20  ]; jj<mxChoice; 
30d50 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
30d60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
30d70 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20  o->rCost>mxCost 
30d80 29 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e  ) mxCost = pTo->
30d90 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  rCost;.         
30da0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
30db0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64     }.    }..#ifd
30dc0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
30dd0 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
30de0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3e  lite3WhereTrace>
30df0 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
30e00 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
30e10 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64  ---- after round
30e20 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f   %d ----\n", iLo
30e30 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  op);.      for(i
30e40 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69  i=0, pTo=aTo; ii
30e50 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b  <nTo; ii++, pTo+
30e60 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
30e70 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
30e80 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72   %s cost=%-3d nr
30e90 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63  ow=%-3d order=%c
30ea0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77 68  ",.           wh
30eb0 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
30ec0 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
30ed0 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
30ee0 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
30ef0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
30f00 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72  lid ? (pTo->isOr
30f10 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
30f20 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
30f30 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72     if( pTo->isOr
30f40 64 65 72 65 64 56 61 6c 69 64 20 26 26 20 70 54  deredValid && pT
30f50 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a  o->isOrdered ){.
30f60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30f70 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72  3DebugPrintf(" r
30f80 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54  ev=0x%llx\n", pT
30f90 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20  o->revLoop);.   
30fa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
30fc0 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
30fd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30fe0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
30ff0 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20      /* Swap the 
31000 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61  roles of aFrom a
31010 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e  nd aTo for the n
31020 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ext generation *
31030 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54  /.    pFrom = aT
31040 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72  o;.    aTo = aFr
31050 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20  om;.    aFrom = 
31060 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d  pFrom;.    nFrom
31070 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69   = nTo;.  }..  i
31080 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20  f( nFrom==0 ){. 
31090 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
310a0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71  sg(pParse, "no q
310b0 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b  uery solution");
310c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
310d0 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
310e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
310f0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a  E_ERROR;.  }.  .
31100 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f    /* Find the lo
31110 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20  west cost path. 
31120 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c   pFrom will be l
31130 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
31140 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70  that path */.  p
31150 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20  From = aFrom;.  
31160 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72  for(ii=1; ii<nFr
31170 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  om; ii++){.    i
31180 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e  f( pFrom->rCost>
31190 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20  aFrom[ii].rCost 
311a0 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d  ) pFrom = &aFrom
311b0 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  [ii];.  }.  asse
311c0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
311d0 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f  el==nLoop );.  /
311e0 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73  * Load the lowes
311f0 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f  t cost path into
31200 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72   pWInfo */.  for
31210 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
31220 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
31230 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20  .    WhereLevel 
31240 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f  *pLevel = pWInfo
31250 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20  ->a + iLoop;.   
31260 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20   pLevel->pWLoop 
31270 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  = pWLoop = pFrom
31280 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a  ->aLoop[iLoop];.
31290 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
312a0 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62  m = pWLoop->iTab
312b0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54  ;.    pLevel->iT
312c0 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e  abCur = pWInfo->
312d0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
312e0 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73  el->iFrom].iCurs
312f0 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  or;.  }.  if( (p
31300 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
31310 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
31320 43 54 42 59 29 3d 3d 30 20 0a 20 20 20 26 26 20  CTBY)==0 .   && 
31330 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63  pWInfo->pDistinc
31340 74 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a  t.   && nRowEst.
31350 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b    ){.    Bitmask
31360 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e   notUsed;.    in
31370 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
31380 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
31390 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
313a0 3e 70 44 69 73 74 69 6e 63 74 2c 20 70 46 72 6f  >pDistinct, pFro
313b0 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
313c0 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e      WHERE_DISTIN
313d0 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 31  CTBY, nLoop-1, 1
313e0 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e  , pFrom->aLoop[n
313f0 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65  Loop-1], &notUse
31400 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
31410 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  1 ) pWInfo->eDis
31420 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
31430 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
31440 20 20 7d 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d    }.  if( pFrom-
31450 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20  >isOrdered ){.  
31460 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
31470 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
31480 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20  _DISTINCTBY ){. 
31490 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
314a0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
314b0 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b  ISTINCT_ORDERED;
314c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
314d0 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74    pWInfo->bOBSat
314e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 57 49 6e   = 1;.      pWIn
314f0 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46  fo->revMask = pF
31500 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
31510 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f    }.  }.  pWInfo
31520 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f  ->nRowOut = pFro
31530 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46  m->nRow;..  /* F
31540 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d 65  ree temporary me
31550 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20  mory and return 
31560 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c  success */.  sql
31570 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
31580 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72 6e  Space);.  return
31590 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
315a0 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69 65  *.** Most querie
315b0 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e  s use only a sin
315c0 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79 20  gle table (they 
315d0 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61  are not joins) a
315e0 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c  nd have.** simpl
315f0 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  e == constraints
31600 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65 64   against indexed
31610 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20 72   fields.  This r
31620 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 0a  outine attempts.
31630 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65  ** to plan those
31640 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75 73   simple cases us
31650 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63 65  ing much less ce
31660 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a  remony than the.
31670 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
31680 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
31690 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20 79 69  , and thereby yi
316a0 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69 74  eld faster sqlit
316b0 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a 20  e3_prepare().** 
316c0 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63 6f  times for the co
316d0 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  mmon case..**.**
316e0 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
316f0 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66 20   on success, if 
31700 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62  this query can b
31710 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69  e handled by thi
31720 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71  s.** no-frills q
31730 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52  uery planner.  R
31740 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74 68  eturn zero if th
31750 69 73 20 71 75 65 72 79 20 6e 65 65 64 73 20 74  is query needs t
31760 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70  he .** general-p
31770 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61  urpose query pla
31780 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nner..*/.static 
31790 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43 75  int whereShortCu
317a0 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  t(WhereLoopBuild
317b0 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20  er *pBuilder){. 
317c0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
317d0 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  fo;.  struct Src
317e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
317f0 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
31800 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65 72  *pWC;.  WhereTer
31810 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65 72  m *pTerm;.  Wher
31820 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
31830 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20  int iCur;.  int 
31840 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  j;.  Table *pTab
31850 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
31860 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  .  .  pWInfo = p
31870 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
31880 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77  .  if( pWInfo->w
31890 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
318a0 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29 20  E_FORCE_TABLE ) 
318b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
318c0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  rt( pWInfo->pTab
318d0 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b  List->nSrc>=1 );
318e0 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
318f0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
31900 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
31910 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69  pTab;.  if( IsVi
31920 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
31930 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49  turn 0;.  if( pI
31940 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20 72 65  tem->zIndex ) re
31950 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d  turn 0;.  iCur =
31960 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
31970 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  .  pWC = &pWInfo
31980 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d  ->sWC;.  pLoop =
31990 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
319a0 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
319b0 73 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d  s = 0;.  pTerm =
319c0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
319d0 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45  Cur, -1, 0, WO_E
319e0 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65  Q, 0);.  if( pTe
319f0 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d  rm ){.    pLoop-
31a00 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
31a10 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
31a20 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f  _IPK|WHERE_ONERO
31a30 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c  W;.    pLoop->aL
31a40 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
31a50 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  .    pLoop->nLTe
31a60 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f  rm = 1;.    pLoo
31a70 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  p->u.btree.nEq =
31a80 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e   1;.    /* TUNIN
31a90 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77  G: Cost of a row
31aa0 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20  id lookup is 10 
31ab0 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  */.    pLoop->rR
31ac0 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d  un = 33;  /* 33=
31ad0 3d 77 68 65 72 65 43 6f 73 74 28 31 30 29 20 2a  =whereCost(10) *
31ae0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  /.  }else{.    f
31af0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
31b00 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
31b10 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
31b20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
31b30 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
31b40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
31b50 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
31b60 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
31b70 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  {.        pTerm 
31b80 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
31b90 69 43 75 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f  iCur, pIdx->aiCo
31ba0 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45  lumn[j], 0, WO_E
31bb0 51 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  Q, pIdx);.      
31bc0 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
31bd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
31be0 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
31bf0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
31c00 64 62 2c 20 70 4c 6f 6f 70 2c 20 6a 29 3b 0a 20  db, pLoop, j);. 
31c10 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
31c20 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b  Term[j] = pTerm;
31c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31c40 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( j!=pIdx->nCol
31c50 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
31c60 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
31c70 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
31c80 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45  UMN_EQ|WHERE_ONE
31c90 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45  ROW|WHERE_INDEXE
31ca0 44 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 49  D;.      if( (pI
31cb0 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  tem->colUsed & ~
31cc0 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
31cd0 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Idx))==0 ){.    
31ce0 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
31cf0 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
31d00 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ONLY;.      }.  
31d10 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
31d20 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  m = j;.      pLo
31d30 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
31d40 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
31d50 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
31d60 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f   = pIdx;.      /
31d70 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
31d80 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  f a unique index
31d90 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f   lookup is 15 */
31da0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  .      pLoop->rR
31db0 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d  un = 39;  /* 39=
31dc0 3d 77 68 65 72 65 43 6f 73 74 28 31 35 29 20 2a  =whereCost(15) *
31dd0 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
31de0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
31df0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b  Loop->wsFlags ){
31e00 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  .    pLoop->nOut
31e10 20 3d 20 28 57 68 65 72 65 43 6f 73 74 29 31 3b   = (WhereCost)1;
31e20 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
31e30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70  ].pWLoop = pLoop
31e40 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73  ;.    pLoop->mas
31e50 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28  kSelf = getMask(
31e60 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
31e70 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 70 57  t, iCur);.    pW
31e80 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43  Info->a[0].iTabC
31e90 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  ur = iCur;.    p
31ea0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
31eb0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   1;.    if( pWIn
31ec0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70  fo->pOrderBy ) p
31ed0 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20  WInfo->bOBSat = 
31ee0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   1;.    if( pWIn
31ef0 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74 20 29 20  fo->pDistinct ) 
31f00 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
31f10 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
31f20 43 54 5f 55 4e 49 51 55 45 3b 0a 23 69 66 64 65  CT_UNIQUE;.#ifde
31f30 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
31f40 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20     pLoop->cId = 
31f50 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  '0';.#endif.    
31f60 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
31f70 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
31f80 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
31f90 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
31fa0 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
31fb0 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
31fc0 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
31fd0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
31fe0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
31ff0 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
32000 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
32010 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
32020 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
32030 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
32040 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
32050 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
32060 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
32070 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
32080 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
32090 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
320a0 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
320b0 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
320c0 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
320d0 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
320e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
320f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
32100 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
32110 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
32120 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
32130 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
32140 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
32150 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
32160 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
32170 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
32180 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
32190 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
321a0 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
321b0 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
321c0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
321d0 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
321e0 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
321f0 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
32200 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
32210 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
32220 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
32230 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
32240 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
32250 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
32260 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
32270 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
32280 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
32290 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
322a0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
322b0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
322c0 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
322d0 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
322e0 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
322f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
32300 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
32310 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
32320 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
32330 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
32340 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
32350 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
32360 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
32370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32380 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
32390 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
323a0 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
323b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323c0 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
323d0 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
323e0 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
323f0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
32400 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
32410 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
32420 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
32430 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
32440 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
32450 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
32460 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
32470 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
32480 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
32490 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
324a0 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
324b0 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
324c0 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
324d0 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
324e0 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
324f0 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
32500 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
32510 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
32520 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
32530 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
32540 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
32550 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
32560 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
32570 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
32580 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
32590 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
325a0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
325b0 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
325c0 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
325d0 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
325e0 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
325f0 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
32600 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
32610 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
32620 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
32630 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
32640 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
32650 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
32660 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
32670 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
32680 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
32690 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
326a0 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
326b0 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
326c0 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
326d0 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
326e0 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
326f0 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
32700 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
32710 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
32720 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
32730 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
32740 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
32750 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
32760 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
32770 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
32780 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
32790 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
327a0 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
327b0 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
327c0 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
327d0 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
327e0 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
327f0 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
32800 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
32810 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
32820 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
32830 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
32840 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
32850 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
32860 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
32870 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
32880 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
32890 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
328a0 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
328b0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
328c0 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
328d0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
328e0 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
328f0 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
32900 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
32910 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
32920 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
32930 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
32940 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
32950 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
32960 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
32970 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
32980 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
32990 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
329a0 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
329b0 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
329c0 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
329d0 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
329e0 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
329f0 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
32a00 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
32a10 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
32a20 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
32a30 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
32a40 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
32a50 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
32a60 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
32a70 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
32a80 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
32a90 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
32aa0 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
32ab0 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
32ac0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
32ad0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
32ae0 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
32af0 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
32b00 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
32b10 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
32b20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
32b30 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
32b40 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
32b50 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
32b60 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
32b70 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
32b80 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
32b90 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
32ba0 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
32bb0 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
32bc0 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
32bd0 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
32be0 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
32bf0 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f  pOrderBy is a po
32c00 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44  inter to the ORD
32c10 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20  ER BY clause of 
32c20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
32c30 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  nt,.** if there 
32c40 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72  is one.  If ther
32c50 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
32c60 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68   clause or if th
32c70 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
32c80 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20   called from an 
32c90 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
32ca0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
32cb0 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c   pOrderBy is NUL
32cc0 4c 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  L..*/.WhereInfo 
32cd0 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
32ce0 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
32cf0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
32d00 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
32d10 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
32d20 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
32d30 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61  A list of all ta
32d40 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e  bles to be scann
32d50 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
32d60 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  here,         /*
32d70 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
32d80 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
32d90 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
32da0 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  An ORDER BY clau
32db0 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
32dc0 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
32dd0 69 6e 63 74 2c 20 20 2f 2a 20 54 68 65 20 73 65  inct,  /* The se
32de0 6c 65 63 74 2d 6c 69 73 74 20 66 6f 72 20 44 49  lect-list for DI
32df0 53 54 49 4e 43 54 20 71 75 65 72 69 65 73 20 2d  STINCT queries -
32e00 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31   or NULL */.  u1
32e10 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  6 wctrlFlags,   
32e20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
32e30 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
32e40 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
32e50 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20  eInt.h */.  int 
32e60 69 49 64 78 43 75 72 20 20 20 20 20 20 20 20 20  iIdxCur         
32e70 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e    /* If WHERE_ON
32e80 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73  ETABLE_ONLY is s
32e90 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72  et, index cursor
32ea0 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
32eb0 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20  int nByteWInfo; 
32ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
32ed0 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  m. bytes allocat
32ee0 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f  ed for WhereInfo
32ef0 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74   struct */.  int
32f00 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20   nTabList;      
32f10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32f20 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
32f30 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
32f40 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
32f50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
32f60 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
32f70 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
32f80 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
32f90 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
32fa0 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
32fb0 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
32fc0 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42  se engine */.  B
32fd0 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
32fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
32ff0 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
33000 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
33010 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
33020 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20  uilder sWLB;    
33030 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
33040 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57  p builder */.  W
33050 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
33060 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65  skSet;    /* The
33070 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
33080 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c   set */.  WhereL
33090 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
330a0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
330b0 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f   level in pWInfo
330c0 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ->a[] */.  int i
330d0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
330e0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
330f0 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  unter */.  sqlit
33100 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
33110 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
33120 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
33130 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
33140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33150 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
33160 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69  .  /* Variable i
33170 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
33180 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c  .  memset(&sWLB,
33190 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29   0, sizeof(sWLB)
331a0 29 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72  );.  sWLB.pOrder
331b0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a  By = pOrderBy;..
331c0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
331d0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
331e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
331f0 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e  limited by the n
33200 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69  umber of.  ** bi
33210 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20  ts in a Bitmask 
33220 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
33230 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
33240 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70  ==BMS );.  if( p
33250 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d  TabList->nSrc>BM
33260 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S ){.    sqlite3
33270 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
33280 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62   "at most %d tab
33290 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20  les in a join", 
332a0 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  BMS);.    return
332b0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
332c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d  is function norm
332d0 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61  ally generates a
332e0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72   nested loop for
332f0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a   all tables in .
33300 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20    ** pTabList.  
33310 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45  But if the WHERE
33320 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
33330 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
33340 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20   we should.  ** 
33350 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  only generate co
33360 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
33370 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
33380 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  st and assume th
33390 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73  at.  ** any curs
333a0 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
333b0 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74  ith subsequent t
333c0 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74  ables are uninit
333d0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
333e0 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72  nTabList = (wctr
333f0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
33400 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20  NETABLE_ONLY) ? 
33410 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  1 : pTabList->nS
33420 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  rc;..  /* Alloca
33430 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
33440 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  e the WhereInfo 
33450 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
33460 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20  ill become the. 
33470 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
33480 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  . A single alloc
33490 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
334a0 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65   store the Where
334b0 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74  Info.  ** struct
334c0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
334d0 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c  f WhereInfo.a[],
334e0 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
334f0 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
33500 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73  and the WhereMas
33510 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20  kSet structure. 
33520 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73  Since WhereClaus
33530 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d  e contains an 8-
33540 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20  byte.  ** field 
33550 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69  (type Bitmask) i
33560 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65  t must be aligne
33570 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62  d on an 8-byte b
33580 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20  oundary on.  ** 
33590 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72  some architectur
335a0 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f  es. Hence the RO
335b0 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20  UND8() below..  
335c0 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
335d0 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57 49 6e  ->db;.  nByteWIn
335e0 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
335f0 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
33600 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
33610 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
33620 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
33630 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
33640 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20  b, nByteWInfo + 
33650 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
33660 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ));.  if( db->ma
33670 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
33680 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
33690 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
336a0 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
336b0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
336c0 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
336d0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54  nfo->nLevel = nT
336e0 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
336f0 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
33700 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
33710 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
33720 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ;.  pWInfo->pOrd
33730 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
33740 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74  .  pWInfo->pDist
33750 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74  inct = pDistinct
33760 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
33770 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
33780 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
33790 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
337a0 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b  gs = wctrlFlags;
337b0 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64  .  pWInfo->saved
337c0 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
337d0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
337e0 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70  .  pMaskSet = &p
337f0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b  WInfo->sMaskSet;
33800 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d  .  sWLB.pWInfo =
33810 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e   pWInfo;.  sWLB.
33820 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
33830 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20  WC;.  sWLB.pNew 
33840 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 26 70  = (WhereLoop*)&p
33850 57 49 6e 66 6f 2d 3e 61 5b 6e 54 61 62 4c 69 73  WInfo->a[nTabLis
33860 74 5d 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  t];.  whereLoopI
33870 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a  nit(sWLB.pNew);.
33880 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
33890 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d  BUG.  sWLB.pNew-
338a0 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64  >cId = '*';.#end
338b0 69 66 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65  if..  /* Disable
338c0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70   the DISTINCT op
338d0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51  timization if SQ
338e0 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
338f0 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a   is set via.  **
33900 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74   sqlite3_test_ct
33910 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  rl(SQLITE_TESTCT
33920 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
33930 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f  ,...) */.  if( O
33940 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
33950 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  led(db, SQLITE_D
33960 69 73 74 69 6e 63 74 4f 70 74 29 20 29 20 70 44  istinctOpt) ) pD
33970 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 0a 20 20  istinct = 0;..  
33980 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45  /* Split the WHE
33990 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73  RE clause into s
339a0 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65  eparate subexpre
339b0 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63  ssions where eac
339c0 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73  h.  ** subexpres
339d0 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
339e0 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72  d by an AND oper
339f0 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69  ator..  */.  ini
33a00 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65  tMaskSet(pMaskSe
33a10 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  t);.  whereClaus
33a20 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  eInit(&pWInfo->s
33a30 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73  WC, pWInfo);.  s
33a40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
33a50 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
33a60 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65  pWhere);.  where
33a70 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  Split(&pWInfo->s
33a80 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41  WC, pWhere, TK_A
33a90 4e 44 29 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ND);   /* IMP: R
33aa0 2d 31 35 38 34 32 2d 35 33 32 39 36 20 2a 2f 0a  -15842-53296 */.
33ab0 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
33ac0 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
33ad0 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
33ae0 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
33af0 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
33b00 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
33b10 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
33b20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
33b30 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
33b40 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28   if( pWhere && (
33b50 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73  nTabList==0 || s
33b60 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
33b70 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65  tantNotJoin(pWhe
33b80 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  re)) ){.    sqli
33b90 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
33ba0 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70  Parse, pWhere, p
33bb0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53  WInfo->iBreak, S
33bc0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
33bd0 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  );.    pWhere = 
33be0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  0;.  }..  /* Spe
33bf0 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52  cial case: No FR
33c00 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
33c10 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30   if( nTabList==0
33c20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   ){.    if( pOrd
33c30 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62  erBy ) pWInfo->b
33c40 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 69  OBSat = 1;.    i
33c50 66 28 20 70 44 69 73 74 69 6e 63 74 20 29 20 70  f( pDistinct ) p
33c60 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
33c70 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
33c80 54 5f 55 4e 49 51 55 45 3b 0a 20 20 7d 0a 0a 20  T_UNIQUE;.  }.. 
33c90 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74   /* Assign a bit
33ca0 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73   from the bitmas
33cb0 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  k to every term 
33cc0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
33cd0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  se..  **.  ** Wh
33ce0 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74  en assigning bit
33cf0 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46  mask values to F
33d00 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f  ROM clause curso
33d10 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20  rs, it must be. 
33d20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61   ** the case tha
33d30 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  t if X is the bi
33d40 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d  tmask for the N-
33d50 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
33d60 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  erm then.  ** th
33d70 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
33d80 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  l FROM clause te
33d90 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  rms to the left 
33da0 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d  of the N-th term
33db0 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20  .  ** is (X-1). 
33dc0 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20    An expression 
33dd0 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
33de0 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
33df0 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69  N can use.  ** i
33e00 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  ts Expr.iRightJo
33e10 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f  inTable value to
33e20 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73   find the bitmas
33e30 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  k of the right t
33e40 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  able.  ** of the
33e50 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74   join.  Subtract
33e60 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ing one from the
33e70 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74   right table bit
33e80 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a  mask gives a.  *
33e90 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  * bitmask for al
33ea0 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
33eb0 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
33ec0 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62  .  Knowing the b
33ed0 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20  itmask.  ** for 
33ee0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
33ef0 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
33f00 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61   join is importa
33f10 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
33f20 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  5..  **.  ** Not
33f30 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20  e that bitmasks 
33f40 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
33f50 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  all pTabList->nS
33f60 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a  rc tables in.  *
33f70 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20  * pTabList, not 
33f80 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  just the first n
33f90 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20  TabList tables. 
33fa0 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72   nTabList is nor
33fb0 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c  mally.  ** equal
33fc0 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   to pTabList->nS
33fd0 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20  rc but might be 
33fe0 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69  shortened to 1 i
33ff0 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45  f the.  ** WHERE
34000 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
34010 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f  lag is set..  */
34020 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
34030 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
34040 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74  ii++){.    creat
34050 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  eMask(pMaskSet, 
34060 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
34070 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  iCursor);.  }.#i
34080 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b  fndef NDEBUG.  {
34090 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54  .    Bitmask toT
340a0 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  heLeft = 0;.    
340b0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
340c0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
340d0 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  +){.      Bitmas
340e0 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k m = getMask(pM
340f0 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
34100 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
34110 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
34120 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74  (m-1)==toTheLeft
34130 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c   );.      toTheL
34140 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a  eft |= m;.    }.
34150 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
34160 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20   Analyze all of 
34170 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
34180 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65  ns.  Note that e
34190 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67  xprAnalyze() mig
341a0 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20  ht.  ** add new 
341b0 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e  virtual terms on
341c0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
341d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
341e0 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20   We do not.  ** 
341f0 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20  want to analyze 
34200 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65  these virtual te
34210 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e  rms, so start an
34220 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65  alyzing at the e
34230 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b  nd.  ** and work
34240 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74   forward so that
34250 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75   the added virtu
34260 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76  al terms are nev
34270 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20  er processed..  
34280 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  */.  exprAnalyze
34290 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 70  All(pTabList, &p
342a0 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69  WInfo->sWC);.  i
342b0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
342c0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
342d0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
342e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
342f0 65 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47  e ORDER BY (or G
34300 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20  ROUP BY) clause 
34310 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72 65 6e  contains referen
34320 63 65 73 20 74 6f 20 67 65 6e 65 72 61 6c 0a 20  ces to general. 
34330 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   ** expressions,
34340 20 74 68 65 6e 20 77 65 20 77 6f 6e 27 74 20 62   then we won't b
34350 65 20 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66  e able to satisf
34360 79 20 69 74 20 75 73 69 6e 67 20 69 6e 64 69 63  y it using indic
34370 65 73 2c 20 73 6f 0a 20 20 2a 2a 20 67 6f 20 61  es, so.  ** go a
34380 68 65 61 64 20 61 6e 64 20 64 69 73 61 62 6c 65  head and disable
34390 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
343a0 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
343b0 70 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  pDistinct ){.   
343c0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
343d0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
343e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
343f0 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65   *pExpr = sqlite
34400 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
34410 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d  (pOrderBy->a[ii]
34420 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
34430 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
34440 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
34450 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
34460 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d  rBy = pOrderBy =
34470 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
34480 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
34490 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
344a0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  n<0 ){.        b
344b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
344c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
344d0 65 63 6b 20 69 66 20 74 68 65 20 44 49 53 54 49  eck if the DISTI
344e0 4e 43 54 20 71 75 61 6c 69 66 69 65 72 2c 20 69  NCT qualifier, i
344f0 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2c 20  f there is one, 
34500 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 0a 20  is redundant. . 
34510 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68   ** If it is, th
34520 65 6e 20 73 65 74 20 70 44 69 73 74 69 6e 63 74  en set pDistinct
34530 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 57 68 65   to NULL and Whe
34540 72 65 49 6e 66 6f 2e 65 44 69 73 74 69 6e 63 74  reInfo.eDistinct
34550 20 74 6f 0a 20 20 2a 2a 20 57 48 45 52 45 5f 44   to.  ** WHERE_D
34560 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 20 74  ISTINCT_UNIQUE t
34570 6f 20 74 65 6c 6c 20 74 68 65 20 63 61 6c 6c 65  o tell the calle
34580 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  r to ignore the 
34590 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2f 0a 20  DISTINCT..  */. 
345a0 20 69 66 28 20 70 44 69 73 74 69 6e 63 74 20 29   if( pDistinct )
345b0 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69 73 74  {.    if( isDist
345c0 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50  inctRedundant(pP
345d0 61 72 73 65 2c 70 54 61 62 4c 69 73 74 2c 26 70  arse,pTabList,&p
345e0 57 49 6e 66 6f 2d 3e 73 57 43 2c 70 44 69 73 74  WInfo->sWC,pDist
345f0 69 6e 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70  inct) ){.      p
34600 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
34610 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
34620 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
34630 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
34640 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
34650 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
34660 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
34670 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49  lags |= WHERE_DI
34680 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20  STINCTBY;.      
34690 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
346a0 20 3d 20 70 44 69 73 74 69 6e 63 74 3b 0a 20 20   = pDistinct;.  
346b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
346c0 6e 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72  nstruct the Wher
346d0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
346e0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
346f0 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d  ffff,("*** Optim
34700 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e  izer Start ***\n
34710 22 29 29 3b 0a 20 20 69 66 28 20 6e 54 61 62 4c  "));.  if( nTabL
34720 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53  ist!=1 || whereS
34730 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d  hortCut(&sWLB)==
34740 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68  0 ){.    rc = wh
34750 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73  ereLoopAddAll(&s
34760 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63  WLB);.    if( rc
34770 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
34780 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 20 20 20 20  inError;.  .    
34790 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f  /* Display all o
347a0 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
347b0 6f 62 6a 65 63 74 73 20 69 66 20 77 68 65 72 65  objects if where
347c0 74 72 61 63 65 20 69 73 20 65 6e 61 62 6c 65 64  trace is enabled
347d0 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
347e0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
347f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
34800 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  reTrace ){.     
34810 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20   WhereLoop *p;. 
34820 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a       int i = 0;.
34830 20 20 20 20 20 20 73 74 61 74 69 63 20 63 68 61        static cha
34840 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31  r zLabel[] = "01
34850 32 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68  23456789abcdefgh
34860 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79  ijklmnopqrstuvwy
34870 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  xz".            
34880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34890 20 20 20 20 20 20 20 20 20 20 20 22 41 42 43 44             "ABCD
348a0 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
348b0 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66  UVWYXZ";.      f
348c0 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f  or(p=pWInfo->pLo
348d0 6f 70 73 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  ops; p; p=p->pNe
348e0 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
348f0 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c   p->cId = zLabel
34900 5b 28 69 2b 2b 29 25 73 69 7a 65 6f 66 28 7a 4c  [(i++)%sizeof(zL
34910 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20  abel)];.        
34920 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
34930 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20  , pTabList);.   
34940 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
34950 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61  f.  .    wherePa
34960 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
34970 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
34980 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
34990 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
349a0 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57  rror;.    if( pW
349b0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
349c0 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61  {.       wherePa
349d0 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
349e0 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
349f0 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64 62  );.       if( db
34a00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
34a10 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
34a20 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Error;.    }.  }
34a30 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
34a40 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64  OrderBy==0 && (d
34a50 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
34a60 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29 21  E_ReverseOrder)!
34a70 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66  =0 ){.     pWInf
34a80 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 28 42 69  o->revMask = (Bi
34a90 74 6d 61 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a  tmask)(-1);.  }.
34aa0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
34ab0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
34ac0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
34ad0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
34ae0 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57  or;.  }.#ifdef W
34af0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
34b00 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  D.  if( sqlite3W
34b10 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20  hereTrace ){.   
34b20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 73 71 6c   int ii;.    sql
34b30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
34b40 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e  "---- Solution n
34b50 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d  Row=%d", pWInfo-
34b60 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69  >nRowOut);.    i
34b70 66 28 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61  f( pWInfo->bOBSa
34b80 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
34b90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
34ba0 4f 52 44 45 52 42 59 3d 30 78 25 6c 6c 78 22 2c  ORDERBY=0x%llx",
34bb0 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
34bc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69  );.    }.    swi
34bd0 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69  tch( pWInfo->eDi
34be0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
34bf0 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
34c00 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
34c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
34c20 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
34c30 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20  INCT=unique");. 
34c40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
34c50 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
34c60 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
34c70 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
34c80 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
34c90 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
34ca0 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20  T=ordered");.   
34cb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
34cc0 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57    }.      case W
34cd0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
34ce0 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
34cf0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
34d00 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
34d10 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20  T=unordered");. 
34d20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
34d30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
34d40 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
34d50 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f  tf("\n");.    fo
34d60 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c  r(ii=0; ii<nTabL
34d70 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ist; ii++){.    
34d80 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
34d90 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70  (pWInfo->a[ii].p
34da0 57 4c 6f 6f 70 2c 20 70 54 61 62 4c 69 73 74 29  WLoop, pTabList)
34db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
34dc0 69 66 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  if.  WHERETRACE(
34dd0 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74  0xffff,("*** Opt
34de0 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
34df0 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e  ***\n"));.  pWIn
34e00 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65  fo->pParse->nQue
34e10 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f  ryLoop += pWInfo
34e20 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a  ->nRowOut;..  /*
34e30 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
34e40 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  s an UPDATE or D
34e50 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
34e60 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69  that is requesti
34e70 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61  ng.  ** to use a
34e80 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
34e90 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69  thm, determine i
34ea0 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70  f this is approp
34eb0 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20  riate..  ** The 
34ec0 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
34ed0 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66  hm only works if
34ee0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
34ef0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
34f00 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
34f10 20 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e   to update a sin
34f20 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20  gle row..  */.  
34f30 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
34f40 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
34f50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
34f60 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  || pWInfo->nLeve
34f70 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77  l==1 );.  if( (w
34f80 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
34f90 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
34fa0 44 29 21 3d 30 20 0a 20 20 20 26 26 20 28 70 57  D)!=0 .   && (pW
34fb0 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
34fc0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
34fd0 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 20 29 7b  RE_ONEROW)!=0 ){
34fe0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  .    pWInfo->okO
34ff0 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20  nePass = 1;.    
35000 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
35010 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20  oop->wsFlags &= 
35020 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b  ~WHERE_IDX_ONLY;
35030 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
35040 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
35050 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  e pTabList and a
35060 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63  ny indices selec
35070 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61  ted for.  ** sea
35080 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62  rching those tab
35090 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  les..  */.  sqli
350a0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
350b0 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b  ema(pParse, -1);
350c0 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63   /* Insert the c
350d0 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47  ookie verifier G
350e0 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  oto */.  notRead
350f0 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
35100 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
35110 75 74 20 3d 20 28 57 68 65 72 65 43 6f 73 74 29  ut = (WhereCost)
35120 31 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70  1;.  for(ii=0, p
35130 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
35140 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
35150 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
35160 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
35170 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
35180 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  open */.    int 
35190 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
351a0 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73  Index of databas
351b0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62  e containing tab
351c0 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  le/index */.    
351d0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
351e0 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 20  tem *pTabItem;. 
351f0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c     WhereLoop *pL
35200 6f 6f 70 3b 0a 0a 20 20 20 20 70 54 61 62 49 74  oop;..    pTabIt
35210 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
35220 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
35230 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
35240 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
35250 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
35260 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
35270 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
35280 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
35290 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
352a0 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
352b0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
352c0 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
352d0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
352e0 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
352f0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
35300 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35310 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
35320 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
35330 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
35340 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
35350 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
35360 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
35370 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
35380 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
35390 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
353a0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
353b0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
353c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
353d0 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
353e0 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
353f0 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
35400 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
35410 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
35420 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20    /* noop */.   
35430 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
35440 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
35450 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
35460 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
35470 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
35480 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
35490 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29  OPEN_CLOSE)==0 )
354a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  {.      int op =
354b0 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61   pWInfo->okOnePa
354c0 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74  ss ? OP_OpenWrit
354d0 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  e : OP_OpenRead;
354e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
354f0 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
35500 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
35510 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70  r, iDb, pTab, op
35520 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
35530 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  e( pTab->nCol==B
35540 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  MS-1 );.      te
35550 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43  stcase( pTab->nC
35560 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
35570 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b   if( !pWInfo->ok
35580 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d  OnePass && pTab-
35590 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20  >nCol<BMS ){.   
355a0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
355b0 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73   pTabItem->colUs
355c0 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ed;.        int 
355d0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  n = 0;.        f
355e0 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20  or(; b; b=b>>1, 
355f0 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73  n++){}.        s
35600 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
35610 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62  P4(v, sqlite3Vdb
35620 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
35630 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
35640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35650 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
35660 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  R(n), P4_INT32);
35670 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
35680 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   n<=pTab->nCol )
35690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
356a0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
356b0 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
356c0 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
356d0 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
356e0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  ame);.    }.#ifn
356f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35700 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
35710 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
35720 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
35730 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20 29  TEMP_INDEX)!=0 )
35740 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
35750 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
35760 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d  pParse, &pWInfo-
35770 3e 73 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20  >sWC, pTabItem, 
35780 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
35790 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
357a0 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f  dif.    if( pLoo
357b0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
357c0 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
357d0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d      Index *pIx =
357e0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
357f0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 4b 65  pIndex;.      Ke
35800 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71  yInfo *pKey = sq
35810 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
35820 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a  o(pParse, pIx);.
35830 20 20 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20        /* FIXME: 
35840 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
35850 69 6f 6e 20 75 73 65 20 70 54 61 62 49 74 65 6d  ion use pTabItem
35860 2d 3e 69 43 75 72 73 6f 72 20 69 66 20 57 48 45  ->iCursor if WHE
35870 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 2a 2f 0a 20  RE_IDX_ONLY */. 
35880 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43       int iIndexC
35890 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
358a0 78 43 75 72 20 3d 20 69 49 64 78 43 75 72 20 3f  xCur = iIdxCur ?
358b0 20 69 49 64 78 43 75 72 20 3a 20 70 50 61 72 73   iIdxCur : pPars
358c0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
358d0 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53   assert( pIx->pS
358e0 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
358f0 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73  hema );.      as
35900 73 65 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e  sert( iIndexCur>
35910 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
35920 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
35930 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
35940 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e  ndexCur, pIx->tn
35950 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  um, iDb,.       
35960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35970 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34   (char*)pKey, P4
35980 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
35990 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
359a0 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
359b0 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  Ix->zName));.   
359c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
359d0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
359e0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
359f0 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
35a00 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
35a10 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65  MaskSet, pTabIte
35a20 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  m->iCursor);.  }
35a30 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20  .  pWInfo->iTop 
35a40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
35a50 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
35a60 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
35a70 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
35a80 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
35a90 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
35aa0 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
35ab0 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
35ac0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
35ad0 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
35ae0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
35af0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
35b00 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
35b10 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
35b20 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
35b30 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
35b40 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
35b50 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a  TabList; ii++){.
35b60 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
35b70 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  Info->a[ii];.   
35b80 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
35b90 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
35ba0 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c  , pLevel, ii, pL
35bb0 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74  evel->iFrom, wct
35bc0 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 6e 6f  rlFlags);.    no
35bd0 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65  tReady = codeOne
35be0 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f  LoopStart(pWInfo
35bf0 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b  , ii, notReady);
35c00 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  .    pWInfo->iCo
35c10 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d  ntinue = pLevel-
35c20 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a  >addrCont;.  }..
35c30 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20    /* Done. */.  
35c40 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a  return pWInfo;..
35c50 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
35c60 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  f malloc fails *
35c70 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  /.whereBeginErro
35c80 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20  r:.  if( pWInfo 
35c90 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
35ca0 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
35cb0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
35cc0 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e  oop;.    whereIn
35cd0 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
35ce0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
35cf0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
35d00 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  erate the end of
35d10 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
35d20 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f    See comments o
35d30 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  n .** sqlite3Whe
35d40 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64  reBegin() for ad
35d50 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
35d60 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
35d70 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68  lite3WhereEnd(Wh
35d80 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
35d90 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
35da0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
35db0 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  se;.  Vdbe *v = 
35dc0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
35dd0 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
35de0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
35df0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
35e00 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
35e10 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
35e20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69  pTabList;.  sqli
35e30 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
35e40 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ->db;..  /* Gene
35e50 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
35e60 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
35e70 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
35e80 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
35e90 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f  ;.  for(i=pWInfo
35ea0 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30  ->nLevel-1; i>=0
35eb0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76  ; i--){.    pLev
35ec0 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
35ed0 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  i];.    pLoop = 
35ee0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
35ef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
35f00 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
35f10 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
35f20 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
35f30 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ->op!=OP_Noop ){
35f40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
35f50 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65 76  beAddOp2(v, pLev
35f60 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  el->op, pLevel->
35f70 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b  p1, pLevel->p2);
35f80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
35f90 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c  beChangeP5(v, pL
35fa0 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d  evel->p5);.    }
35fb0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
35fc0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
35fd0 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65  IN_ABLE && pLeve
35fe0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b  l->u.in.nIn>0 ){
35ff0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
36000 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20  Loop *pIn;.     
36010 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71   int j;.      sq
36020 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
36030 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
36040 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20  >addrNxt);.     
36050 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75   for(j=pLevel->u
36060 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c  .in.nIn, pIn=&pL
36070 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
36080 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d  op[j-1]; j>0; j-
36090 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20  -, pIn--){.     
360a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
360b0 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
360c0 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20  ddrInTop+1);.   
360d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
360e0 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65  AddOp2(v, pIn->e
360f0 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e  EndLoopOp, pIn->
36100 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
36110 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73  nTop);.        s
36120 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
36130 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
36140 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
36150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
36160 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
36170 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
36180 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
36190 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
361a0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
361b0 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
361c0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
361d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
361e0 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
361f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36200 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
36210 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
36220 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
36230 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
36240 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
36250 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
36260 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    || (pLoop->wsF
36270 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
36280 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  EXED)!=0 );.    
36290 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
362a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
362b0 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
362c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
362d0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
362e0 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d  llRow, pTabList-
362f0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
36300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
36310 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
36320 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
36330 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
36340 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
36350 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65   OP_NullRow, pLe
36360 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
36370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
36380 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
36390 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20  Return ){.      
363a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
363b0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
363c0 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
363d0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
363e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
363f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36400 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
36410 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
36420 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
36430 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
36440 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
36450 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  addr);.    }.  }
36460 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61  ..  /* The "brea
36470 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65  k" point is here
36480 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20  , just past the 
36490 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72  end of the outer
364a0 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20   loop..  ** Set 
364b0 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  it..  */.  sqlit
364c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
364d0 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  el(v, pWInfo->iB
364e0 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  reak);..  /* Clo
364f0 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75  se all of the cu
36500 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20  rsors that were 
36510 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65  opened by sqlite
36520 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a  3WhereBegin..  *
36530 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  /.  assert( pWIn
36540 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c  fo->nLevel==1 ||
36550 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
36560 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  =pTabList->nSrc 
36570 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  );.  for(i=0, pL
36580 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
36590 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
365a0 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
365b0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
365c0 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  x = 0;.    struc
365d0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
365e0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
365f0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
36600 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
36610 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
36620 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
36630 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
36640 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
36650 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
36660 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
36670 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
36680 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  ral)==0.     && 
36690 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
366a0 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
366b0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
366c0 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43  HERE_OMIT_OPEN_C
366d0 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  LOSE)==0.    ){.
366e0 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70        int ws = p
366f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
36700 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
36710 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28  ->okOnePass && (
36720 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
36730 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
36740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36750 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
36760 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
36770 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
36780 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48      if( (ws & WH
36790 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
367a0 26 26 20 28 77 73 20 26 20 28 57 48 45 52 45 5f  && (ws & (WHERE_
367b0 49 50 4b 7c 57 48 45 52 45 5f 54 45 4d 50 5f 49  IPK|WHERE_TEMP_I
367c0 4e 44 45 58 29 29 3d 3d 30 20 29 7b 0a 20 20 20  NDEX))==0 ){.   
367d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
367e0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
367f0 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  se, pLevel->iIdx
36800 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
36810 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
36820 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e  his scan uses an
36830 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64   index, make cod
36840 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
36850 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20  to read data.   
36860 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64   ** from the ind
36870 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65  ex in preference
36880 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53   to the table. S
36890 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d  ometimes, this m
368a0 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  eans.    ** the 
368b0 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72  table need never
368c0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54   be read from. T
368d0 68 69 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d  his is a perform
368e0 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20  ance boost,.    
368f0 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65 20 6c  ** as the vdbe l
36900 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c  evel waits until
36910 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 72 65   the table is re
36920 61 64 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c  ad before actual
36930 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e  ly.    ** seekin
36940 67 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  g the table curs
36950 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64  or to the record
36960 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
36970 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  o the current.  
36980 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e    ** position in
36990 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
369a0 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73  ** .    ** Calls
369b0 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
369c0 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65  erator in betwee
369d0 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  n sqlite3WhereBe
369e0 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  gin and.    ** s
369f0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77  qlite3WhereEnd w
36a00 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64  ill have created
36a10 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72   code that refer
36a20 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a  ences the table.
36a30 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e      ** directly.
36a40 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e    This loop scan
36a50 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20  s all that code 
36a60 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f  looking for opco
36a70 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  des.    ** that 
36a80 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
36a90 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73  ble and converts
36aa0 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64   them into opcod
36ab0 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72  es that.    ** r
36ac0 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64  eference the ind
36ad0 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
36ae0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
36af0 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58  s & (WHERE_INDEX
36b00 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  ED|WHERE_IDX_ONL
36b10 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  Y) ){.      pIdx
36b20 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
36b30 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  e.pIndex;.    }e
36b40 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  lse if( pLoop->w
36b50 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
36b60 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20  ULTI_OR ){.     
36b70 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
36b80 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d  u.pCovidx;.    }
36b90 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26  .    if( pIdx &&
36ba0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
36bb0 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ed ){.      int 
36bc0 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20  k, j, last;.    
36bd0 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a    VdbeOp *pOp;..
36be0 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
36bf0 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
36c00 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20  pWInfo->iTop);. 
36c10 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69       last = sqli
36c20 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
36c30 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  dr(v);.      for
36c40 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b  (k=pWInfo->iTop;
36c50 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f   k<last; k++, pO
36c60 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
36c70 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65  ( pOp->p1!=pLeve
36c80 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e  l->iTabCur ) con
36c90 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
36ca0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
36cb0 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  OP_Column ){.   
36cc0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
36cd0 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  j<pIdx->nColumn;
36ce0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
36cf0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d     if( pOp->p2==
36d00 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
36d10 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
36d20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a     pOp->p2 = j;.
36d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
36d40 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
36d50 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
36d60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
36d70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
36d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36d90 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
36da0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
36db0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c  E_IDX_ONLY)==0 |
36dc0 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  | j<pIdx->nColum
36dd0 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  n );.        }el
36de0 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
36df0 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
36e00 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
36e10 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
36e20 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Cur;.          p
36e30 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
36e40 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  IdxRowid;.      
36e50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
36e60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61  }.  }..  /* Fina
36e70 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20  l cleanup.  */. 
36e80 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
36e90 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61  oop = pWInfo->sa
36ea0 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
36eb0 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
36ec0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  b, pWInfo);.  re
36ed0 74 75 72 6e 3b 0a 7d 0a                          turn;.}.