/ Hex Artifact Content
Login

Artifact 88884f3a0355ece00fa0d1a3566c4ed6fb5a8bed:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 4b 2c 58  e WHERETRACE(K,X
0430: 29 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65  )  if(sqlite3Whe
0440: 72 65 54 72 61 63 65 26 28 4b 29 29 20 73 71 6c  reTrace&(K)) sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0460: 58 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  X.# define WHERE
0470: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 31 0a  TRACE_ENABLED 1.
0480: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57  #else.# define W
0490: 48 45 52 45 54 52 41 43 45 28 4b 2c 58 29 0a 23  HERETRACE(K,X).#
04a0: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
04b0: 64 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 74  d reference.*/.t
04c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
04d0: 65 72 65 43 6c 61 75 73 65 20 57 68 65 72 65 43  ereClause WhereC
04e0: 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20 73  lause;.typedef s
04f0: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
0500: 65 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 3b  et WhereMaskSet;
0510: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0520: 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65 72  WhereOrInfo Wher
0530: 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66  eOrInfo;.typedef
0540: 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64   struct WhereAnd
0550: 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e 66  Info WhereAndInf
0560: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0570: 74 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68 65  t WhereLevel Whe
0580: 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65 66  reLevel;.typedef
0590: 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f   struct WhereLoo
05a0: 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74 79 70  p WhereLoop;.typ
05b0: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
05c0: 65 50 61 74 68 20 57 68 65 72 65 50 61 74 68 3b  ePath WherePath;
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65 54  WhereTerm WhereT
05f0: 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  erm;.typedef str
0600: 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  uct WhereLoopBui
0610: 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70 42 75  lder WhereLoopBu
0620: 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66 20 73  ilder;.typedef s
0630: 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e 20  truct WhereScan 
0640: 57 68 65 72 65 53 63 61 6e 3b 0a 0a 2f 2a 0a 2a  WhereScan;../*.*
0650: 2a 20 43 6f 73 74 20 58 20 69 73 20 74 72 61 63  * Cost X is trac
0660: 6b 65 64 20 61 73 20 31 30 2a 6c 6f 67 32 28 58  ked as 10*log2(X
0670: 29 20 73 74 6f 72 65 64 20 69 6e 20 61 20 31 36  ) stored in a 16
0680: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 54  -bit integer.  T
0690: 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 63 6f  he.** maximum co
06a0: 73 74 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20  st for ordinary 
06b0: 74 61 62 6c 65 73 20 69 73 20 36 34 2a 28 32 2a  tables is 64*(2*
06c0: 2a 36 33 29 20 77 68 69 63 68 20 62 65 63 6f 6d  *63) which becom
06d0: 65 73 20 36 39 30 30 2e 0a 2a 2a 20 28 56 69 72  es 6900..** (Vir
06e0: 74 75 61 6c 20 74 61 62 6c 65 73 20 63 61 6e 20  tual tables can 
06f0: 72 65 74 75 72 6e 20 61 20 6c 61 72 67 65 72 20  return a larger 
0700: 63 6f 73 74 2c 20 62 75 74 20 6c 65 74 27 73 20  cost, but let's 
0710: 61 73 73 75 6d 65 20 74 68 65 79 20 64 6f 20 6e  assume they do n
0720: 6f 74 2e 29 0a 2a 2a 20 53 6f 20 61 6c 6c 20 63  ot.).** So all c
0730: 6f 73 74 73 20 63 61 6e 20 62 65 20 73 74 6f 72  osts can be stor
0740: 65 64 20 69 6e 20 61 20 31 36 2d 62 69 74 20 75  ed in a 16-bit u
0750: 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
0760: 77 69 74 68 6f 75 74 20 72 69 73 6b 0a 2a 2a 20  without risk.** 
0770: 6f 66 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2a 0a  of overflow..**.
0780: 2a 2a 20 43 6f 73 74 73 20 61 72 65 20 65 73 74  ** Costs are est
0790: 69 6d 61 74 65 73 2c 20 73 6f 20 64 6f 6e 27 74  imates, so don't
07a0: 20 67 6f 20 74 6f 20 74 68 65 20 63 6f 6d 70 75   go to the compu
07b0: 74 61 74 69 6f 6e 61 6c 20 74 72 6f 75 62 6c 65  tational trouble
07c0: 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 31   to compute.** 1
07d0: 30 2a 6c 6f 67 32 28 58 29 20 65 78 61 63 74 6c  0*log2(X) exactl
07e0: 79 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 20 63  y.  Instead, a c
07f0: 6c 6f 73 65 20 65 73 74 69 6d 61 74 65 20 69 73  lose estimate is
0800: 20 75 73 65 64 2e 20 20 41 6e 79 20 76 61 6c 75   used.  Any valu
0810: 65 20 6f 66 0a 2a 2a 20 58 3c 3d 31 20 69 73 20  e of.** X<=1 is 
0820: 73 74 6f 72 65 64 20 61 73 20 30 2e 20 20 58 3d  stored as 0.  X=
0830: 32 20 69 73 20 31 30 2e 20 20 58 3d 33 20 69 73  2 is 10.  X=3 is
0840: 20 31 36 2e 20 20 58 3d 31 30 30 30 20 69 73 20   16.  X=1000 is 
0850: 39 39 2e 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 54  99. etc..**.** T
0860: 68 65 20 74 6f 6f 6c 2f 77 68 65 72 65 63 6f 73  he tool/wherecos
0870: 74 74 65 73 74 2e 63 20 73 6f 75 72 63 65 20 66  ttest.c source f
0880: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ile implements a
0890: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 70 72   command-line pr
08a0: 6f 67 72 61 6d 0a 2a 2a 20 74 68 61 74 20 77 69  ogram.** that wi
08b0: 6c 6c 20 63 6f 6e 76 65 72 74 20 62 65 74 77 65  ll convert betwe
08c0: 65 6e 20 57 68 65 72 65 43 6f 73 74 20 74 6f 20  en WhereCost to 
08d0: 69 6e 74 65 67 65 72 73 20 61 6e 64 20 64 6f 20  integers and do 
08e0: 61 64 64 69 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  addition and.** 
08f0: 6d 75 6c 74 69 70 6c 69 63 61 74 69 6f 6e 20 6f  multiplication o
0900: 6e 20 57 68 65 72 65 43 6f 73 74 20 76 61 6c 75  n WhereCost valu
0910: 65 73 2e 20 20 54 68 61 74 20 63 6f 6d 6d 61 6e  es.  That comman
0920: 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d 20 69  d-line program i
0930: 73 20 61 0a 2a 2a 20 75 73 65 66 75 6c 20 75 74  s a.** useful ut
0940: 69 6c 69 74 79 20 74 6f 20 68 61 76 65 20 61 72  ility to have ar
0950: 6f 75 6e 64 20 77 68 65 6e 20 77 6f 72 6b 69 6e  ound when workin
0960: 67 20 77 69 74 68 20 74 68 69 73 20 6d 6f 64 75  g with this modu
0970: 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75  le..*/.typedef u
0980: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e  nsigned short in
0990: 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f 2a  t WhereCost;../*
09a0: 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20  .** This object 
09b0: 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72 6d 61  contains informa
09c0: 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 69  tion needed to i
09d0: 6d 70 6c 65 6d 65 6e 74 20 61 20 73 69 6e 67 6c  mplement a singl
09e0: 65 20 6e 65 73 74 65 64 0a 2a 2a 20 6c 6f 6f 70  e nested.** loop
09f0: 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65   in WHERE clause
0a00: 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 74 72 61 73 74  ..**.** Contrast
0a10: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 77 69 74   this object wit
0a20: 68 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 54 68  h WhereLoop.  Th
0a30: 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  is object descri
0a40: 62 65 73 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65  bes the.** imple
0a50: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
0a60: 20 6c 6f 6f 70 2e 20 20 57 68 65 72 65 4c 6f 6f   loop.  WhereLoo
0a70: 70 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  p describes the 
0a80: 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 20 54 68  algorithm..** Th
0a90: 69 73 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69  is object contai
0aa0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
0ab0: 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 61 6c  the WhereLoop al
0ac0: 67 6f 72 69 74 68 6d 20 61 73 20 6f 6e 65 20 6f  gorithm as one o
0ad0: 66 0a 2a 2a 20 69 74 73 20 65 6c 65 6d 65 6e 74  f.** its element
0ae0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 57 68 65  s..**.** The Whe
0af0: 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f  reInfo object co
0b00: 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20  ntains a single 
0b10: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
0b20: 20 6f 62 6a 65 63 74 20 66 6f 72 0a 2a 2a 20 65   object for.** e
0b30: 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ach term in the 
0b40: 46 52 4f 4d 20 63 6c 61 75 73 65 20 28 77 68 69  FROM clause (whi
0b50: 63 68 20 69 73 20 74 6f 20 73 61 79 2c 20 66 6f  ch is to say, fo
0b60: 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  r each of the.**
0b70: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 61 73   nested loops as
0b80: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 2e 20 20   implemented).  
0b90: 54 68 65 20 6f 72 64 65 72 20 6f 66 20 57 68 65  The order of Whe
0ba0: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20  reLevel objects 
0bb0: 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 74 68  determines.** th
0bc0: 65 20 6c 6f 6f 70 20 6e 65 73 74 65 64 20 6f 72  e loop nested or
0bd0: 64 65 72 2c 20 77 69 74 68 20 57 68 65 72 65 49  der, with WhereI
0be0: 6e 66 6f 2e 61 5b 30 5d 20 62 65 69 6e 67 20 74  nfo.a[0] being t
0bf0: 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 61 6e  he outer loop an
0c00: 64 0a 2a 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61  d.** WhereInfo.a
0c10: 5b 57 68 65 72 65 49 6e 66 6f 2e 6e 4c 65 76 65  [WhereInfo.nLeve
0c20: 6c 2d 31 5d 20 62 65 69 6e 67 20 74 68 65 20 69  l-1] being the i
0c30: 6e 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74  nner loop..*/.st
0c40: 72 75 63 74 20 57 68 65 72 65 4c 65 76 65 6c 20  ruct WhereLevel 
0c50: 7b 0a 20 20 69 6e 74 20 69 4c 65 66 74 4a 6f 69  {.  int iLeftJoi
0c60: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  n;        /* Mem
0c70: 6f 72 79 20 63 65 6c 6c 20 75 73 65 64 20 74 6f  ory cell used to
0c80: 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 45 46 54 20   implement LEFT 
0c90: 4f 55 54 45 52 20 4a 4f 49 4e 20 2a 2f 0a 20 20  OUTER JOIN */.  
0ca0: 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20  int iTabCur;    
0cb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
0cc0: 45 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  E cursor used to
0cd0: 20 61 63 63 65 73 73 20 74 68 65 20 74 61 62 6c   access the tabl
0ce0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  e */.  int iIdxC
0cf0: 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur;          /* 
0d00: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0d10: 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 70  used to access p
0d20: 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  Idx */.  int add
0d30: 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  rBrk;          /
0d40: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
0d50: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
0d60: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
0d70: 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 20  drNxt;          
0d80: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
0d90: 73 74 61 72 74 20 74 68 65 20 6e 65 78 74 20 49  start the next I
0da0: 4e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 2a 2f  N combination */
0db0: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b  .  int addrCont;
0dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
0dd0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
0de0: 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
0df0: 6c 6f 6f 70 20 63 79 63 6c 65 20 2a 2f 0a 20 20  loop cycle */.  
0e00: 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20  int addrFirst;  
0e10: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69        /* First i
0e20: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 69 6e  nstruction of in
0e30: 74 65 72 69 6f 72 20 6f 66 20 74 68 65 20 6c 6f  terior of the lo
0e40: 6f 70 20 2a 2f 0a 20 20 75 38 20 69 46 72 6f 6d  op */.  u8 iFrom
0e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0e60: 20 57 68 69 63 68 20 65 6e 74 72 79 20 69 6e 20   Which entry in 
0e70: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
0e80: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 70 35 3b 20  */.  u8 op, p5; 
0e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
0ea0: 63 6f 64 65 20 61 6e 64 20 50 35 20 6f 66 20 74  code and P5 of t
0eb0: 68 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 65  he opcode that e
0ec0: 6e 64 73 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  nds the loop */.
0ed0: 20 20 69 6e 74 20 70 31 2c 20 70 32 3b 20 20 20    int p1, p2;   
0ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61          /* Opera
0ef0: 6e 64 73 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  nds of the opcod
0f00: 65 20 75 73 65 64 20 74 6f 20 65 6e 64 73 20 74  e used to ends t
0f10: 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 6e 69  he loop */.  uni
0f20: 6f 6e 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  on {            
0f30: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
0f40: 6e 20 74 68 61 74 20 64 65 70 65 6e 64 73 20 6f  n that depends o
0f50: 6e 20 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  n pWLoop->wsFlag
0f60: 73 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  s */.    struct 
0f70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 6e 3b  {.      int nIn;
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f90: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
0fa0: 65 73 20 69 6e 20 61 49 6e 4c 6f 6f 70 5b 5d 20  es in aInLoop[] 
0fb0: 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
0fc0: 49 6e 4c 6f 6f 70 20 7b 0a 20 20 20 20 20 20 20  InLoop {.       
0fd0: 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
0fe0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
0ff0: 44 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 20  DBE cursor used 
1000: 62 79 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61  by this IN opera
1010: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tor */.        i
1020: 6e 74 20 61 64 64 72 49 6e 54 6f 70 3b 20 20 20  nt addrInTop;   
1030: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
1040: 74 68 65 20 49 4e 20 6c 6f 6f 70 20 2a 2f 0a 20  the IN loop */. 
1050: 20 20 20 20 20 20 20 75 38 20 65 45 6e 64 4c 6f         u8 eEndLo
1060: 6f 70 4f 70 3b 20 20 20 20 20 20 20 20 20 2f 2a  opOp;         /*
1070: 20 49 4e 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61   IN Loop termina
1080: 74 6f 72 2e 20 4f 50 5f 4e 65 78 74 20 6f 72 20  tor. OP_Next or 
1090: 4f 50 5f 50 72 65 76 20 2a 2f 0a 20 20 20 20 20  OP_Prev */.     
10a0: 20 7d 20 2a 61 49 6e 4c 6f 6f 70 3b 20 20 20 20   } *aInLoop;    
10b0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
10c0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68  ation about each
10d0: 20 6e 65 73 74 65 64 20 49 4e 20 6f 70 65 72 61   nested IN opera
10e0: 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 20 69 6e 3b  tor */.    } in;
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 2f 2a 20 55 73 65 64 20 77 68 65 6e 20 70 57   /* Used when pW
1110: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
1120: 45 52 45 5f 49 4e 5f 41 42 4c 45 20 2a 2f 0a 20  ERE_IN_ABLE */. 
1130: 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 69 64     Index *pCovid
1140: 78 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  x;       /* Poss
1150: 69 62 6c 65 20 63 6f 76 65 72 69 6e 67 20 69 6e  ible covering in
1160: 64 65 78 20 66 6f 72 20 57 48 45 52 45 5f 4d 55  dex for WHERE_MU
1170: 4c 54 49 5f 4f 52 20 2a 2f 0a 20 20 7d 20 75 3b  LTI_OR */.  } u;
1180: 0a 20 20 73 74 72 75 63 74 20 57 68 65 72 65 4c  .  struct WhereL
1190: 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 2f 2a  oop *pWLoop;  /*
11a0: 20 54 68 65 20 73 65 6c 65 63 74 65 64 20 57 68   The selected Wh
11b0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
11c0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  /.};../*.** Each
11d0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
11e0: 73 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  s object represe
11f0: 6e 74 73 20 61 6e 20 61 6c 67 6f 72 69 74 68 6d  nts an algorithm
1200: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
1210: 6f 6e 65 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 61  one.** term of a
1220: 20 6a 6f 69 6e 2e 20 20 45 76 65 72 79 20 74 65   join.  Every te
1230: 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
1240: 6c 61 75 73 65 20 77 69 6c 6c 20 68 61 76 65 20  lause will have 
1250: 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20  at least.** one 
1260: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
1270: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 28  ereLoop object (
1280: 75 6e 6c 65 73 73 20 49 4e 44 45 58 45 44 20 42  unless INDEXED B
1290: 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  Y constraints.**
12a0: 20 70 72 65 76 65 6e 74 20 61 20 71 75 65 72 79   prevent a query
12b0: 20 73 6f 6c 75 74 69 6f 6e 20 2d 20 77 68 69 63   solution - whic
12c0: 68 20 69 73 20 61 6e 20 65 72 72 6f 72 29 20 61  h is an error) a
12d0: 6e 64 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66  nd many terms of
12e0: 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
12f0: 75 73 65 20 77 69 6c 6c 20 68 61 76 65 20 6d 75  use will have mu
1300: 6c 74 69 70 6c 65 20 57 68 65 72 65 4c 6f 6f 70  ltiple WhereLoop
1310: 20 6f 62 6a 65 63 74 73 2c 20 65 61 63 68 20 64   objects, each d
1320: 65 73 63 72 69 62 69 6e 67 20 61 0a 2a 2a 20 70  escribing a.** p
1330: 6f 74 65 6e 74 69 61 6c 20 77 61 79 20 6f 66 20  otential way of 
1340: 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61  implementing tha
1350: 74 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65  t FROM-clause te
1360: 72 6d 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74  rm, together wit
1370: 68 0a 2a 2a 20 64 65 70 65 6e 64 65 6e 63 69 65  h.** dependencie
1380: 73 20 61 6e 64 20 63 6f 73 74 20 65 73 74 69 6d  s and cost estim
1390: 61 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74  ates for using t
13a0: 68 65 20 63 68 6f 73 65 6e 20 61 6c 67 6f 72 69  he chosen algori
13b0: 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79  thm..**.** Query
13c0: 20 70 6c 61 6e 6e 69 6e 67 20 63 6f 6e 73 69 73   planning consis
13d0: 74 73 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 75  ts of building u
13e0: 70 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f  p a collection o
13f0: 66 20 74 68 65 73 65 20 57 68 65 72 65 4c 6f 6f  f these WhereLoo
1400: 70 0a 2a 2a 20 6f 62 6a 65 63 74 73 2c 20 74 68  p.** objects, th
1410: 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61 20 70  en computing a p
1420: 61 72 74 69 63 75 6c 61 72 20 73 65 71 75 65 6e  articular sequen
1430: 63 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ce of WhereLoop 
1440: 6f 62 6a 65 63 74 73 2c 20 77 69 74 68 0a 2a 2a  objects, with.**
1450: 20 6f 6e 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   one WhereLoop o
1460: 62 6a 65 63 74 20 70 65 72 20 46 52 4f 4d 20 63  bject per FROM c
1470: 6c 61 75 73 65 20 74 65 72 6d 2c 20 74 68 61 74  lause term, that
1480: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 64 65 70   satisfy all dep
1490: 65 6e 64 65 6e 63 69 65 73 0a 2a 2a 20 61 6e 64  endencies.** and
14a0: 20 74 68 61 74 20 6d 69 6e 69 6d 69 7a 65 20 74   that minimize t
14b0: 68 65 20 6f 76 65 72 61 6c 6c 20 63 6f 73 74 2e  he overall cost.
14c0: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
14d0: 4c 6f 6f 70 20 7b 0a 20 20 42 69 74 6d 61 73 6b  Loop {.  Bitmask
14e0: 20 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 2f   prereq;       /
14f0: 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 6f 74 68  * Bitmask of oth
1500: 65 72 20 6c 6f 6f 70 73 20 74 68 61 74 20 6d 75  er loops that mu
1510: 73 74 20 72 75 6e 20 66 69 72 73 74 20 2a 2f 0a  st run first */.
1520: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 65    Bitmask maskSe
1530: 6c 66 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d 61  lf;     /* Bitma
1540: 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74  sk identifying t
1550: 61 62 6c 65 20 69 54 61 62 20 2a 2f 0a 23 69 66  able iTab */.#if
1560: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1570: 0a 20 20 63 68 61 72 20 63 49 64 3b 20 20 20 20  .  char cId;    
1580: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62           /* Symb
1590: 6f 6c 69 63 20 49 44 20 6f 66 20 74 68 69 73 20  olic ID of this 
15a0: 6c 6f 6f 70 20 66 6f 72 20 64 65 62 75 67 67 69  loop for debuggi
15b0: 6e 67 20 75 73 65 20 2a 2f 0a 23 65 6e 64 69 66  ng use */.#endif
15c0: 0a 20 20 75 38 20 69 54 61 62 3b 20 20 20 20 20  .  u8 iTab;     
15d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
15e0: 74 69 6f 6e 20 69 6e 20 46 52 4f 4d 20 63 6c 61  tion in FROM cla
15f0: 75 73 65 20 6f 66 20 74 61 62 6c 65 20 66 6f 72  use of table for
1600: 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
1610: 75 38 20 69 53 6f 72 74 49 64 78 3b 20 20 20 20  u8 iSortIdx;    
1620: 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67        /* Sorting
1630: 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 2e 20 20   index number.  
1640: 30 3d 3d 4e 6f 6e 65 20 2a 2f 0a 20 20 57 68 65  0==None */.  Whe
1650: 72 65 43 6f 73 74 20 72 53 65 74 75 70 3b 20 20  reCost rSetup;  
1660: 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 73     /* One-time s
1670: 65 74 75 70 20 63 6f 73 74 20 28 65 78 3a 20 63  etup cost (ex: c
1680: 72 65 61 74 65 20 74 72 61 6e 73 69 65 6e 74 20  reate transient 
1690: 69 6e 64 65 78 29 20 2a 2f 0a 20 20 57 68 65 72  index) */.  Wher
16a0: 65 43 6f 73 74 20 72 52 75 6e 3b 20 20 20 20 20  eCost rRun;     
16b0: 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 72 75 6e    /* Cost of run
16c0: 6e 69 6e 67 20 65 61 63 68 20 6c 6f 6f 70 20 2a  ning each loop *
16d0: 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e 4f  /.  WhereCost nO
16e0: 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74  ut;       /* Est
16f0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
1700: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
1710: 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74    union {.    st
1720: 72 75 63 74 20 7b 20 20 20 20 20 20 20 20 20 20  ruct {          
1730: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1740: 69 6f 6e 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ion for internal
1750: 20 62 74 72 65 65 20 74 61 62 6c 65 73 20 2a 2f   btree tables */
1760: 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 3b 20  .      int nEq; 
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1780: 20 4e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c   Number of equal
1790: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
17a0: 2a 2f 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  */.      Index *
17b0: 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
17c0: 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 2c 20 6f  /* Index used, o
17d0: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 7d 20  r NULL */.    } 
17e0: 62 74 72 65 65 3b 0a 20 20 20 20 73 74 72 75 63  btree;.    struc
17f0: 74 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  t {             
1800: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1810: 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   for virtual tab
1820: 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  les */.      int
1830: 20 69 64 78 4e 75 6d 3b 20 20 20 20 20 20 20 20   idxNum;        
1840: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
1850: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ber */.      u8 
1860: 6e 65 65 64 46 72 65 65 3b 20 20 20 20 20 20 20  needFree;       
1870: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
1880: 71 6c 69 74 65 33 5f 66 72 65 65 28 69 64 78 53  qlite3_free(idxS
1890: 74 72 29 20 69 73 20 6e 65 65 64 65 64 20 2a 2f  tr) is needed */
18a0: 0a 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65  .      u8 isOrde
18b0: 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  red;          /*
18c0: 20 54 72 75 65 20 69 66 20 73 61 74 69 73 66 69   True if satisfi
18d0: 65 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  es ORDER BY */. 
18e0: 20 20 20 20 20 75 31 36 20 6f 6d 69 74 4d 61 73       u16 omitMas
18f0: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  k;          /* T
1900: 65 72 6d 73 20 74 68 61 74 20 6d 61 79 20 62 65  erms that may be
1910: 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 20 20   omitted */.    
1920: 20 20 63 68 61 72 20 2a 69 64 78 53 74 72 3b 20    char *idxStr; 
1930: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1940: 78 20 69 64 65 6e 74 69 66 69 65 72 20 73 74 72  x identifier str
1950: 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 20 76 74 61  ing */.    } vta
1960: 62 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  b;.  } u;.  u32 
1970: 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  wsFlags;        
1980: 20 20 2f 2a 20 57 48 45 52 45 5f 2a 20 66 6c 61    /* WHERE_* fla
1990: 67 73 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  gs describing th
19a0: 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20  e plan */.  u16 
19b0: 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  nLTerm;         
19c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
19d0: 6e 74 72 69 65 73 20 69 6e 20 61 4c 54 65 72 6d  ntries in aLTerm
19e0: 5b 5d 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a 20 77 68  [] */.  /**** wh
19f0: 65 72 65 4c 6f 6f 70 58 66 65 72 28 29 20 63 6f  ereLoopXfer() co
1a00: 70 69 65 73 20 66 69 65 6c 64 73 20 61 62 6f 76  pies fields abov
1a10: 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e **************
1a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 20 64 65 66  *********/.# def
1a30: 69 6e 65 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58  ine WHERE_LOOP_X
1a40: 46 45 52 5f 53 5a 20 6f 66 66 73 65 74 6f 66 28  FER_SZ offsetof(
1a50: 57 68 65 72 65 4c 6f 6f 70 2c 6e 4c 53 6c 6f 74  WhereLoop,nLSlot
1a60: 29 0a 20 20 75 31 36 20 6e 4c 53 6c 6f 74 3b 20  ).  u16 nLSlot; 
1a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a80: 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 61 6c 6c  ber of slots all
1a90: 6f 63 61 74 65 64 20 66 6f 72 20 61 4c 54 65 72  ocated for aLTer
1aa0: 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  m[] */.  WhereTe
1ab0: 72 6d 20 2a 2a 61 4c 54 65 72 6d 3b 20 20 20 2f  rm **aLTerm;   /
1ac0: 2a 20 57 68 65 72 65 54 65 72 6d 73 20 75 73 65  * WhereTerms use
1ad0: 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
1ae0: 20 2a 70 4e 65 78 74 4c 6f 6f 70 3b 20 2f 2a 20   *pNextLoop; /* 
1af0: 4e 65 78 74 20 57 68 65 72 65 4c 6f 6f 70 20 6f  Next WhereLoop o
1b00: 62 6a 65 63 74 20 69 6e 20 74 68 65 20 57 68 65  bject in the Whe
1b10: 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  reClause */.  Wh
1b20: 65 72 65 54 65 72 6d 20 2a 61 4c 54 65 72 6d 53  ereTerm *aLTermS
1b30: 70 61 63 65 5b 34 5d 3b 20 20 2f 2a 20 49 6e 69  pace[4];  /* Ini
1b40: 74 69 61 6c 20 61 4c 54 65 72 6d 5b 5d 20 73 70  tial aLTerm[] sp
1b50: 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 46 6f  ace */.};../* Fo
1b60: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1b70: 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  n of methods */.
1b80: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1b90: 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74  LoopResize(sqlit
1ba0: 65 33 2a 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c  e3*, WhereLoop*,
1bb0: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61   int);../*.** Ea
1bc0: 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ch instance of t
1bd0: 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73  his object holds
1be0: 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 57   a sequence of W
1bf0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1c00: 0a 2a 2a 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  .** that impleme
1c10: 6e 74 20 73 6f 6d 65 20 6f 72 20 61 6c 6c 20 6f  nt some or all o
1c20: 66 20 61 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  f a query plan..
1c30: 2a 2a 0a 2a 2a 20 54 68 69 6e 6b 20 6f 66 20 65  **.** Think of e
1c40: 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ach WhereLoop ob
1c50: 6a 65 63 74 73 20 61 73 20 61 20 6e 6f 64 65 20  jects as a node 
1c60: 69 6e 20 61 20 67 72 61 70 68 2c 20 77 68 69 63  in a graph, whic
1c70: 68 20 61 72 63 73 0a 2a 2a 20 73 68 6f 77 69 6e  h arcs.** showin
1c80: 67 20 64 65 70 65 6e 64 65 6e 63 65 73 20 61 6e  g dependences an
1c90: 64 20 63 6f 73 74 73 20 66 6f 72 20 74 72 61 76  d costs for trav
1ca0: 65 6c 6c 69 6e 67 20 62 65 74 77 65 65 6e 20 6e  elling between n
1cb0: 6f 64 65 73 2e 20 20 28 54 68 61 74 20 69 73 0a  odes.  (That is.
1cc0: 2a 2a 20 6e 6f 74 20 61 20 63 6f 6d 70 6c 65 74  ** not a complet
1cd0: 65 6c 79 20 61 63 63 75 72 61 74 65 20 64 65 73  ely accurate des
1ce0: 63 72 69 70 74 69 6f 6e 20 62 65 63 61 75 73 65  cription because
1cf0: 20 57 68 65 72 65 4c 6f 6f 70 20 63 6f 73 74 73   WhereLoop costs
1d00: 20 61 72 65 20 61 0a 2a 2a 20 76 65 63 74 6f 72   are a.** vector
1d10: 2c 20 6e 6f 74 20 61 20 73 63 61 6c 61 72 2c 20  , not a scalar, 
1d20: 61 6e 64 20 62 65 63 61 75 73 65 20 64 65 70 65  and because depe
1d30: 6e 64 65 6e 63 65 73 20 61 72 65 20 6d 61 6e 79  ndences are many
1d40: 2d 74 6f 2d 6f 6e 65 2c 20 6e 6f 74 0a 2a 2a 20  -to-one, not.** 
1d50: 6f 6e 65 2d 74 6f 2d 6f 6e 65 20 61 73 20 61 72  one-to-one as ar
1d60: 65 20 67 72 61 70 68 20 6e 6f 64 65 73 2e 20 20  e graph nodes.  
1d70: 42 75 74 20 69 74 20 69 73 20 61 20 75 73 65 66  But it is a usef
1d80: 75 6c 20 76 69 73 75 61 6c 69 7a 61 74 69 6f 6e  ul visualization
1d90: 20 61 69 64 2e 29 0a 2a 2a 20 54 68 65 6e 20 61   aid.).** Then a
1da0: 20 57 68 65 72 65 50 61 74 68 20 6f 62 6a 65 63   WherePath objec
1db0: 74 20 69 73 20 61 20 70 61 74 68 20 74 68 72 6f  t is a path thro
1dc0: 75 67 68 20 74 68 65 20 67 72 61 70 68 20 74 68  ugh the graph th
1dd0: 61 74 20 76 69 73 69 74 73 20 73 6f 6d 65 0a 2a  at visits some.*
1de0: 2a 20 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  * or all of the 
1df0: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1e00: 73 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  s once..**.** Th
1e10: 65 20 22 73 6f 6c 76 65 72 22 20 77 6f 72 6b 73  e "solver" works
1e20: 20 62 79 20 63 72 65 61 74 69 6e 67 20 74 68 65   by creating the
1e30: 20 4e 20 62 65 73 74 20 57 68 65 72 65 50 61 74   N best WherePat
1e40: 68 20 6f 62 6a 65 63 74 73 20 6f 66 20 6c 65 6e  h objects of len
1e50: 67 74 68 0a 2a 2a 20 31 2e 20 20 54 68 65 6e 20  gth.** 1.  Then 
1e60: 75 73 69 6e 67 20 74 68 6f 73 65 20 61 73 20 61  using those as a
1e70: 20 62 61 73 69 73 20 74 6f 20 63 6f 6d 70 75 74   basis to comput
1e80: 65 20 74 68 65 20 4e 20 62 65 73 74 20 57 68 65  e the N best Whe
1e90: 72 65 50 61 74 68 20 6f 62 6a 65 63 74 73 0a 2a  rePath objects.*
1ea0: 2a 20 6f 66 20 6c 65 6e 67 74 68 20 32 2e 20 20  * of length 2.  
1eb0: 41 6e 64 20 73 6f 20 66 6f 72 74 68 20 75 6e 74  And so forth unt
1ec0: 69 6c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  il the length of
1ed0: 20 57 68 65 72 65 50 61 74 68 73 20 65 71 75 61   WherePaths equa
1ee0: 6c 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  ls the.** number
1ef0: 20 6f 66 20 6e 6f 64 65 73 20 69 6e 20 74 68 65   of nodes in the
1f00: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1f10: 68 65 20 62 65 73 74 20 28 6c 6f 77 65 73 74 20  he best (lowest 
1f20: 63 6f 73 74 29 20 57 68 65 72 65 50 61 74 68 0a  cost) WherePath.
1f30: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 69 73  ** at the end is
1f40: 20 74 68 65 20 63 68 6f 6f 73 65 6e 20 71 75 65   the choosen que
1f50: 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 73 74 72 75  ry plan..*/.stru
1f60: 63 74 20 57 68 65 72 65 50 61 74 68 20 7b 0a 20  ct WherePath {. 
1f70: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4c 6f 6f   Bitmask maskLoo
1f80: 70 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  p;     /* Bitmas
1f90: 6b 20 6f 66 20 61 6c 6c 20 57 68 65 72 65 4c 6f  k of all WhereLo
1fa0: 6f 70 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  op objects in th
1fb0: 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 42 69 74  is path */.  Bit
1fc0: 6d 61 73 6b 20 72 65 76 4c 6f 6f 70 3b 20 20 20  mask revLoop;   
1fd0: 20 20 20 2f 2a 20 61 4c 6f 6f 70 5b 5d 73 20 74     /* aLoop[]s t
1fe0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65  hat should be re
1ff0: 76 65 72 73 65 64 20 66 6f 72 20 4f 52 44 45 52  versed for ORDER
2000: 20 42 59 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f   BY */.  WhereCo
2010: 73 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 2f  st nRow;       /
2020: 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  * Estimated numb
2030: 65 72 20 6f 66 20 72 6f 77 73 20 67 65 6e 65 72  er of rows gener
2040: 61 74 65 64 20 62 79 20 74 68 69 73 20 70 61 74  ated by this pat
2050: 68 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  h */.  WhereCost
2060: 20 72 43 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20   rCost;      /* 
2070: 54 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 74 68  Total cost of th
2080: 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 75 38 20  is path */.  u8 
2090: 69 73 4f 72 64 65 72 65 64 3b 20 20 20 20 20 20  isOrdered;      
20a0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
20b0: 69 73 20 70 61 74 68 20 73 61 74 69 73 66 69 65  is path satisfie
20c0: 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  s ORDER BY */.  
20d0: 75 38 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69  u8 isOrderedVali
20e0: 64 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  d;    /* True if
20f0: 20 74 68 65 20 69 73 4f 72 64 65 72 65 64 20 66   the isOrdered f
2100: 69 65 6c 64 20 69 73 20 76 61 6c 69 64 20 2a 2f  ield is valid */
2110: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 61  .  WhereLoop **a
2120: 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 41 72 72 61  Loop;    /* Arra
2130: 79 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  y of WhereLoop o
2140: 62 6a 65 63 74 73 20 69 6d 70 6c 65 6d 65 6e 74  bjects implement
2150: 69 6e 67 20 74 68 69 73 20 70 61 74 68 20 2a 2f  ing this path */
2160: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71  .};../*.** The q
2170: 75 65 72 79 20 67 65 6e 65 72 61 74 6f 72 20 75  uery generator u
2180: 73 65 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ses an array of 
2190: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 69  instances of thi
21a0: 73 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a  s structure to.*
21b0: 2a 20 68 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a  * help it analyz
21c0: 65 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  e the subexpress
21d0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 57 48 45 52  ions of the WHER
21e0: 45 20 63 6c 61 75 73 65 2e 20 20 45 61 63 68 20  E clause.  Each 
21f0: 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20  WHERE.** clause 
2200: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
2210: 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20   separated from 
2220: 74 68 65 20 6f 74 68 65 72 73 20 62 79 20 41 4e  the others by AN
2230: 44 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  D operators,.** 
2240: 75 73 75 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65  usually, or some
2250: 74 69 6d 65 73 20 73 75 62 65 78 70 72 65 73 73  times subexpress
2260: 69 6f 6e 73 20 73 65 70 61 72 61 74 65 64 20 62  ions separated b
2270: 79 20 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  y OR..**.** All 
2280: 57 68 65 72 65 54 65 72 6d 73 20 61 72 65 20 63  WhereTerms are c
2290: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 61 20  ollected into a 
22a0: 73 69 6e 67 6c 65 20 57 68 65 72 65 43 6c 61 75  single WhereClau
22b0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 0a  se structure.  .
22c0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
22d0: 20 69 64 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a   identity holds:
22e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 68  .**.**        Wh
22f0: 65 72 65 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57  ereTerm.pWC->a[W
2300: 68 65 72 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d  hereTerm.idx] ==
2310: 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a   WhereTerm.**.**
2320: 20 57 68 65 6e 20 61 20 74 65 72 6d 20 69 73 20   When a term is 
2330: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
2340: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2350: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a  X <op> <expr>.**
2360: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
2370: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64   column name and
2380: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20   <op> is one of 
2390: 63 65 72 74 61 69 6e 20 6f 70 65 72 61 74 6f 72  certain operator
23a0: 73 2c 0a 2a 2a 20 74 68 65 6e 20 57 68 65 72 65  s,.** then Where
23b0: 54 65 72 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20  Term.leftCursor 
23c0: 61 6e 64 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  and WhereTerm.u.
23d0: 6c 65 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72  leftColumn recor
23e0: 64 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  d the.** cursor 
23f0: 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d  number and colum
2400: 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 20  n number for X. 
2410: 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72   WhereTerm.eOper
2420: 61 74 6f 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ator records.** 
2430: 74 68 65 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61  the <op> using a
2440: 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e   bitmask encodin
2450: 67 20 64 65 66 69 6e 65 64 20 62 79 20 57 4f 5f  g defined by WO_
2460: 78 78 78 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a  xxx below.  The.
2470: 2a 2a 20 75 73 65 20 6f 66 20 61 20 62 69 74 6d  ** use of a bitm
2480: 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  ask encoding for
2490: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 61 6c   the operator al
24a0: 6c 6f 77 73 20 75 73 20 74 6f 20 73 65 61 72 63  lows us to searc
24b0: 68 0a 2a 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72  h.** quickly for
24c0: 20 74 65 72 6d 73 20 74 68 61 74 20 6d 61 74 63   terms that matc
24d0: 68 20 61 6e 79 20 6f 66 20 73 65 76 65 72 61 6c  h any of several
24e0: 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61   different opera
24f0: 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68  tors..**.** A Wh
2500: 65 72 65 54 65 72 6d 20 6d 69 67 68 74 20 61 6c  ereTerm might al
2510: 73 6f 20 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72  so be two or mor
2520: 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65  e subterms conne
2530: 63 74 65 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a  cted by OR:.**.*
2540: 2a 20 20 20 20 20 20 20 20 20 28 74 31 2e 58 20  *         (t1.X 
2550: 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20  <op> <expr>) OR 
2560: 28 74 31 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72  (t1.Y <op> <expr
2570: 3e 29 20 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a  >) OR .....**.**
2580: 20 49 6e 20 74 68 69 73 20 73 65 63 6f 6e 64 20   In this second 
2590: 63 61 73 65 2c 20 77 74 46 6c 61 67 20 61 73 20  case, wtFlag as 
25a0: 74 68 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20  the TERM_ORINFO 
25b0: 73 65 74 20 61 6e 64 20 65 4f 70 65 72 61 74 6f  set and eOperato
25c0: 72 3d 3d 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20  r==WO_OR.** and 
25d0: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
25e0: 70 4f 72 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f  pOrInfo field po
25f0: 69 6e 74 73 20 74 6f 20 61 75 78 69 6c 69 61 72  ints to auxiliar
2600: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  y information th
2610: 61 74 0a 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74  at.** is collect
2620: 65 64 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a  ed about the.**.
2630: 2a 2a 20 49 66 20 61 20 74 65 72 6d 20 69 6e 20  ** If a term in 
2640: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2650: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
2660: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
2670: 6f 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61  o previous.** ca
2680: 74 65 67 6f 72 69 65 73 2c 20 74 68 65 6e 20 65  tegories, then e
2690: 4f 70 65 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68  Operator==0.  Th
26a0: 65 20 57 68 65 72 65 54 65 72 6d 2e 70 45 78 70  e WhereTerm.pExp
26b0: 72 20 66 69 65 6c 64 20 69 73 20 73 74 69 6c 6c  r field is still
26c0: 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f   set.** to the o
26d0: 72 69 67 69 6e 61 6c 20 73 75 62 65 78 70 72 65  riginal subexpre
26e0: 73 73 69 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e  ssion content an
26f0: 64 20 77 74 46 6c 61 67 73 20 69 73 20 73 65 74  d wtFlags is set
2700: 20 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 6c   up appropriatel
2710: 79 0a 2a 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65  y.** but no othe
2720: 72 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  r fields in the 
2730: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
2740: 20 61 72 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e   are meaningful.
2750: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65  .**.** When eOpe
2760: 72 61 74 6f 72 21 3d 30 2c 20 70 72 65 72 65 71  rator!=0, prereq
2770: 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71  Right and prereq
2780: 41 6c 6c 20 72 65 63 6f 72 64 20 73 65 74 73 20  All record sets 
2790: 6f 66 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  of cursor number
27a0: 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79 20 64  s,.** but they d
27b0: 6f 20 73 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e  o so indirectly.
27c0: 20 20 41 20 73 69 6e 67 6c 65 20 57 68 65 72 65    A single Where
27d0: 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
27e0: 65 20 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20  e translates.** 
27f0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e  cursor number in
2800: 74 6f 20 62 69 74 73 20 61 6e 64 20 74 68 65 20  to bits and the 
2810: 74 72 61 6e 73 6c 61 74 65 64 20 62 69 74 20 69  translated bit i
2820: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
2830: 70 72 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73  prereq.** fields
2840: 2e 20 20 54 68 65 20 74 72 61 6e 73 6c 61 74 69  .  The translati
2850: 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 6f 72  on is used in or
2860: 64 65 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20  der to maximize 
2870: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
2880: 20 62 69 74 73 20 74 68 61 74 20 77 69 6c 6c 20   bits that will 
2890: 66 69 74 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  fit in a Bitmask
28a0: 2e 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73  .  The VDBE curs
28b0: 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74  or numbers might
28c0: 20 62 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75   be.** spread ou
28d0: 74 20 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e  t over the non-n
28e0: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 73  egative integers
28f0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
2900: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  the cursor.** nu
2910: 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65 20 33  mbers might be 3
2920: 2c 20 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20  , 8, 9, 10, 20, 
2930: 32 33 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e 20  23, 41, and 45. 
2940: 20 54 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65   The WhereMaskSe
2950: 74 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 73 20  t.** translates 
2960: 74 68 65 73 65 20 73 70 61 72 73 65 20 63 75 72  these sparse cur
2970: 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f  sor numbers into
2980: 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74   consecutive int
2990: 65 67 65 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69  egers.** beginni
29a0: 6e 67 20 77 69 74 68 20 30 20 69 6e 20 6f 72 64  ng with 0 in ord
29b0: 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 62  er to make the b
29c0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 75 73 65  est possible use
29d0: 20 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c   of the availabl
29e0: 65 0a 2a 2a 20 62 69 74 73 20 69 6e 20 74 68 65  e.** bits in the
29f0: 20 42 69 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69   Bitmask.  So, i
2a00: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
2a10: 6f 76 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ove, the cursor 
2a20: 6e 75 6d 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64  numbers.** would
2a30: 20 62 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   be mapped into 
2a40: 69 6e 74 65 67 65 72 73 20 30 20 74 68 72 6f 75  integers 0 throu
2a50: 67 68 20 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  gh 7..**.** The 
2a60: 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  number of terms 
2a70: 69 6e 20 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d  in a join is lim
2a80: 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
2a90: 65 72 20 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e  er of bits.** in
2aa0: 20 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64   prereqRight and
2ab0: 20 70 72 65 72 65 71 41 6c 6c 2e 20 20 54 68 65   prereqAll.  The
2ac0: 20 64 65 66 61 75 6c 74 20 69 73 20 36 34 20 62   default is 64 b
2ad0: 69 74 73 2c 20 68 65 6e 63 65 20 53 51 4c 69 74  its, hence SQLit
2ae0: 65 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c  e.** is only abl
2af0: 65 20 74 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69  e to process joi
2b00: 6e 73 20 77 69 74 68 20 36 34 20 6f 72 20 66 65  ns with 64 or fe
2b10: 77 65 72 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  wer tables..*/.s
2b20: 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d 20  truct WhereTerm 
2b30: 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75  ointer to the su
2b60: 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74  bexpression that
2b70: 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f   is this term */
2b80: 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
2b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
2ba0: 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61  sable pWC->a[iPa
2bb0: 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20  rent] when this 
2bc0: 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f  term disabled */
2bd0: 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f  .  int leftCurso
2be0: 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  r;         /* Cu
2bf0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58  rsor number of X
2c00: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
2c10: 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b  r>" */.  union {
2c20: 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c  .    int leftCol
2c30: 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  umn;         /* 
2c40: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
2c50: 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65   X in "X <op> <e
2c60: 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65  xpr>" */.    Whe
2c70: 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66  reOrInfo *pOrInf
2c80: 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e  o;   /* Extra in
2c90: 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f  formation if (eO
2ca0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
2cb0: 21 3d 30 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  !=0 */.    Where
2cc0: 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66  AndInfo *pAndInf
2cd0: 6f 3b 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f  o; /* Extra info
2ce0: 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70 65  rmation if (eOpe
2cf0: 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21 3d  rator& WO_AND)!=
2d00: 30 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 31  0 */.  } u;.  u1
2d10: 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 20  6 eOperator;    
2d20: 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78        /* A WO_xx
2d30: 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 69 6e   value describin
2d40: 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 77  g <op> */.  u8 w
2d50: 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  tFlags;         
2d60: 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78 20      /* TERM_xxx 
2d70: 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65 20  bit flags.  See 
2d80: 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e 43  below */.  u8 nC
2d90: 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
2da0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2db0: 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20 6d 75  children that mu
2dc0: 73 74 20 64 69 73 61 62 6c 65 20 75 73 20 2a 2f  st disable us */
2dd0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2de0: 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC;       /* Th
2df0: 65 20 63 6c 61 75 73 65 20 74 68 69 73 20 74 65  e clause this te
2e00: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a 2f  rm is part of */
2e10: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
2e20: 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42 69  qRight;    /* Bi
2e30: 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20  tmask of tables 
2e40: 75 73 65 64 20 62 79 20 70 45 78 70 72 2d 3e 70  used by pExpr->p
2e50: 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61  Right */.  Bitma
2e60: 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20  sk prereqAll;   
2e70: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
2e80: 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63   tables referenc
2e90: 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f 0a 7d  ed by pExpr */.}
2ea0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
2eb0: 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72 65   values of Where
2ec0: 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a 2f 0a  Term.wtFlags.*/.
2ed0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e  #define TERM_DYN
2ee0: 41 4d 49 43 20 20 20 20 30 78 30 31 20 20 20 2f  AMIC    0x01   /
2ef0: 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  * Need to call s
2f00: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
2f10: 28 64 62 2c 20 70 45 78 70 72 29 20 2a 2f 0a 23  (db, pExpr) */.#
2f20: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49 52 54  define TERM_VIRT
2f30: 55 41 4c 20 20 20 20 30 78 30 32 20 20 20 2f 2a  UAL    0x02   /*
2f40: 20 41 64 64 65 64 20 62 79 20 74 68 65 20 6f 70   Added by the op
2f50: 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f 74  timizer.  Do not
2f60: 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65   code */.#define
2f70: 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20 20 20   TERM_CODED     
2f80: 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69 73 20   0x04   /* This 
2f90: 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64 79 20  term is already 
2fa0: 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  coded */.#define
2fb0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20 20 20   TERM_COPIED    
2fc0: 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73 20 61   0x08   /* Has a
2fd0: 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69 6e   child */.#defin
2fe0: 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 20 20  e TERM_ORINFO   
2ff0: 20 20 30 78 31 30 20 20 20 2f 2a 20 4e 65 65 64    0x10   /* Need
3000: 20 74 6f 20 66 72 65 65 20 74 68 65 20 57 68 65   to free the Whe
3010: 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f  reTerm.u.pOrInfo
3020: 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65 66 69   object */.#defi
3030: 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20  ne TERM_ANDINFO 
3040: 20 20 20 30 78 32 30 20 20 20 2f 2a 20 4e 65 65     0x20   /* Nee
3050: 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57 68  d to free the Wh
3060: 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64 49 6e  ereTerm.u.pAndIn
3070: 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66 69 6e  fo obj */.#defin
3080: 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20 20  e TERM_OR_OK    
3090: 20 20 30 78 34 30 20 20 20 2f 2a 20 55 73 65 64    0x40   /* Used
30a0: 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75 73   during OR-claus
30b0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a  e processing */.
30c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
30d0: 41 42 4c 45 5f 53 54 41 54 33 0a 23 20 20 64 65  ABLE_STAT3.#  de
30e0: 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  fine TERM_VNULL 
30f0: 20 20 20 30 78 38 30 20 20 20 2f 2a 20 4d 61 6e     0x80   /* Man
3100: 75 66 61 63 74 75 72 65 64 20 78 3e 4e 55 4c 4c  ufactured x>NULL
3110: 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74 65 72 6d   or x<=NULL term
3120: 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20 64 65 66   */.#else.#  def
3130: 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20  ine TERM_VNULL  
3140: 20 20 30 78 30 30 20 20 20 2f 2a 20 44 69 73 61    0x00   /* Disa
3150: 62 6c 65 64 20 69 66 20 6e 6f 74 20 75 73 69 6e  bled if not usin
3160: 67 20 73 74 61 74 33 20 2a 2f 0a 23 65 6e 64 69  g stat3 */.#endi
3170: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  f../*.** An inst
3180: 61 6e 63 65 20 6f 66 20 74 68 65 20 57 68 65 72  ance of the Wher
3190: 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 69 73 20  eScan object is 
31a0: 75 73 65 64 20 61 73 20 61 6e 20 69 74 65 72 61  used as an itera
31b0: 74 6f 72 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67  tor for locating
31c0: 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65  .** terms in the
31d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
31e0: 61 74 20 61 72 65 20 75 73 65 66 75 6c 20 74 6f  at are useful to
31f0: 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   the query plann
3200: 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  er..*/.struct Wh
3210: 65 72 65 53 63 61 6e 20 7b 0a 20 20 57 68 65 72  ereScan {.  Wher
3220: 65 43 6c 61 75 73 65 20 2a 70 4f 72 69 67 57 43  eClause *pOrigWC
3230: 3b 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  ;      /* Origin
3240: 61 6c 2c 20 69 6e 6e 65 72 6d 6f 73 74 20 57 68  al, innermost Wh
3250: 65 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57  ereClause */.  W
3260: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
3270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
3280: 72 65 43 6c 61 75 73 65 20 63 75 72 72 65 6e 74  reClause current
3290: 6c 79 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  ly being scanned
32a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   */.  char *zCol
32b0: 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  lName;          
32c0: 20 2f 2a 20 52 65 71 75 69 72 65 64 20 63 6f 6c   /* Required col
32d0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c  lating sequence,
32e0: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
32f0: 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 20 20    char idxaff;  
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3310: 4d 75 73 74 20 6d 61 74 63 68 20 74 68 69 73 20  Must match this 
3320: 61 66 66 69 6e 69 74 79 2c 20 69 66 20 7a 43 6f  affinity, if zCo
3330: 6c 6c 4e 61 6d 65 21 3d 4e 55 4c 4c 20 2a 2f 0a  llName!=NULL */.
3340: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3350: 6e 45 71 75 69 76 3b 20 20 20 20 20 20 2f 2a 20  nEquiv;      /* 
3360: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
3370: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f  s in aEquiv[] */
3380: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
3390: 20 69 45 71 75 69 76 3b 20 20 20 20 20 20 2f 2a   iEquiv;      /*
33a0: 20 4e 65 78 74 20 75 6e 75 73 65 64 20 73 6c 6f   Next unused slo
33b0: 74 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f  t in aEquiv[] */
33c0: 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20 20  .  u32 opMask;  
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33e0: 20 41 63 63 65 70 74 61 62 6c 65 20 6f 70 65 72   Acceptable oper
33f0: 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6b  ators */.  int k
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20        /* Resume 
3420: 73 63 61 6e 6e 69 6e 67 20 61 74 20 74 68 69 73  scanning at this
3430: 2d 3e 70 57 43 2d 3e 61 5b 74 68 69 73 2d 3e 6b  ->pWC->a[this->k
3440: 5d 20 2a 2f 0a 20 20 69 6e 74 20 61 45 71 75 69  ] */.  int aEqui
3450: 76 5b 32 32 5d 3b 20 20 20 20 20 20 20 20 20 20  v[22];          
3460: 20 20 2f 2a 20 43 75 72 73 6f 72 2c 43 6f 6c 75    /* Cursor,Colu
3470: 6d 6e 20 70 61 69 72 73 20 66 6f 72 20 65 71 75  mn pairs for equ
3480: 69 76 61 6c 65 6e 63 65 20 63 6c 61 73 73 65 73  ivalence classes
3490: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
34a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
34b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
34c0: 74 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69  ture holds all i
34d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
34e0: 20 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75   a.** WHERE clau
34f0: 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73  se.  Mostly this
3500: 20 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20   is a container 
3510: 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  for one or more 
3520: 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a  WhereTerms..**.*
3530: 2a 20 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  * Explanation of
3540: 20 70 4f 75 74 65 72 3a 20 20 46 6f 72 20 61 20   pOuter:  For a 
3550: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
3560: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
3570: 20 20 20 20 20 20 20 20 20 61 20 41 4e 44 20 28           a AND (
3580: 28 62 20 41 4e 44 20 63 29 20 4f 52 20 28 64 20  (b AND c) OR (d 
3590: 41 4e 44 20 65 29 29 20 41 4e 44 20 66 0a 2a 2a  AND e)) AND f.**
35a0: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65  .** There are se
35b0: 70 61 72 61 74 65 20 57 68 65 72 65 43 6c 61 75  parate WhereClau
35c0: 73 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 74  se objects for t
35d0: 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 20  he whole clause 
35e0: 61 6e 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  and for.** the s
35f0: 75 62 63 6c 61 75 73 65 73 20 22 28 62 20 41 4e  ubclauses "(b AN
3600: 44 20 63 29 22 20 61 6e 64 20 22 28 64 20 41 4e  D c)" and "(d AN
3610: 44 20 65 29 22 2e 20 20 54 68 65 20 70 4f 75 74  D e)".  The pOut
3620: 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a  er field of the.
3630: 2a 2a 20 73 75 62 63 6c 61 75 73 65 73 20 70 6f  ** subclauses po
3640: 69 6e 74 73 20 74 6f 20 74 68 65 20 57 68 65 72  ints to the Wher
3650: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 66  eClause object f
3660: 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c 61  or the whole cla
3670: 75 73 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  use..*/.struct W
3680: 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 57  hereClause {.  W
3690: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
36a0: 3b 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45  ;       /* WHERE
36b0: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
36c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
36d0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 75  WhereClause *pOu
36e0: 74 65 72 3b 20 20 20 20 20 2f 2a 20 4f 75 74 65  ter;     /* Oute
36f0: 72 20 63 6f 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f  r conjunction */
3700: 0a 20 20 75 38 20 6f 70 3b 20 20 20 20 20 20 20  .  u8 op;       
3710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3720: 70 6c 69 74 20 6f 70 65 72 61 74 6f 72 2e 20 20  plit operator.  
3730: 54 4b 5f 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20  TK_AND or TK_OR 
3740: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3760: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
3770: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b   */.  int nSlot;
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3790: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
37a0: 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20  ies in a[] */.  
37b0: 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 20 20 20  WhereTerm *a;   
37c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68           /* Each
37d0: 20 61 5b 5d 20 64 65 73 63 72 69 62 65 73 20 61   a[] describes a
37e0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
37f0: 52 45 20 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66  RE cluase */.#if
3800: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3810: 53 4d 41 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57  SMALL_STACK).  W
3820: 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69 63  hereTerm aStatic
3830: 5b 31 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69  [1];    /* Initi
3840: 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20  al static space 
3850: 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65  for a[] */.#else
3860: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 61 53 74  .  WhereTerm aSt
3870: 61 74 69 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49  atic[8];    /* I
3880: 6e 69 74 69 61 6c 20 73 74 61 74 69 63 20 73 70  nitial static sp
3890: 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23  ace for a[] */.#
38a0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
38b0: 41 20 57 68 65 72 65 54 65 72 6d 20 77 69 74 68  A WhereTerm with
38c0: 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f   eOperator==WO_O
38d0: 52 20 68 61 73 20 69 74 73 20 75 2e 70 4f 72 49  R has its u.pOrI
38e0: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20  nfo pointer set 
38f0: 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61  to.** a dynamica
3900: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  lly allocated in
3910: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3920: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3930: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
3940: 72 65 4f 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65  reOrInfo {.  Whe
3950: 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20  reClause wc;    
3960: 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f        /* Decompo
3970: 73 69 74 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74  sition into subt
3980: 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
3990: 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20  k indexable;    
39a0: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
39b0: 20 61 6c 6c 20 69 6e 64 65 78 61 62 6c 65 20 74   all indexable t
39c0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 63 6c 61  ables in the cla
39d0: 75 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  use */.};../*.**
39e0: 20 41 20 57 68 65 72 65 54 65 72 6d 20 77 69 74   A WhereTerm wit
39f0: 68 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  h eOperator==WO_
3a00: 41 4e 44 20 68 61 73 20 69 74 73 20 75 2e 70 41  AND has its u.pA
3a10: 6e 64 49 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73  ndInfo pointer s
3a20: 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d  et to.** a dynam
3a30: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
3a40: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
3a60: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
3a70: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20  WhereAndInfo {. 
3a80: 20 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b   WhereClause wc;
3a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3aa0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 62   subexpression b
3ab0: 72 6f 6b 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a  roken out */.};.
3ac0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
3ad0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
3ae0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
3af0: 65 70 73 20 74 72 61 63 6b 20 6f 66 20 61 20 6d  eps track of a m
3b00: 61 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65  apping.** betwee
3b10: 6e 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  n VDBE cursor nu
3b20: 6d 62 65 72 73 20 61 6e 64 20 62 69 74 73 20 6f  mbers and bits o
3b30: 66 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 69  f the bitmasks i
3b40: 6e 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  n WhereTerm..**.
3b50: 2a 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  ** The VDBE curs
3b60: 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73  or numbers are s
3b70: 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 63 6f  mall integers co
3b80: 6e 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53  ntained in .** S
3b90: 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75 72  rcList_item.iCur
3ba0: 73 6f 72 20 61 6e 64 20 45 78 70 72 2e 69 54 61  sor and Expr.iTa
3bb0: 62 6c 65 20 66 69 65 6c 64 73 2e 20 20 46 6f 72  ble fields.  For
3bc0: 20 61 6e 79 20 67 69 76 65 6e 20 57 48 45 52 45   any given WHERE
3bd0: 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74 68 65   .** clause, the
3be0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
3bf0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 67 69 6e 20  might not begin 
3c00: 77 69 74 68 20 30 20 61 6e 64 20 74 68 65 79 20  with 0 and they 
3c10: 6d 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  might.** contain
3c20: 20 67 61 70 73 20 69 6e 20 74 68 65 20 6e 75 6d   gaps in the num
3c30: 62 65 72 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  bering sequence.
3c40: 20 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f    But we want to
3c50: 20 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a   make maximum.**
3c60: 20 75 73 65 20 6f 66 20 74 68 65 20 62 69 74 73   use of the bits
3c70: 20 69 6e 20 6f 75 72 20 62 69 74 6d 61 73 6b 73   in our bitmasks
3c80: 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72  .  This structur
3c90: 65 20 70 72 6f 76 69 64 65 73 20 61 20 6d 61 70  e provides a map
3ca0: 70 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  ping.** from the
3cb0: 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e   sparse cursor n
3cc0: 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73  umbers into cons
3cd0: 65 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73  ecutive integers
3ce0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
3cf0: 74 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57  th 0..**.** If W
3d00: 68 65 72 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41  hereMaskSet.ix[A
3d10: 5d 3d 3d 42 20 69 74 20 6d 65 61 6e 73 20 74 68  ]==B it means th
3d20: 61 74 20 54 68 65 20 41 2d 74 68 20 62 69 74 20  at The A-th bit 
3d30: 6f 66 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20  of a Bitmask.** 
3d40: 63 6f 72 72 65 73 70 6f 6e 64 73 20 56 44 42 45  corresponds VDBE
3d50: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 42   cursor number B
3d60: 2e 20 20 54 68 65 20 41 2d 74 68 20 62 69 74 20  .  The A-th bit 
3d70: 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 69 73 20  of a bitmask is 
3d80: 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  1<<A..**.** For 
3d90: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
3da0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
3db0: 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 68 65  ression used the
3dc0: 73 65 20 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f  se VDBE.** curso
3dd0: 72 73 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32 39  rs:  4, 5, 8, 29
3de0: 2c 20 35 37 2c 20 37 33 2e 20 20 54 68 65 6e 20  , 57, 73.  Then 
3df0: 74 68 65 20 20 57 68 65 72 65 4d 61 73 6b 53 65  the  WhereMaskSe
3e00: 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 77  t structure.** w
3e10: 6f 75 6c 64 20 6d 61 70 20 74 68 6f 73 65 20 63  ould map those c
3e20: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
3e30: 74 6f 20 62 69 74 73 20 30 20 74 68 72 6f 75 67  to bits 0 throug
3e40: 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  h 5..**.** Note 
3e50: 74 68 61 74 20 74 68 65 20 6d 61 70 70 69 6e 67  that the mapping
3e60: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
3e70: 69 6c 79 20 6f 72 64 65 72 65 64 2e 20 20 49 6e  ily ordered.  In
3e80: 20 74 68 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20   the example.** 
3e90: 61 62 6f 76 65 2c 20 74 68 65 20 6d 61 70 70 69  above, the mappi
3ea0: 6e 67 20 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65  ng might go like
3eb0: 20 74 68 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d   this:  4->3, 5-
3ec0: 3e 31 2c 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c  >1, 8->2, 29->0,
3ed0: 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34  .** 57->5, 73->4
3ee0: 2e 20 20 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39  .  Or one of 719
3ef0: 20 6f 74 68 65 72 20 63 6f 6d 62 69 6e 61 74 69   other combinati
3f00: 6f 6e 73 20 6d 69 67 68 74 20 62 65 20 75 73 65  ons might be use
3f10: 64 2e 20 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d. It.** does no
3f20: 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e  t really matter.
3f30: 20 20 57 68 61 74 20 69 73 20 69 6d 70 6f 72 74    What is import
3f40: 61 6e 74 20 69 73 20 74 68 61 74 20 73 70 61 72  ant is that spar
3f50: 73 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  se cursor.** num
3f60: 62 65 72 73 20 61 6c 6c 20 67 65 74 20 6d 61 70  bers all get map
3f70: 70 65 64 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d  ped into bit num
3f80: 62 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20  bers that begin 
3f90: 77 69 74 68 20 30 20 61 6e 64 20 63 6f 6e 74 61  with 0 and conta
3fa0: 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a  in.** no gaps..*
3fb0: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4d 61  /.struct WhereMa
3fc0: 73 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b  skSet {.  int n;
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fe0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3ff0: 72 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63 75  r of assigned cu
4000: 72 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20  rsor values */. 
4010: 20 69 6e 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20   int ix[BMS];   
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4030: 2a 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e 65  * Cursor assigne
4040: 64 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a 2f  d to each bit */
4050: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
4060: 6f 62 6a 65 63 74 20 69 73 20 61 20 63 6f 6e 76  object is a conv
4070: 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20  enience wrapper 
4080: 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 69 6e 66 6f  holding all info
4090: 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 0a 2a  rmation needed.*
40a0: 2a 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 57  * to construct W
40b0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
40c0: 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
40d0: 72 20 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 72 75  r query..*/.stru
40e0: 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ct WhereLoopBuil
40f0: 64 65 72 20 7b 0a 20 20 57 68 65 72 65 49 6e 66  der {.  WhereInf
4100: 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
4110: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
4120: 20 61 62 6f 75 74 20 74 68 69 73 20 57 48 45 52   about this WHER
4130: 45 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  E */.  WhereClau
4140: 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
4150: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
4160: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 45 78 70 72   terms */.  Expr
4170: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
4180: 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42        /* ORDER B
4190: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  Y clause */.  Wh
41a0: 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
41b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
41c0: 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  ate WhereLoop */
41d0: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 42  .  WhereLoop *pB
41e0: 65 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  est;         /* 
41f0: 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 73 74 6f  If non-NULL, sto
4200: 72 65 20 73 69 6e 67 6c 65 20 62 65 73 74 20 6c  re single best l
4210: 6f 6f 70 20 68 65 72 65 20 2a 2f 0a 7d 3b 0a 0a  oop here */.};..
4220: 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52 45 20  /*.** The WHERE 
4230: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
4240: 67 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 77  g routine has tw
4250: 6f 20 68 61 6c 76 65 73 2e 20 20 54 68 65 0a 2a  o halves.  The.*
4260: 2a 20 66 69 72 73 74 20 70 61 72 74 20 64 6f 65  * first part doe
4270: 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  s the start of t
4280: 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 20 61 6e  he WHERE loop an
4290: 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  d the second.** 
42a0: 68 61 6c 66 20 64 6f 65 73 20 74 68 65 20 74 61  half does the ta
42b0: 69 6c 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  il of the WHERE 
42c0: 6c 6f 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61 6e  loop.  An instan
42d0: 63 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73 74  ce of.** this st
42e0: 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72  ructure is retur
42f0: 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
4300: 20 68 61 6c 66 20 61 6e 64 20 70 61 73 73 65 64   half and passed
4310: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 63  .** into the sec
4320: 6f 6e 64 20 68 61 6c 66 20 74 6f 20 67 69 76 65  ond half to give
4330: 20 73 6f 6d 65 20 63 6f 6e 74 69 6e 75 69 74 79   some continuity
4340: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ..**.** An insta
4350: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
4360: 63 74 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6d  ct holds the com
4370: 70 6c 65 74 65 20 73 74 61 74 65 20 6f 66 20 74  plete state of t
4380: 68 65 20 71 75 65 72 79 0a 2a 2a 20 70 6c 61 6e  he query.** plan
4390: 6e 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  ner..*/.struct W
43a0: 68 65 72 65 49 6e 66 6f 20 7b 0a 20 20 50 61 72  hereInfo {.  Par
43b0: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
43c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
43d0: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
43e0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
43f0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
4400: 4c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  List;        /* 
4410: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  List of tables i
4420: 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  n the join */.  
4430: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
4440: 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  By;       /* The
4450: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
4460: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
4470: 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
4480: 74 3b 20 20 20 20 20 20 2f 2a 20 44 49 53 54 49  t;      /* DISTI
4490: 4e 43 54 20 4f 4e 20 76 61 6c 75 65 73 2c 20 6f  NCT ON values, o
44a0: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  r NULL */.  Wher
44b0: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 73 3b 20 20  eLoop *pLoops;  
44c0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
44d0: 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
44e0: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 42 69 74 6d  bjects */.  Bitm
44f0: 61 73 6b 20 72 65 76 4d 61 73 6b 3b 20 20 20 20  ask revMask;    
4500: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
4510: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
4520: 74 68 61 74 20 6e 65 65 64 20 72 65 76 65 72 73  that need revers
4530: 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ing */.  WhereCo
4540: 73 74 20 6e 52 6f 77 4f 75 74 3b 20 20 20 20 20  st nRowOut;     
4550: 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
4560: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
4570: 20 72 6f 77 73 20 2a 2f 0a 20 20 75 31 36 20 77   rows */.  u16 w
4580: 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20  ctrlFlags;      
4590: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 6f 72       /* Flags or
45a0: 69 67 69 6e 61 6c 6c 79 20 70 61 73 73 65 64 20  iginally passed 
45b0: 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
45c0: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 75 38 20 62  egin() */.  u8 b
45d0: 4f 42 53 61 74 3b 20 20 20 20 20 20 20 20 20 20  OBSat;          
45e0: 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42        /* ORDER B
45f0: 59 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  Y satisfied by i
4600: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 75 38 20 6f  ndices */.  u8 o
4610: 6b 4f 6e 65 50 61 73 73 3b 20 20 20 20 20 20 20  kOnePass;       
4620: 20 20 20 20 20 20 2f 2a 20 4f 6b 20 74 6f 20 75        /* Ok to u
4630: 73 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f  se one-pass algo
4640: 72 69 74 68 6d 20 66 6f 72 20 55 50 44 41 54 45  rithm for UPDATE
4650: 2f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 75 38 20  /DELETE */.  u8 
4660: 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3b 20 20  untestedTerms;  
4670: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c         /* Not al
4680: 6c 20 57 48 45 52 45 20 74 65 72 6d 73 20 72 65  l WHERE terms re
4690: 73 6f 6c 76 65 64 20 62 79 20 6f 75 74 65 72 20  solved by outer 
46a0: 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38 20 65 44 69  loop */.  u8 eDi
46b0: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
46c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
46d0: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
46e0: 5f 2a 20 76 61 6c 75 65 73 20 62 65 6c 6f 77 20  _* values below 
46f0: 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 70 3b 20 20  */.  int iTop;  
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4710: 2a 20 54 68 65 20 76 65 72 79 20 62 65 67 69 6e  * The very begin
4720: 6e 69 6e 67 20 6f 66 20 74 68 65 20 57 48 45 52  ning of the WHER
4730: 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  E loop */.  int 
4740: 69 43 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20  iContinue;      
4750: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4760: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
4770: 69 74 68 20 6e 65 78 74 20 72 65 63 6f 72 64 20  ith next record 
4780: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 3b  */.  int iBreak;
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
47a0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
47b0: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
47c0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  loop */.  int nL
47d0: 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  evel;           
47e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
47f0: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 2a 2f 0a   nested loop */.
4800: 20 20 69 6e 74 20 73 61 76 65 64 4e 51 75 65 72    int savedNQuer
4810: 79 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20 70  yLoop;      /* p
4820: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
4830: 70 20 6f 75 74 73 69 64 65 20 74 68 65 20 57 48  p outside the WH
4840: 45 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68  ERE loop */.  Wh
4850: 65 72 65 4d 61 73 6b 53 65 74 20 73 4d 61 73 6b  ereMaskSet sMask
4860: 53 65 74 3b 20 20 20 20 2f 2a 20 4d 61 70 20 63  Set;    /* Map c
4870: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f  ursor numbers to
4880: 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 57   bitmasks */.  W
4890: 68 65 72 65 43 6c 61 75 73 65 20 73 57 43 3b 20  hereClause sWC; 
48a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f           /* Deco
48b0: 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65  mposition of the
48c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
48d0: 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 61 5b  .  WhereLevel a[
48e0: 31 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1];          /* 
48f0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
4900: 74 20 65 61 63 68 20 6e 65 73 74 20 6c 6f 6f 70  t each nest loop
4910: 20 69 6e 20 57 48 45 52 45 20 2a 2f 0a 7d 3b 0a   in WHERE */.};.
4920: 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73 20  ./*.** Bitmasks 
4930: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
4940: 73 20 6f 6e 20 57 68 65 72 65 54 65 72 6d 20 6f  s on WhereTerm o
4950: 62 6a 65 63 74 73 2e 20 20 54 68 65 73 65 20 61  bjects.  These a
4960: 72 65 20 61 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  re all.** operat
4970: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 66 20  ors that are of 
4980: 69 6e 74 65 72 65 73 74 20 74 6f 20 74 68 65 20  interest to the 
4990: 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20  query planner.  
49a0: 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62  An.** OR-ed comb
49b0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65  ination of these
49c0: 20 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75   values can be u
49d0: 73 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69  sed when searchi
49e0: 6e 67 20 66 6f 72 0a 2a 2a 20 70 61 72 74 69 63  ng for.** partic
49f0: 75 6c 61 72 20 57 68 65 72 65 54 65 72 6d 73 20  ular WhereTerms 
4a00: 77 69 74 68 69 6e 20 61 20 57 68 65 72 65 43 6c  within a WhereCl
4a10: 61 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ause..*/.#define
4a20: 20 57 4f 5f 49 4e 20 20 20 20 20 30 78 30 30 31   WO_IN     0x001
4a30: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20  .#define WO_EQ  
4a40: 20 20 20 30 78 30 30 32 0a 23 64 65 66 69 6e 65     0x002.#define
4a50: 20 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45   WO_LT     (WO_E
4a60: 51 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29  Q<<(TK_LT-TK_EQ)
4a70: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20  ).#define WO_LE 
4a80: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
4a90: 4c 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  LE-TK_EQ)).#defi
4aa0: 6e 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f  ne WO_GT     (WO
4ab0: 5f 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45  _EQ<<(TK_GT-TK_E
4ac0: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47  Q)).#define WO_G
4ad0: 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  E     (WO_EQ<<(T
4ae0: 4b 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_GE-TK_EQ)).#de
4af0: 66 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20 30  fine WO_MATCH  0
4b00: 78 30 34 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x040.#define WO_
4b10: 49 53 4e 55 4c 4c 20 30 78 30 38 30 0a 23 64 65  ISNULL 0x080.#de
4b20: 66 69 6e 65 20 57 4f 5f 4f 52 20 20 20 20 20 30  fine WO_OR     0
4b30: 78 31 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77  x100       /* Tw
4b40: 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e  o or more OR-con
4b50: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
4b60: 23 64 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20  #define WO_AND  
4b70: 20 20 30 78 32 30 30 20 20 20 20 20 20 20 2f 2a    0x200       /*
4b80: 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44   Two or more AND
4b90: 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
4ba0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45   */.#define WO_E
4bb0: 51 55 49 56 20 20 30 78 34 30 30 20 20 20 20 20  QUIV  0x400     
4bc0: 20 20 2f 2a 20 4f 66 20 74 68 65 20 66 6f 72 6d    /* Of the form
4bd0: 20 41 3d 3d 42 2c 20 62 6f 74 68 20 63 6f 6c 75   A==B, both colu
4be0: 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  mns */.#define W
4bf0: 4f 5f 4e 4f 4f 50 20 20 20 30 78 38 30 30 20 20  O_NOOP   0x800  
4c00: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72       /* This ter
4c10: 6d 20 64 6f 65 73 20 6e 6f 74 20 72 65 73 74 72  m does not restr
4c20: 69 63 74 20 73 65 61 72 63 68 20 73 70 61 63 65  ict search space
4c30: 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 57 4f 5f   */..#define WO_
4c40: 41 4c 4c 20 20 20 20 30 78 66 66 66 20 20 20 20  ALL    0xfff    
4c50: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c     /* Mask of al
4c60: 6c 20 70 6f 73 73 69 62 6c 65 20 57 4f 5f 2a 20  l possible WO_* 
4c70: 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e  values */.#defin
4c80: 65 20 57 4f 5f 53 49 4e 47 4c 45 20 30 78 30 66  e WO_SINGLE 0x0f
4c90: 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  f       /* Mask 
4ca0: 6f 66 20 61 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f  of all non-compo
4cb0: 75 6e 64 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  und WO_* values 
4cc0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  */../*.** These 
4cd0: 61 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  are definitions 
4ce0: 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 57  of bits in the W
4cf0: 68 65 72 65 4c 6f 6f 70 2e 77 73 46 6c 61 67 73  hereLoop.wsFlags
4d00: 20 66 69 65 6c 64 2e 0a 2a 2a 20 54 68 65 20 70   field..** The p
4d10: 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e  articular combin
4d20: 61 74 69 6f 6e 20 6f 66 20 62 69 74 73 20 69 6e  ation of bits in
4d30: 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 20   each WhereLoop 
4d40: 68 65 6c 70 20 74 6f 0a 2a 2a 20 64 65 74 65 72  help to.** deter
4d50: 6d 69 6e 65 20 74 68 65 20 61 6c 67 6f 72 69 74  mine the algorit
4d60: 68 6d 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f  hm that WhereLoo
4d70: 70 20 72 65 70 72 65 73 65 6e 74 73 2e 0a 2a 2f  p represents..*/
4d80: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
4d90: 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78 30 30  OLUMN_EQ    0x00
4da0: 30 30 30 30 30 31 20 20 2f 2a 20 78 3d 45 58 50  000001  /* x=EXP
4db0: 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20  R or x IN (...) 
4dc0: 6f 72 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a  or x IS NULL */.
4dd0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
4de0: 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30 30  LUMN_RANGE 0x000
4df0: 30 30 30 30 32 20 20 2f 2a 20 78 3c 45 58 50 52  00002  /* x<EXPR
4e00: 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a   and/or x>EXPR *
4e10: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
4e20: 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30  COLUMN_IN    0x0
4e30: 30 30 30 30 30 30 34 20 20 2f 2a 20 78 20 49 4e  0000004  /* x IN
4e40: 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e   (...) */.#defin
4e50: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  e WHERE_COLUMN_N
4e60: 55 4c 4c 20 20 30 78 30 30 30 30 30 30 30 38 20  ULL  0x00000008 
4e70: 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f   /* x IS NULL */
4e80: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
4e90: 4f 4e 53 54 52 41 49 4e 54 20 20 20 30 78 30 30  ONSTRAINT   0x00
4ea0: 30 30 30 30 30 66 20 20 2f 2a 20 41 6e 79 20 6f  00000f  /* Any o
4eb0: 66 20 74 68 65 20 57 48 45 52 45 5f 43 4f 4c 55  f the WHERE_COLU
4ec0: 4d 4e 5f 78 78 78 20 76 61 6c 75 65 73 20 2a 2f  MN_xxx values */
4ed0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54  .#define WHERE_T
4ee0: 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30  OP_LIMIT    0x00
4ef0: 30 30 30 30 31 30 20 20 2f 2a 20 78 3c 45 58 50  000010  /* x<EXP
4f00: 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e  R or x<=EXPR con
4f10: 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69  straint */.#defi
4f20: 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  ne WHERE_BTM_LIM
4f30: 49 54 20 20 20 20 30 78 30 30 30 30 30 30 32 30  IT    0x00000020
4f40: 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78    /* x>EXPR or x
4f50: 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  >=EXPR constrain
4f60: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  t */.#define WHE
4f70: 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20 20  RE_BOTH_LIMIT   
4f80: 30 78 30 30 30 30 30 30 33 30 20 20 2f 2a 20 42  0x00000030  /* B
4f90: 6f 74 68 20 78 3e 45 58 50 52 20 61 6e 64 20 78  oth x>EXPR and x
4fa0: 3c 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  <EXPR */.#define
4fb0: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
4fc0: 20 20 20 20 30 78 30 30 30 30 30 30 34 30 20 20      0x00000040  
4fd0: 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c  /* Use index onl
4fe0: 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a  y - omit table *
4ff0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
5000: 49 50 4b 20 20 20 20 20 20 20 20 20 20 30 78 30  IPK          0x0
5010: 30 30 30 30 31 30 30 20 20 2f 2a 20 78 20 69 73  0000100  /* x is
5020: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
5030: 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65 66  MARY KEY */.#def
5040: 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45 58 45  ine WHERE_INDEXE
5050: 44 20 20 20 20 20 20 30 78 30 30 30 30 30 32 30  D      0x0000020
5060: 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e  0  /* WhereLoop.
5070: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 69  u.btree.pIndex i
5080: 73 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66 69  s valid */.#defi
5090: 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c  ne WHERE_VIRTUAL
50a0: 54 41 42 4c 45 20 30 78 30 30 30 30 30 34 30 30  TABLE 0x00000400
50b0: 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75    /* WhereLoop.u
50c0: 2e 76 74 61 62 20 69 73 20 76 61 6c 69 64 20 2a  .vtab is valid *
50d0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
50e0: 49 4e 5f 41 42 4c 45 20 20 20 20 20 20 30 78 30  IN_ABLE      0x0
50f0: 30 30 30 30 38 30 30 20 20 2f 2a 20 41 62 6c 65  0000800  /* Able
5100: 20 74 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 49   to support an I
5110: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64  N operator */.#d
5120: 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45 52  efine WHERE_ONER
5130: 4f 57 20 20 20 20 20 20 20 30 78 30 30 30 30 31  OW       0x00001
5140: 30 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20  000  /* Selects 
5150: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
5160: 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20   row */.#define 
5170: 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20  WHERE_MULTI_OR  
5180: 20 20 20 30 78 30 30 30 30 32 30 30 30 20 20 2f     0x00002000  /
5190: 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69  * OR using multi
51a0: 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23  ple indices */.#
51b0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 45 4d  define WHERE_TEM
51c0: 50 5f 49 4e 44 45 58 20 20 20 30 78 30 30 30 30  P_INDEX   0x0000
51d0: 34 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e  4000  /* Uses an
51e0: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
51f0: 20 2a 2f 0a 0a 0a 2f 2a 20 43 6f 6e 76 65 72 74   */.../* Convert
5200: 20 61 20 57 68 65 72 65 43 6f 73 74 20 76 61 6c   a WhereCost val
5210: 75 65 20 28 31 30 20 74 69 6d 65 73 20 6c 6f 67  ue (10 times log
5220: 32 28 58 29 29 20 69 6e 74 6f 20 69 74 73 20 69  2(X)) into its i
5230: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 58 2e 0a  nteger value X..
5240: 2a 2a 20 41 20 72 6f 75 67 68 20 61 70 70 72 6f  ** A rough appro
5250: 78 69 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ximation is used
5260: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  .  The value ret
5270: 75 72 6e 65 64 20 69 73 20 6e 6f 74 20 65 78 61  urned is not exa
5280: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36  ct..*/.static u6
5290: 34 20 77 68 65 72 65 43 6f 73 74 54 6f 49 6e 74  4 whereCostToInt
52a0: 28 57 68 65 72 65 43 6f 73 74 20 78 29 7b 0a 20  (WhereCost x){. 
52b0: 20 75 36 34 20 6e 3b 0a 20 20 69 66 28 20 78 3c   u64 n;.  if( x<
52c0: 31 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  10 ) return 1;. 
52d0: 20 6e 20 3d 20 78 25 31 30 3b 0a 20 20 78 20 2f   n = x%10;.  x /
52e0: 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 3e 3d 35  = 10;.  if( n>=5
52f0: 20 29 20 6e 20 2d 3d 20 32 3b 0a 20 20 65 6c 73   ) n -= 2;.  els
5300: 65 20 69 66 28 20 6e 3e 3d 31 20 29 20 6e 20 2d  e if( n>=1 ) n -
5310: 3d 20 31 3b 0a 20 20 69 66 28 20 78 3e 3d 33 20  = 1;.  if( x>=3 
5320: 29 20 72 65 74 75 72 6e 20 28 6e 2b 38 29 3c 3c  ) return (n+8)<<
5330: 28 78 2d 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  (x-3);.  return 
5340: 28 6e 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a 7d 0a  (n+8)>>(3-x);.}.
5350: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5360: 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
5370: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
5380: 73 20 66 72 6f 6d 20 61 20 57 48 45 52 45 20 63  s from a WHERE c
5390: 6c 61 75 73 65 0a 2a 2f 0a 75 36 34 20 73 71 6c  lause.*/.u64 sql
53a0: 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
53b0: 6f 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66  owCount(WhereInf
53c0: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
53d0: 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74 54 6f  turn whereCostTo
53e0: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
53f0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
5400: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
5410: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
5420: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
5430: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
5440: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
5450: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
5460: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
5470: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
5480: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
5490: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
54a0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
54b0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
54c0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
54d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
54e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
54f0: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
5500: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
5510: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
5520: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
5530: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
5540: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
5550: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
5560: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
5570: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
5580: 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 3b  Info->bOBSat!=0;
5590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
55a0: 20 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73   the VDBE addres
55b0: 73 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75  s or label to ju
55c0: 6d 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74  mp to in order t
55d0: 6f 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d  o continue.** im
55e0: 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68 20 74  mediately with t
55f0: 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61  he next row of a
5600: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
5610: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
5620: 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28  reContinueLabel(
5630: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
5640: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
5650: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
5660: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5670: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
5680: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
5690: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
56a0: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
56b0: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
56c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
56d0: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
56e0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
56f0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
5700: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
5710: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
5720: 66 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  f an UPDATE or D
5730: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
5740: 63 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65  can operate dire
5750: 63 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72  ctly on.** the r
5760: 6f 77 69 64 73 20 72 65 74 75 72 6e 65 64 20 62  owids returned b
5770: 79 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  y a WHERE clause
5780: 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  .  Return FALSE 
5790: 69 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55  if doing an.** U
57a0: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
57b0: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 73 75 62  might change sub
57c0: 73 65 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c  sequent WHERE cl
57d0: 61 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2f  ause results..*/
57e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
57f0: 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72 65  eOkOnePass(Where
5800: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
5810: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
5820: 6f 6b 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a  okOnePass;.}../*
5830: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
5840: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68   preallocated Wh
5850: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
5860: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
5870: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49  oid whereClauseI
5880: 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75  nit(.  WhereClau
5890: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
58a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  /* The WhereClau
58b0: 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c  se to be initial
58c0: 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 49  ized */.  WhereI
58d0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20 20  nfo *pWInfo     
58e0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
58f0: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
5900: 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e  xt */.){.  pWC->
5910: 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b  pWInfo = pWInfo;
5920: 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20 3d  .  pWC->pOuter =
5930: 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d   0;.  pWC->nTerm
5940: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c   = 0;.  pWC->nSl
5950: 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70  ot = ArraySize(p
5960: 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20  WC->aStatic);.  
5970: 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53  pWC->a = pWC->aS
5980: 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  tatic;.}../* For
5990: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
59a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
59b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57  ereClauseClear(W
59c0: 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f  hereClause*);../
59d0: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
59e0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
59f0: 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65  iated with a Whe
5a00: 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  reOrInfo object.
5a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a20: 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74  whereOrInfoDelet
5a30: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
5a40: 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a  hereOrInfo *p){.
5a50: 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
5a60: 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71  ar(&p->wc);.  sq
5a70: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5a80: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  p);.}../*.** Dea
5a90: 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f  llocate all memo
5aa0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
5ab0: 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e 66  th a WhereAndInf
5ac0: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  o object..*/.sta
5ad0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41 6e  tic void whereAn
5ae0: 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69  dInfoDelete(sqli
5af0: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41 6e  te3 *db, WhereAn
5b00: 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65  dInfo *p){.  whe
5b10: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
5b20: 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->wc);.  sqlite3
5b30: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
5b40: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
5b50: 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  te a WhereClause
5b60: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
5b70: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
5b80: 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66  ucture.** itself
5b90: 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20   is not freed.  
5ba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5bb0: 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77  the inverse of w
5bc0: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29  hereClauseInit()
5bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5be0: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
5bf0: 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  r(WhereClause *p
5c00: 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  WC){.  int i;.  
5c10: 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20  WhereTerm *a;.  
5c20: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
5c30: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
5c40: 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70  e->db;.  for(i=p
5c50: 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70  WC->nTerm-1, a=p
5c60: 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  WC->a; i>=0; i--
5c70: 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , a++){.    if( 
5c80: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
5c90: 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  M_DYNAMIC ){.   
5ca0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5cb0: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70  lete(db, a->pExp
5cc0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
5cd0: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
5ce0: 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20  ERM_ORINFO ){.  
5cf0: 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44      whereOrInfoD
5d00: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
5d10: 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c  OrInfo);.    }el
5d20: 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67  se if( a->wtFlag
5d30: 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  s & TERM_ANDINFO
5d40: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41   ){.      whereA
5d50: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c  ndInfoDelete(db,
5d60: 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b   a->u.pAndInfo);
5d70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5d80: 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53   pWC->a!=pWC->aS
5d90: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c  tatic ){.    sql
5da0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5db0: 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  WC->a);.  }.}../
5dc0: 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
5dd0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
5de0: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68 65  entry to the Whe
5df0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
5e00: 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20  pWC..** The new 
5e10: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
5e20: 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20   is constructed 
5e30: 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20  from Expr p and 
5e40: 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a  with wtFlags..**
5e50: 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57   The index in pW
5e60: 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65  C->a[] of the ne
5e70: 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20 72  w WhereTerm is r
5e80: 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
5e90: 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75  ss..** 0 is retu
5ea0: 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77 20  rned if the new 
5eb0: 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20  WhereTerm could 
5ec0: 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75 65  not be added due
5ed0: 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20   to a memory.** 
5ee0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
5ef0: 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c  .  The memory al
5f00: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
5f10: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65   will be recorde
5f20: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e  d in.** the db->
5f30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
5f40: 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65 72  g so that higher
5f50: 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73  -level functions
5f60: 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a   can detect it..
5f70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5f80: 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ne will increase
5f90: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
5fa0: 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20   pWC->a[] array 
5fb0: 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
5fc0: 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61  .** If the wtFla
5fd0: 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c  gs argument incl
5fe0: 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49  udes TERM_DYNAMI
5ff0: 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69  C, then responsi
6000: 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72  bility.** for fr
6010: 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73  eeing the expres
6020: 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65  sion p is assume
6030: 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c  d by the WhereCl
6040: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
6050: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75 65  .** This is true
6060: 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f   even if this ro
6070: 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61  utine fails to a
6080: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
6090: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57  ereTerm..**.** W
60a0: 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f  ARNING:  This ro
60b0: 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c  utine might real
60c0: 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65  locate the space
60d0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
60e0: 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41  * WhereTerms.  A
60f0: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57  ll pointers to W
6100: 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64  hereTerms should
6110: 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
6120: 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67  after.** calling
6130: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
6140: 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61  Such pointers ma
6150: 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a  y be reinitializ
6160: 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e  ed by referencin
6170: 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b  g.** the pWC->a[
6180: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
6190: 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75  ic int whereClau
61a0: 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c  seInsert(WhereCl
61b0: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
61c0: 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b  *p, u8 wtFlags){
61d0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
61e0: 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  erm;.  int idx;.
61f0: 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46 6c    testcase( wtFl
6200: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
6210: 41 4c 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d  AL );  /* EV: R-
6220: 30 30 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20  00211-15100 */. 
6230: 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e   if( pWC->nTerm>
6240: 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20  =pWC->nSlot ){. 
6250: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
6260: 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20  ld = pWC->a;.   
6270: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
6280: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
6290: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d  se->db;.    pWC-
62a0: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
62b0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
62c0: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57  of(pWC->a[0])*pW
62d0: 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20  C->nSlot*2 );.  
62e0: 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20    if( pWC->a==0 
62f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74 46  ){.      if( wtF
6300: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
6310: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73  MIC ){.        s
6320: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6330: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d  (db, p);.      }
6340: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  .      pWC->a = 
6350: 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74 75  pOld;.      retu
6360: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
6370: 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70  memcpy(pWC->a, p
6380: 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  Old, sizeof(pWC-
6390: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72  >a[0])*pWC->nTer
63a0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  m);.    if( pOld
63b0: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
63c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
63d0: 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b  bFree(db, pOld);
63e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e  .    }.    pWC->
63f0: 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33 44  nSlot = sqlite3D
6400: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
6410: 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70  pWC->a)/sizeof(p
6420: 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20  WC->a[0]);.  }. 
6430: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
6440: 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72  [idx = pWC->nTer
6450: 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70  m++];.  pTerm->p
6460: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
6470: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 29  prSkipCollate(p)
6480: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  ;.  pTerm->wtFla
6490: 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20  gs = wtFlags;.  
64a0: 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43  pTerm->pWC = pWC
64b0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
64c0: 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  nt = -1;.  retur
64d0: 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n idx;.}../*.** 
64e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65  This routine ide
64f0: 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65  ntifies subexpre
6500: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48  ssions in the WH
6510: 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65  ERE clause where
6520: 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72  .** each subexpr
6530: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
6540: 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f  ted by the AND o
6550: 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20  perator or some 
6560: 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f  other.** operato
6570: 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
6580: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
6590: 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73    The WhereClaus
65a0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
65b0: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f  s filled with po
65c0: 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70  inters to subexp
65d0: 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65  ressions.  For e
65e0: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
65f0: 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c   WHERE  a=='hell
6600: 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28  o' AND coalesce(
6610: 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b  b,11)<10 AND (c+
6620: 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a  12!=d OR c==22).
6630: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f  **           \__
6640: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f  ______/     \___
6650: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  ____________/   
6660: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
6670: 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
6680: 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20     slot[0]      
6690: 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20        slot[1]   
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
66b0: 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  [2].**.** The or
66c0: 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  iginal WHERE cla
66d0: 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20  use in pExpr is 
66e0: 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20  unaltered.  All 
66f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
6700: 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f  does is make slo
6710: 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e  t[] entries poin
6720: 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72  t to substructur
6730: 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a  e within pExpr..
6740: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65  **.** In the pre
6750: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61  vious sentence a
6760: 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  nd in the diagra
6770: 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65  m, "slot[]" refe
6780: 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65  rs to.** the Whe
6790: 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72  reClause.a[] arr
67a0: 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20  ay.  The slot[] 
67b0: 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e  array grows as n
67c0: 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  eeded to contain
67d0: 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  .** all terms of
67e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
67f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
6800: 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68 65  d whereSplit(Whe
6810: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
6820: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
6830: 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d  op){.  pWC->op =
6840: 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20 70   (u8)op;.  if( p
6850: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
6860: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
6870: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65  p!=op ){.    whe
6880: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
6890: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  WC, pExpr, 0);. 
68a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72   }else{.    wher
68b0: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
68c0: 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20  r->pLeft, op);. 
68d0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
68e0: 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  C, pExpr->pRight
68f0: 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , op);.  }.}../*
6900: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
6910: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62   WhereMaskSet ob
6920: 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ject.*/.#define 
6930: 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20  initMaskSet(P)  
6940: 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20  (P)->n=0../*.** 
6950: 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61  Return the bitma
6960: 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  sk for the given
6970: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20   cursor number. 
6980: 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20   Return 0 if.** 
6990: 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69  iCursor is not i
69a0: 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74  n the set..*/.st
69b0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74  atic Bitmask get
69c0: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
69d0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
69e0: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74   iCursor){.  int
69f0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   i;.  assert( pM
6a00: 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29  askSet->n<=(int)
6a10: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
6a20: 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  8 );.  for(i=0; 
6a30: 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69  i<pMaskSet->n; i
6a40: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61  ++){.    if( pMa
6a50: 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43  skSet->ix[i]==iC
6a60: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72  ursor ){.      r
6a70: 65 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29  eturn MASKBIT(i)
6a80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6a90: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
6aa0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61   Create a new ma
6ab0: 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43  sk for cursor iC
6ac0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
6ad0: 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72  re is one cursor
6ae0: 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68   per table in th
6af0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
6b00: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  The number of.**
6b10: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
6b20: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
6b30: 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20  mited by a test 
6b40: 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20  early in the.** 
6b50: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
6b60: 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f  n() routine.  So
6b70: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
6b80: 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d  e pMaskSet->ix[]
6b90: 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e  .** array will n
6ba0: 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a  ever overflow..*
6bb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
6bc0: 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61  eateMask(WhereMa
6bd0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
6be0: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
6bf0: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
6c00: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
6c10: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
6c20: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
6c30: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
6c40: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
6c50: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
6c60: 65 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76  e walk (recursiv
6c70: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
6c80: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
6c90: 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61  rates.** a bitma
6ca0: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
6cb0: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
6cc0: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
6cd0: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
6ce0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
6cf0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
6d00: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
6d10: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
6d20: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
6d30: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
6d40: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
6d50: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61  *, Select*);.sta
6d60: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
6d70: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
6d80: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
6d90: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42  t, Expr *p){.  B
6da0: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
6db0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
6dc0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
6dd0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
6de0: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74  {.    mask = get
6df0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
6e00: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72  ->iTable);.    r
6e10: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a  eturn mask;.  }.
6e20: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62    mask = exprTab
6e30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
6e40: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
6e50: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
6e60: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
6e70: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66   p->pLeft);.  if
6e80: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6e90: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
6ea0: 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  t) ){.    mask |
6eb0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
6ec0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
6ed0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
6ee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73    }else{.    mas
6ef0: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
6f00: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
6f10: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
6f20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
6f30: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
6f40: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
6f50: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
6f60: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
6f70: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
6f80: 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61    int i;.  Bitma
6f90: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
6fa0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
6fb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
6fc0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
6fd0: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
6fe0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
6ff0: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
7000: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
7010: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
7020: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
7030: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
7040: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
7050: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
7060: 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20   Select *pS){.  
7070: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
7080: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b  ;.  while( pS ){
7090: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
70a0: 72 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  rc = pS->pSrc;. 
70b0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
70c0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
70d0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69  askSet, pS->pELi
70e0: 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  st);.    mask |=
70f0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
7100: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
7110: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
7120: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
7130: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
7140: 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72  kSet, pS->pOrder
7150: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
7160: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
7170: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57  pMaskSet, pS->pW
7180: 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20  here);.    mask 
7190: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
71a0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
71b0: 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66  pHaving);.    if
71c0: 28 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30  ( ALWAYS(pSrc!=0
71d0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
71e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
71f0: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
7200: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73  ++){.        mas
7210: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
7220: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
7230: 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  et, pSrc->a[i].p
7240: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
7250: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
7260: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
7270: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e  , pSrc->a[i].pOn
7280: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7290: 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50  .    pS = pS->pP
72a0: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rior;.  }.  retu
72b0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn mask;.}../*.*
72c0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
72d0: 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61   the given opera
72e0: 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  tor is one of th
72f0: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
7300: 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66   is.** allowed f
7310: 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20  or an indexable 
7320: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
7330: 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20  m.  The allowed 
7340: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
7350: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20   "=", "<", ">", 
7360: 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22  "<=", ">=", "IN"
7370: 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a  , and "IS NULL".
7380: 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  **.** IMPLEMENTA
7390: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 39 39 32 36  TION-OF: R-59926
73a0: 2d 32 36 33 39 33 20 54 6f 20 62 65 20 75 73 61  -26393 To be usa
73b0: 62 6c 65 20 62 79 20 61 6e 20 69 6e 64 65 78 20  ble by an index 
73c0: 61 20 74 65 72 6d 20 6d 75 73 74 20 62 65 0a 2a  a term must be.*
73d0: 2a 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * of one of the 
73e0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
73f0: 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 65 73   column = expres
7400: 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3e 20 65 78  sion column > ex
7410: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75  pression.** colu
7420: 6d 6e 20 3e 3d 20 65 78 70 72 65 73 73 69 6f 6e  mn >= expression
7430: 20 63 6f 6c 75 6d 6e 20 3c 20 65 78 70 72 65 73   column < expres
7440: 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65  sion column <= e
7450: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 78 70  xpression.** exp
7460: 72 65 73 73 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e  ression = column
7470: 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 20 63 6f   expression > co
7480: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
7490: 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70  >= column.** exp
74a0: 72 65 73 73 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e  ression < column
74b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 3d 20 63   expression <= c
74c0: 6f 6c 75 6d 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a  olumn column IN.
74d0: 2a 2a 20 28 65 78 70 72 65 73 73 69 6f 6e 2d 6c  ** (expression-l
74e0: 69 73 74 29 20 63 6f 6c 75 6d 6e 20 49 4e 20 28  ist) column IN (
74f0: 73 75 62 71 75 65 72 79 29 20 63 6f 6c 75 6d 6e  subquery) column
7500: 20 49 53 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74   IS NULL.*/.stat
7510: 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70  ic int allowedOp
7520: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65  (int op){.  asse
7530: 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20  rt( TK_GT>TK_EQ 
7540: 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29  && TK_GT<TK_GE )
7550: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
7560: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54  T>TK_EQ && TK_LT
7570: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
7580: 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20  rt( TK_LE>TK_EQ 
7590: 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29  && TK_LE<TK_GE )
75a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  ;.  assert( TK_G
75b0: 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20  E==TK_EQ+4 );.  
75c0: 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e  return op==TK_IN
75d0: 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26   || (op>=TK_EQ &
75e0: 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20  & op<=TK_GE) || 
75f0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d  op==TK_ISNULL;.}
7600: 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f  ../*.** Swap two
7610: 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65   objects of type
7620: 20 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e   TYPE..*/.#defin
7630: 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29  e SWAP(TYPE,A,B)
7640: 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b   {TYPE t=A; A=B;
7650: 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   B=t;}../*.** Co
7660: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
7670: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78  on operator.  Ex
7680: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
7690: 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a   form "X op Y".*
76a0: 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  * are converted 
76b0: 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a  into "Y op X"..*
76c0: 2a 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67  *.** If left/rig
76d0: 68 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75  ht precedence ru
76e0: 6c 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c  les come into pl
76f0: 61 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e  ay when determin
7700: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61  ing the.** colla
7710: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 74  ting sequence, t
7720: 68 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  hen COLLATE oper
7730: 61 74 6f 72 73 20 61 72 65 20 61 64 6a 75 73 74  ators are adjust
7740: 65 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20  ed to ensure.** 
7750: 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69  that the collati
7760: 6e 67 20 73 65 71 75 65 6e 63 65 20 64 6f 65 73  ng sequence does
7770: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20 46 6f   not change.  Fo
7780: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59  r example:.** "Y
7790: 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20   collate NOCASE 
77a0: 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 22 58  op X" becomes "X
77b0: 20 6f 70 20 59 22 20 62 65 63 61 75 73 65 20 61   op Y" because a
77c0: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
77d0: 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  uence on.** the 
77e0: 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  left hand side o
77f0: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
7800: 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c  verrides any col
7810: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
7820: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
7830: 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74  the right. For t
7840: 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74  he same reason t
7850: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
7860: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
7870: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
7880: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
7890: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
78a0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
78b0: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
78c0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
78d0: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
78e0: 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65  te);.  u16 expLe
78f0: 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  ft = (pExpr->pLe
7900: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  ft->flags & EP_C
7910: 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72  ollate);.  asser
7920: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
7930: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
7940: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
7950: 20 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65   if( expRight==e
7960: 78 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a  xpLeft ){.    /*
7970: 20 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20   Either X and Y 
7980: 62 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54  both have COLLAT
7990: 45 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65  E operator or ne
79a0: 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20  ither do */.    
79b0: 69 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a  if( expRight ){.
79c0: 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20        /* Both X 
79d0: 61 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  and Y have COLLA
79e0: 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d  TE operators.  M
79f0: 61 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c  ake sure X is al
7a00: 77 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ways.      ** us
7a10: 65 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ed by clearing t
7a20: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
7a30: 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20  ag from Y. */.  
7a40: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
7a50: 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f  t->flags &= ~EP_
7a60: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c  Collate;.    }el
7a70: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  se if( sqlite3Ex
7a80: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
7a90: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  , pExpr->pLeft)!
7aa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  =0 ){.      /* N
7ab0: 65 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68  either X nor Y h
7ac0: 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ave COLLATE oper
7ad0: 61 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73  ators, but X has
7ae0: 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20   a non-default. 
7af0: 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e       ** collatin
7b00: 67 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20  g sequence.  So 
7b10: 61 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  add the EP_Colla
7b20: 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74  te marker on X t
7b30: 6f 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  o cause.      **
7b40: 20 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68   it to be search
7b50: 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20  ed first. */.   
7b60: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d     pExpr->pLeft-
7b70: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c  >flags |= EP_Col
7b80: 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  late;.    }.  }.
7b90: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
7ba0: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
7bb0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
7bc0: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
7bd0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7be0: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
7bf0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
7c00: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
7c10: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
7c20: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
7c30: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
7c40: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
7c50: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
7c60: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
7c70: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
7c80: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
7c90: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
7ca0: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
7cb0: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
7cc0: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
7cd0: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
7ce0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  sk..*/.static u1
7cf0: 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  6 operatorMask(i
7d00: 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b  nt op){.  u16 c;
7d10: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
7d20: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
7d30: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
7d40: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
7d50: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
7d60: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
7d70: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
7d80: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
7d90: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
7da0: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
7db0: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
7dc0: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
7dd0: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
7de0: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
7df0: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
7e00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
7e10: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
7e20: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
7e30: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
7e40: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
7e50: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
7e60: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
7e70: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
7e80: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
7e90: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
7ea0: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
7eb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
7ec0: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
7ed0: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
7ee0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
7ef0: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57  ce to the next W
7f00: 68 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61  hereTerm that ma
7f10: 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20  tches according 
7f20: 74 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  to the criteria.
7f30: 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77  ** established w
7f40: 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62  hen the pScan ob
7f50: 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c  ject was initial
7f60: 69 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61  ized by whereSca
7f70: 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75  nInit()..** Retu
7f80: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
7f90: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74   are no more mat
7fa0: 63 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73  ching WhereTerms
7fb0: 2e 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d 20 2a  ..*/.WhereTerm *
7fc0: 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68  whereScanNext(Wh
7fd0: 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b  ereScan *pScan){
7fe0: 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
7ff0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8000: 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ursor on the LHS
8010: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a   of the term */.
8020: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20    int iColumn;  
8030: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
8040: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20  lumn on the LHS 
8050: 6f 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31  of the term.  -1
8060: 20 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78   for IPK */.  Ex
8070: 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
8080: 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73     /* An express
8090: 69 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64  ion being tested
80a0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
80b0: 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68  e *pWC;    /* Sh
80c0: 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61  orthand for pSca
80d0: 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72  n->pWC */.  Wher
80e0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
80f0: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69   /* The term bei
8100: 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69  ng tested */.  i
8110: 6e 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b  nt k = pScan->k;
8120: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
8130: 73 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a  start scanning *
8140: 2f 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61  /..  while( pSca
8150: 6e 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e  n->iEquiv<=pScan
8160: 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20  ->nEquiv ){.    
8170: 69 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45  iCur = pScan->aE
8180: 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75  quiv[pScan->iEqu
8190: 69 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75  iv-2];.    iColu
81a0: 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75  mn = pScan->aEqu
81b0: 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  iv[pScan->iEquiv
81c0: 2d 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  -1];.    while( 
81d0: 28 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  (pWC = pScan->pW
81e0: 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  C)!=0 ){.      f
81f0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b  or(pTerm=pWC->a+
8200: 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  k; k<pWC->nTerm;
8210: 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k++, pTerm++){.
8220: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
8230: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
8240: 43 75 72 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e  Cur && pTerm->u.
8250: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
8260: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
8270: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
8280: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49  erator & WO_EQUI
8290: 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  V)!=0.          
82a0: 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69   && pScan->nEqui
82b0: 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63 61  v<ArraySize(pSca
82c0: 6e 2d 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20  n->aEquiv).     
82d0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
82e0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
82f0: 20 20 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69         pX = sqli
8300: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
8310: 74 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  te(pTerm->pExpr-
8320: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
8330: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
8340: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
8350: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
8360: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d  or(j=0; j<pScan-
8370: 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a  >nEquiv; j+=2){.
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8390: 28 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ( pScan->aEquiv[
83a0: 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20  j]==pX->iTable. 
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
83c0: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
83d0: 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e  +1]==pX->iColumn
83e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
83f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8400: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8410: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8420: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53         if( j==pS
8430: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20  can->nEquiv ){. 
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
8450: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20  an->aEquiv[j] = 
8460: 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
8470: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
8480: 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70  >aEquiv[j+1] = p
8490: 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  X->iColumn;.    
84a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
84b0: 3e 6e 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20  >nEquiv += 2;.  
84c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
84d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
84e0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
84f0: 70 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d  perator & pScan-
8500: 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20  >opMask)!=0 ){. 
8510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
8520: 72 69 66 79 20 74 68 65 20 61 66 66 69 6e 69 74  rify the affinit
8530: 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  y and collating 
8540: 73 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a  sequence match *
8550: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
8560: 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  ( pScan->zCollNa
8570: 6d 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f  me && (pTerm->eO
8580: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
8590: 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
85a0: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
85b0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
85c0: 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50         Parse *pP
85d0: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e  arse = pWC->pWIn
85e0: 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  fo->pParse;.    
85f0: 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 70            pX = p
8600: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
8610: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
8620: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
8630: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e  nityOk(pX, pScan
8640: 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20  ->idxaff) ){.   
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
8660: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
8670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8680: 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e       assert(pX->
8690: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
86a0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
86b0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
86c0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
86d0: 2c 0a 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 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70      pX->pLeft, p
8710: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
8720: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
8730: 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
8740: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
8750: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
8760: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8770: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
8780: 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43  zName, pScan->zC
8790: 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ollName) ){.    
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
87b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
87c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
87d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
87e0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
87f0: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d  rator & WO_EQ)!=
8800: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  0.             &
8810: 26 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  & (pX = pTerm->p
8820: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f  Expr->pRight)->o
8830: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
8840: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
8850: 3e 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e  >iTable==pScan->
8860: 61 45 71 75 69 76 5b 30 5d 0a 20 20 20 20 20 20  aEquiv[0].      
8870: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43         && pX->iC
8880: 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45  olumn==pScan->aE
8890: 71 75 69 76 5b 31 5d 0a 20 20 20 20 20 20 20 20  quiv[1].        
88a0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
88b0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
88c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
88d0: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
88e0: 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20  k = k+1;.       
88f0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72       return pTer
8900: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  m;.          }. 
8910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8920: 0a 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 57  .      pScan->pW
8930: 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e  C = pScan->pWC->
8940: 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20  pOuter;.      k 
8950: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
8960: 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61  Scan->pWC = pSca
8970: 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20  n->pOrigWC;.    
8980: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e  k = 0;.    pScan
8990: 2d 3e 69 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20  ->iEquiv += 2;. 
89a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
89b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
89c0: 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ze a WHERE claus
89d0: 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74  e scanner object
89e0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
89f0: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69  ter to the.** fi
8a00: 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75  rst match.  Retu
8a10: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
8a20: 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e   are no matches.
8a30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e  .**.** The scann
8a40: 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  er will be searc
8a50: 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63  hing the WHERE c
8a60: 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77  lause pWC.  It w
8a70: 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20  ill look.** for 
8a80: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
8a90: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
8aa0: 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c  " where X is col
8ab0: 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  umn iColumn of t
8ac0: 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54  able.** iCur.  T
8ad0: 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20  he <op> must be 
8ae0: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
8af0: 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62  tors described b
8b00: 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20  y opMask..**.** 
8b10: 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73  If the search is
8b20: 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57   for X and the W
8b30: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
8b40: 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68  ains terms of th
8b50: 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68  e.** form X=Y th
8b60: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8b70: 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72  might also retur
8b80: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
8b90: 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c  orm.** "Y <op> <
8ba0: 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d  expr>".  The num
8bb0: 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66  ber of levels of
8bc0: 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73   transitivity is
8bd0: 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74   limited,.** but
8be0: 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61   is enough to ha
8bf0: 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e  ndle most common
8c00: 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c  ly occurring SQL
8c10: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
8c20: 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74  ** If X is not t
8c30: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
8c40: 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75  RY KEY then X mu
8c50: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
8c60: 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70   with.** index p
8c70: 49 64 78 2e 0a 2a 2f 0a 57 68 65 72 65 54 65 72  Idx..*/.WhereTer
8c80: 6d 20 2a 77 68 65 72 65 53 63 61 6e 49 6e 69 74  m *whereScanInit
8c90: 28 0a 20 20 57 68 65 72 65 53 63 61 6e 20 2a 70  (.  WhereScan *p
8ca0: 53 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a 20 54  Scan,       /* T
8cb0: 68 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62 6a  he WhereScan obj
8cc0: 65 63 74 20 62 65 69 6e 67 20 69 6e 69 74 69 61  ect being initia
8cd0: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
8ce0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
8cf0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
8d00: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 63 61  clause to be sca
8d10: 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nned */.  int iC
8d20: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
8d30: 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73    /* Cursor to s
8d40: 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  can for */.  int
8d50: 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   iColumn,       
8d60: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
8d70: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
8d80: 75 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20 20 20  u32 opMask,     
8d90: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61          /* Opera
8da0: 74 6f 72 28 73 29 20 74 6f 20 73 63 61 6e 20 66  tor(s) to scan f
8db0: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
8dc0: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
8dd0: 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61  /* Must be compa
8de0: 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20  tible with this 
8df0: 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e  index */.){.  in
8e00: 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65  t j;..  /* memse
8e10: 74 28 70 53 63 61 6e 2c 20 30 2c 20 73 69 7a 65  t(pScan, 0, size
8e20: 6f 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a 2f 0a  of(*pScan)); */.
8e30: 20 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43    pScan->pOrigWC
8e40: 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d   = pWC;.  pScan-
8e50: 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 69 66  >pWC = pWC;.  if
8e60: 28 20 70 49 64 78 20 26 26 20 69 43 6f 6c 75 6d  ( pIdx && iColum
8e70: 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 63 61  n>=0 ){.    pSca
8e80: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78  n->idxaff = pIdx
8e90: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
8ea0: 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
8eb0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70  ;.    for(j=0; p
8ec0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
8ed0: 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  !=iColumn; j++){
8ee0: 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52  .      if( NEVER
8ef0: 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  (j>=pIdx->nColum
8f00: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
8f10: 20 20 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e     }.    pScan->
8f20: 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78  zCollName = pIdx
8f30: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d  ->azColl[j];.  }
8f40: 65 6c 73 65 7b 0a 20 20 20 20 70 53 63 61 6e 2d  else{.    pScan-
8f50: 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20 20 20  >idxaff = 0;.   
8f60: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
8f70: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53 63  e = 0;.  }.  pSc
8f80: 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d  an->opMask = opM
8f90: 61 73 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b 20  ask;.  pScan->k 
8fa0: 3d 20 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45  = 0;.  pScan->aE
8fb0: 71 75 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b 0a  quiv[0] = iCur;.
8fc0: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
8fd0: 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20  1] = iColumn;.  
8fe0: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20  pScan->nEquiv = 
8ff0: 32 3b 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71 75  2;.  pScan->iEqu
9000: 69 76 20 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e  iv = 2;.  return
9010: 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 70   whereScanNext(p
9020: 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Scan);.}../*.** 
9030: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72  Search for a ter
9040: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
9050: 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66  lause that is of
9060: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
9070: 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65  > <expr>".** whe
9080: 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65  re X is a refere
9090: 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75  nce to the iColu
90a0: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
90b0: 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   and <op> is one
90c0: 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78   of.** the WO_xx
90d0: 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20   operator codes 
90e0: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
90f0: 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a   op parameter..*
9100: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
9110: 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20  er to the term. 
9120: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
9130: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   found..**.** Th
9140: 65 20 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20  e term returned 
9150: 6d 69 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72  might by Y=<expr
9160: 3e 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  > if there is an
9170: 6f 74 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74  other constraint
9180: 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
9190: 20 63 6c 61 75 73 65 20 74 68 61 74 20 73 70 65   clause that spe
91a0: 63 69 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e  cifies that X=Y.
91b0: 20 20 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74    Any such const
91c0: 72 61 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a  raints will be.*
91d0: 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  * identified by 
91e0: 74 68 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74  the WO_EQUIV bit
91f0: 20 69 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65   in the pTerm->e
9200: 4f 70 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20  Operator field. 
9210: 20 54 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b 5d   The.** aEquiv[]
9220: 20 61 72 72 61 79 20 68 6f 6c 64 73 20 58 20 61   array holds X a
9230: 6e 64 20 61 6c 6c 20 69 74 73 20 65 71 75 69 76  nd all its equiv
9240: 61 6c 65 6e 74 73 2c 20 77 69 74 68 20 65 61 63  alents, with eac
9250: 68 20 53 51 4c 20 76 61 72 69 61 62 6c 65 0a 2a  h SQL variable.*
9260: 2a 20 74 61 6b 69 6e 67 20 75 70 20 74 77 6f 20  * taking up two 
9270: 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76 5b  slots in aEquiv[
9280: 5d 2e 20 20 54 68 65 20 66 69 72 73 74 20 73 6c  ].  The first sl
9290: 6f 74 20 69 73 20 66 6f 72 20 74 68 65 20 63 75  ot is for the cu
92a0: 72 73 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  rsor number.** a
92b0: 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  nd the second is
92c0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
92d0: 6e 75 6d 62 65 72 2e 20 20 54 68 65 72 65 20 61  number.  There a
92e0: 72 65 20 32 32 20 73 6c 6f 74 73 20 69 6e 20 61  re 22 slots in a
92f0: 45 71 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74 68  Equiv[].** so th
9300: 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20  at means we can 
9310: 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20  look for X plus 
9320: 75 70 20 74 6f 20 31 30 20 6f 74 68 65 72 20 65  up to 10 other e
9330: 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73  quivalent values
9340: 2e 0a 2a 2a 20 48 65 6e 63 65 20 61 20 73 65 61  ..** Hence a sea
9350: 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72  rch for X will r
9360: 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20  eturn <expr> if 
9370: 58 3d 41 31 20 61 6e 64 20 41 31 3d 41 32 20 61  X=A1 and A1=A2 a
9380: 6e 64 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64 20  nd A2=A3.** and 
9390: 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61  ... and A9=A10 a
93a0: 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a  nd A10=<expr>..*
93b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
93c0: 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73  e multiple terms
93d0: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
93e0: 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
93f0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
9400: 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72  .** then try for
9410: 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f   the one with no
9420: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
9430: 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68   <expr> - in oth
9440: 65 72 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a  er words where.*
9450: 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  * <expr> is a co
9460: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
9470: 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20  n of some kind. 
9480: 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74   Only return ent
9490: 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ries of.** the f
94a0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77  orm "X <op> Y" w
94b0: 68 65 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75  here Y is a colu
94c0: 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61  mn in another ta
94d0: 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20  ble if no terms 
94e0: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
94f0: 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78  X <op> <const-ex
9500: 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66  pr>" exist.   If
9510: 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61   no terms with a
9520: 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a   constant RHS.**
9530: 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72   exist, try to r
9540: 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61  eturn a term tha
9550: 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57  t does not use W
9560: 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 73 74 61 74  O_EQUIV..*/.stat
9570: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69  ic WhereTerm *fi
9580: 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43  ndTerm(.  WhereC
9590: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
95a0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
95b0: 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  use to be search
95c0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
95d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
95e0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
95f0: 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  f LHS */.  int i
9600: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
9610: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
9620: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69  r of LHS */.  Bi
9630: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
9640: 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20      /* RHS must 
9650: 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68  not overlap with
9660: 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20   this mask */.  
9670: 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20  u32 op,         
9680: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
9690: 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65   WO_xx values de
96a0: 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f  scribing operato
96b0: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
96c0: 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx           /* 
96d0: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
96e0: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
96f0: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
9700: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
9710: 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a  m *pResult = 0;.
9720: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a    WhereTerm *p;.
9730: 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
9740: 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72 65 53 63  ;..  p = whereSc
9750: 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 57  anInit(&scan, pW
9760: 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e  C, iCur, iColumn
9770: 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20 77  , op, pIdx);.  w
9780: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
9790: 66 28 20 28 70 2d 3e 70 72 65 72 65 71 52 69 67  f( (p->prereqRig
97a0: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  ht & notReady)==
97b0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
97c0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30  ->prereqRight==0
97d0: 20 26 26 20 28 70 2d 3e 65 4f 70 65 72 61 74 6f   && (p->eOperato
97e0: 72 26 57 4f 5f 45 51 29 21 3d 30 20 29 7b 0a 20  r&WO_EQ)!=0 ){. 
97f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b         return p;
9800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9810: 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20  f( pResult==0 ) 
9820: 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20  pResult = p;.   
9830: 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65   }.    p = where
9840: 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b  ScanNext(&scan);
9850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
9860: 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  esult;.}../* For
9870: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
9880: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
9890: 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73  prAnalyze(SrcLis
98a0: 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a  t*, WhereClause*
98b0: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  , int);../*.** C
98c0: 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20  all exprAnalyze 
98d0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20  on all terms in 
98e0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  a WHERE clause. 
98f0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
9900: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
9910: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
9920: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74  List,       /* t
9930: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
9940: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
9950: 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a 20  *pWC         /* 
9960: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
9970: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
9980: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
9990: 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72   for(i=pWC->nTer
99a0: 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  m-1; i>=0; i--){
99b0: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
99c0: 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c 20  (pTabList, pWC, 
99d0: 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  i);.  }.}..#ifnd
99e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
99f0: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
9a00: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
9a10: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
9a20: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
9a30: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70   LIKE or GLOB op
9a40: 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63  erator that.** c
9a50: 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  an be optimized 
9a60: 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79  using inequality
9a70: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52   constraints.  R
9a80: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
9a90: 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61   is.** so and fa
9aa0: 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a  lse if not..**.*
9ab0: 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74  * In order for t
9ac0: 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62  he operator to b
9ad0: 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74  e optimizible, t
9ae0: 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20 61  he RHS must be a
9af0: 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72   string.** liter
9b00: 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  al that does not
9b10: 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77 69   begin with a wi
9b20: 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61  ldcard.  .*/.sta
9b30: 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72  tic int isLikeOr
9b40: 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20 2a 70  Glob(.  Parse *p
9b50: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
9b60: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
9b70: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
9b80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
9b90: 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20  r,      /* Test 
9ba0: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
9bb0: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 50 72  */.  Expr **ppPr
9bc0: 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69 6e 74 65  efix,  /* Pointe
9bd0: 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e 47 20 65  r to TK_STRING e
9be0: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 70  xpression with p
9bf0: 61 74 74 65 72 6e 20 70 72 65 66 69 78 20 2a 2f  attern prefix */
9c00: 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c  .  int *pisCompl
9c10: 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69 66 20  ete, /* True if 
9c20: 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72  the only wildcar
9c30: 64 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61  d is % in the la
9c40: 73 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a  st character */.
9c50: 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20    int *pnoCase  
9c60: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 75      /* True if u
9c70: 70 70 65 72 63 61 73 65 20 69 73 20 65 71 75 69  ppercase is equi
9c80: 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63  valent to lowerc
9c90: 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ase */.){.  cons
9ca0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 20 20  t char *z = 0;  
9cb0: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
9cc0: 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45 20   on RHS of LIKE 
9cd0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78  operator */.  Ex
9ce0: 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65  pr *pRight, *pLe
9cf0: 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69 67 68  ft;      /* Righ
9d00: 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a 65 20  t and left size 
9d10: 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  of LIKE operator
9d20: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
9d30: 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  pList;          
9d40: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65 72   /* List of oper
9d50: 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49 4b 45  ands to the LIKE
9d60: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
9d70: 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20 20 20  nt c;           
9d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
9d90: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 5b   character in z[
9da0: 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  ] */.  int cnt; 
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
9dd0: 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66  on-wildcard pref
9de0: 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  ix characters */
9df0: 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 20 20  .  char wc[3];  
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9e10: 20 57 69 6c 64 63 61 72 64 20 63 68 61 72 61 63   Wildcard charac
9e20: 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ters */.  sqlite
9e30: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9e40: 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
9e50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
9e60: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
9e70: 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pVal = 0;.  int 
9e80: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
9e90: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
9ea0: 20 6f 66 20 70 52 69 67 68 74 20 2a 2f 0a 0a 20   of pRight */.. 
9eb0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 4c   if( !sqlite3IsL
9ec0: 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ikeFunction(db, 
9ed0: 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20  pExpr, pnoCase, 
9ee0: 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  wc) ){.    retur
9ef0: 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  n 0;.  }.#ifdef 
9f00: 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20  SQLITE_EBCDIC.  
9f10: 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20 72  if( *pnoCase ) r
9f20: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
9f30: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
9f40: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c 65 66  >x.pList;.  pLef
9f50: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  t = pList->a[1].
9f60: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65  pExpr;.  if( pLe
9f70: 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  ft->op!=TK_COLUM
9f80: 4e 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  N .   || sqlite3
9f90: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
9fa0: 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ft)!=SQLITE_AFF_
9fb0: 54 45 58 54 20 0a 20 20 20 7c 7c 20 49 73 56 69  TEXT .   || IsVi
9fc0: 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54 61  rtual(pLeft->pTa
9fd0: 62 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 49  b).  ){.    /* I
9fe0: 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34 36  MP: R-02065-4946
9ff0: 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  5 The left-hand 
a000: 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b 45  side of the LIKE
a010: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
a020: 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  r must.    ** be
a030: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
a040: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77  indexed column w
a050: 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69 74  ith TEXT affinit
a060: 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  y. */.    return
a070: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
a080: 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ( pLeft->iColumn
a090: 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63  !=(-1) ); /* Bec
a0a0: 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20 68  ause IPK never h
a0b0: 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a 0a  as AFF_TEXT */..
a0c0: 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74    pRight = pList
a0d0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
a0e0: 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b  op = pRight->op;
a0f0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
a100: 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 6f 70  GISTER ){.    op
a110: 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32 3b 0a   = pRight->op2;.
a120: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
a130: 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
a140: 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72   Vdbe *pReprepar
a150: 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70  e = pParse->pRep
a160: 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74 20  repare;.    int 
a170: 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69  iCol = pRight->i
a180: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c  Column;.    pVal
a190: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
a1a0: 74 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72  tValue(pReprepar
a1b0: 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  e, iCol, SQLITE_
a1c0: 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69  AFF_NONE);.    i
a1d0: 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74  f( pVal && sqlit
a1e0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
a1f0: 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  al)==SQLITE_TEXT
a200: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63   ){.      z = (c
a210: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
a220: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
a230: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a240: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
a250: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69  pParse->pVdbe, i
a260: 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Col);.    assert
a270: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
a280: 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69  _VARIABLE || pRi
a290: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  ght->op==TK_REGI
a2a0: 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20  STER );.  }else 
a2b0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  if( op==TK_STRIN
a2c0: 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69  G ){.    z = pRi
a2d0: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  ght->u.zToken;. 
a2e0: 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20   }.  if( z ){.  
a2f0: 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77    cnt = 0;.    w
a300: 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29  hile( (c=z[cnt])
a310: 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20  !=0 && c!=wc[0] 
a320: 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63  && c!=wc[1] && c
a330: 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20  !=wc[2] ){.     
a340: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   cnt++;.    }.  
a350: 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20    if( cnt!=0 && 
a360: 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31  255!=(u8)z[cnt-1
a370: 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ] ){.      Expr 
a380: 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20  *pPrefix;.      
a390: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63  *pisComplete = c
a3a0: 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74  ==wc[0] && z[cnt
a3b0: 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50  +1]==0;.      pP
a3c0: 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45  refix = sqlite3E
a3d0: 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e  xpr(db, TK_STRIN
a3e0: 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  G, z);.      if(
a3f0: 20 70 50 72 65 66 69 78 20 29 20 70 50 72 65 66   pPrefix ) pPref
a400: 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74  ix->u.zToken[cnt
a410: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70  ] = 0;.      *pp
a420: 50 72 65 66 69 78 20 3d 20 70 50 72 65 66 69 78  Prefix = pPrefix
a430: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  ;.      if( op==
a440: 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20  TK_VARIABLE ){. 
a450: 20 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d         Vdbe *v =
a460: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
a470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a480: 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c  dbeSetVarmask(v,
a490: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
a4a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  );.        if( *
a4b0: 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70  pisComplete && p
a4c0: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  Right->u.zToken[
a4d0: 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
a4e0: 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66  /* If the rhs of
a4f0: 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73   the LIKE expres
a500: 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62  sion is a variab
a510: 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  le, and the curr
a520: 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ent.          **
a530: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61   value of the va
a540: 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65  riable means the
a550: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
a560: 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45   invoke the LIKE
a570: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75  .          ** fu
a580: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20  nction, then no 
a590: 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c  OP_Variable will
a5a0: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
a5b0: 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20   program..      
a5c0: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73      ** This caus
a5d0: 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  es problems for 
a5e0: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
a5f0: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
a600: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41  ).          ** A
a610: 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e  PI. To workaroun
a620: 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75  d them, add a du
a630: 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20  mmy OP_Variable 
a640: 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20  here..          
a650: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e  */ .          in
a660: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
a670: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
a680: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
a690: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
a6a0: 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  t(pParse, pRight
a6b0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
a6c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
a6d0: 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56  geP3(v, sqlite3V
a6e0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
a6f0: 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  )-1, 0);.       
a700: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
a710: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
a720: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   r1);.        }.
a730: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
a740: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a  e{.      z = 0;.
a750: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
a760: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
a770: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a  al);.  return (z
a780: 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  !=0);.}.#endif /
a790: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
a7a0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
a7b0: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
a7c0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
a7d0: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63  TABLE./*.** Chec
a7e0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
a7f0: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
a800: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
a810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  **.**         co
a820: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a  lumn MATCH expr.
a830: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74  **.** If it is t
a840: 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e  hen return TRUE.
a850: 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e    If not, return
a860: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
a870: 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43  c int isMatchOfC
a880: 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70  olumn(.  Expr *p
a890: 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73  Expr      /* Tes
a8a0: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
a8b0: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  n */.){.  ExprLi
a8c0: 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66  st *pList;..  if
a8d0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
a8e0: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
a8f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a900: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
a910: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
a920: 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29  en,"match")!=0 )
a930: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a940: 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45    }.  pList = pE
a950: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
a960: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
a970: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
a980: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
a990: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
a9a0: 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d  ->op != TK_COLUM
a9b0: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
a9c0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
a9d0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
a9e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
a9f0: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
aa00: 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65  * If the pBase e
aa10: 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
aa20: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
aa30: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
aa40: 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65  f.** a join, the
aa50: 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61  n transfer the a
aa60: 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69  ppropriate marki
aa70: 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69  ngs over to deri
aa80: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
aa90: 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e  oid transferJoin
aaa0: 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70  Markings(Expr *p
aab0: 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70  Derived, Expr *p
aac0: 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69 76 65  Base){.  pDerive
aad0: 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73  d->flags |= pBas
aae0: 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72  e->flags & EP_Fr
aaf0: 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76  omJoin;.  pDeriv
ab00: 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  ed->iRightJoinTa
ab10: 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52 69  ble = pBase->iRi
ab20: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a  ghtJoinTable;.}.
ab30: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ab40: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
ab50: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
ab60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ab70: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a  IT_SUBQUERY)./*.
ab80: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  ** Analyze a ter
ab90: 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  m that consists 
aba0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  of two or more O
abb0: 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73  R-connected.** s
abc0: 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a  ubterms.  So in:
abd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57  .**.**     ... W
abe0: 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20  HERE  (a=5) AND 
abf0: 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64  (b=7 OR c=9 OR d
ac00: 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a  =13) AND (d=13).
ac10: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e              ^^^^
ac30: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
ac40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ac50: 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72  ine analyzes ter
ac60: 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20 6d  ms such as the m
ac70: 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  iddle term in th
ac80: 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e  e above example.
ac90: 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72  .** A WhereOrTer
aca0: 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70  m object is comp
acb0: 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68 65  uted and attache
acc0: 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e  d to the term un
acd0: 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c  der.** analysis,
ace0: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
acf0: 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68  he outcome of th
ad00: 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e  e analysis.  Hen
ad10: 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  ce:.**.**     Wh
ad20: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20  ereTerm.wtFlags 
ad30: 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46    |=  TERM_ORINF
ad40: 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  O.**     WhereTe
ad50: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20  rm.u.pOrInfo  = 
ad60: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
ad70: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72  llocated WhereOr
ad80: 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a  Term object.**.*
ad90: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
ada0: 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68   analyzed must h
adb0: 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ave two or more 
adc0: 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  of OR-connected 
add0: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73  subterms..** A s
ade0: 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69  ingle subterm mi
adf0: 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66 20  ght be a set of 
ae00: 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75  AND-connected su
ae10: 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45  b-subterms..** E
ae20: 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73  xamples of terms
ae30: 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a   under analysis:
ae40: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20  .**.**     (A)  
ae50: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
ae60: 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e  t1.x=t2.z OR t1.
ae70: 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e  y=15 OR t1.z=t3.
ae80: 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20  a+5.**     (B)  
ae90: 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78     x=expr1 OR ex
aea0: 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33  pr2=x OR x=expr3
aeb0: 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20 20  .**     (C)     
aec0: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31  t1.x=t2.y OR (t1
aed0: 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79  .x=t2.z AND t1.y
aee0: 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20  =15).**     (D) 
aef0: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28      x=expr1 OR (
af00: 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e  y>11 AND y<22 AN
af10: 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f  D z LIKE '*hello
af20: 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20  *').**     (E)  
af30: 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e     (p.a=1 AND q.
af40: 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f  b=2 AND r.c=3) O
af50: 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79  R (p.x=4 AND q.y
af60: 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a  =5 AND r.z=6).**
af70: 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a  .** CASE 1:.**.*
af80: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
af90: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
afa0: 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73  m T.C=expr for s
afb0: 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  ome single colum
afc0: 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20  n of C and.** a 
afd0: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28  single table T (
afe0: 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d  as shown in exam
aff0: 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65  ple B above) the
b000: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
b010: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74  irtual.** term t
b020: 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61  hat is an equiva
b030: 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69  lent IN expressi
b040: 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
b050: 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d  rds, if the term
b060: 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  .** being analyz
b070: 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed is:.**.**    
b080: 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20    x = expr1  OR 
b090: 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20   expr2 = x  OR  
b0a0: 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20  x = expr3.**.** 
b0b0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
b0c0: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c  w virtual term l
b0d0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
b0e0: 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31       x IN (expr1
b0f0: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
b100: 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a  .** CASE 2:.**.*
b110: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
b120: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20  s are indexable 
b130: 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  by a single tabl
b140: 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  e T, then set.**
b150: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
b160: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20  m.eOperator     
b170: 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f           =  WO_O
b180: 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  R.**     WhereTe
b190: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  rm.u.pOrInfo->in
b1a0: 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65  dexable  |=  the
b1b0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
b1c0: 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a  or table T.**.**
b1d0: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69   A subterm is "i
b1e0: 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20  ndexable" if it 
b1f0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
b200: 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70  * "T.C <op> <exp
b210: 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61  r>" where C is a
b220: 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ny column of tab
b230: 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70  le T and .** <op
b240: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c  > is one of "=",
b250: 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c   "<", "<=", ">",
b260: 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22   ">=", "IS NULL"
b270: 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20  , or "IN"..** A 
b280: 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20  subterm is also 
b290: 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20  indexable if it 
b2a0: 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f  is an AND of two
b2b0: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73   or more.** subs
b2c0: 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74  ubterms at least
b2d0: 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73   one of which is
b2e0: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64   indexable.  Ind
b2f0: 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73  exable AND .** s
b300: 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65  ubterms have the
b310: 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  ir eOperator set
b320: 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74   to WO_AND and t
b330: 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41  hey have.** u.pA
b340: 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20  ndInfo set to a 
b350: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
b360: 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65  cated WhereAndTe
b370: 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  rm object..**.**
b380: 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f   From another po
b390: 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e  int of view, "in
b3a0: 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74  dexable" means t
b3b0: 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20  hat the subterm 
b3c0: 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69  could.** potenti
b3d0: 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  ally be used wit
b3e0: 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e  h an index if an
b3f0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
b400: 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68  ex exists..** Th
b410: 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73  is analysis does
b420: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68   not consider wh
b430: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
b440: 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74   index exists; t
b450: 68 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68  hat.** is someth
b460: 69 6e 67 20 74 68 65 20 62 65 73 74 49 6e 64 65  ing the bestInde
b470: 78 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  x() routine will
b480: 20 64 65 74 65 72 6d 69 6e 65 2e 20 20 54 68 69   determine.  Thi
b490: 73 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e  s analysis.** on
b4a0: 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74  ly looks at whet
b4b0: 68 65 72 20 73 75 62 74 65 72 6d 73 20 61 70 70  her subterms app
b4c0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64  ropriate for ind
b4d0: 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a  exing exist..**.
b4e0: 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20  ** All examples 
b4f0: 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76  A through E abov
b500: 65 20 61 6c 6c 20 73 61 74 69 73 66 79 20 63 61  e all satisfy ca
b510: 73 65 20 32 2e 20 20 42 75 74 20 69 66 20 61 20  se 2.  But if a 
b520: 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61  term.** also sta
b530: 74 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28  tisfies case 1 (
b540: 73 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e  such as B) we kn
b550: 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69  ow that the opti
b560: 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c  mizer will.** al
b570: 77 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65  ways prefer case
b580: 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63   1, so in that c
b590: 61 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74  ase we pretend t
b5a0: 68 61 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f  hat case 2 is no
b5b0: 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a  t.** satisfied..
b5c0: 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62  **.** It might b
b5d0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
b5e0: 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20  multiple tables 
b5f0: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20  are indexable.  
b600: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
b610: 28 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64  (E) above is ind
b620: 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73  exable on tables
b630: 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a   P, Q, and R..**
b640: 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73  .** Terms that s
b650: 61 74 69 73 66 79 20 63 61 73 65 20 32 20 61 72  atisfy case 2 ar
b660: 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  e candidates for
b670: 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67   lookup by using
b680: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64  .** separate ind
b690: 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77  ices to find row
b6a0: 69 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62  ids for each sub
b6b0: 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69  term and composi
b6c0: 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20  ng.** the union 
b6d0: 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73  of all rowids us
b6e0: 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a  ing a RowSet obj
b6f0: 65 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69  ect.  This is si
b700: 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74  milar.** to "bit
b710: 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20  map indices" in 
b720: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65  other database e
b730: 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54  ngines..**.** OT
b740: 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49  HERWISE:.**.** I
b750: 66 20 6e 65 69 74 68 65 72 20 63 61 73 65 20 31  f neither case 1
b760: 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c   nor case 2 appl
b770: 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68  y, then leave th
b780: 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20  e eOperator set 
b790: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69  to.** zero.  Thi
b7a0: 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73  s term is not us
b7b0: 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e  eful for search.
b7c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b7d0: 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
b7e0: 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  m(.  SrcList *pS
b7f0: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
b800: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
b810: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
b820: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
b830: 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   /* the complete
b840: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
b850: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20  .  int idxTerm  
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b870: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d  Index of the OR-
b880: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
b890: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
b8a0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
b8b0: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 20 20 20  pWC->pWInfo;    
b8c0: 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
b8d0: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  use processing c
b8e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
b8f0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
b900: 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  fo->pParse;     
b910: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
b920: 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
b930: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
b940: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
b950: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
b960: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57  onnection */.  W
b970: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
b980: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
b990: 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65  m];    /* The te
b9a0: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
b9b0: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  d */.  Expr *pEx
b9c0: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
b9d0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
b9e0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
b9f0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a   of the term */.
ba00: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    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 2f 2a 20 4c 6f 6f            /* Loo
ba30: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
ba40: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
ba50: 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65  Wc;       /* Bre
ba60: 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e  akup of pTerm in
ba70: 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
ba80: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
ba90: 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20  erm;       /* A 
baa0: 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20  Sub-term within 
bab0: 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57  the pOrWc */.  W
bac0: 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49  hereOrInfo *pOrI
bad0: 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69  nfo;     /* Addi
bae0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
baf0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
bb00: 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69  th pTerm */.  Bi
bb10: 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20  tmask chngToIN; 
bb20: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
bb30: 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74  s that might sat
bb40: 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20  isfy case 1 */. 
bb50: 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62   Bitmask indexab
bb60: 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61  le;        /* Ta
bb70: 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  bles that are in
bb80: 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79  dexable, satisfy
bb90: 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20  ing case 2 */.. 
bba0: 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74   /*.  ** Break t
bbb0: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74  he OR clause int
bbc0: 6f 20 69 74 73 20 73 65 70 61 72 61 74 65 20 73  o its separate s
bbd0: 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75  ubterms.  The su
bbe0: 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20  bterms are.  ** 
bbf0: 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72  stored in a Wher
bc00: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
bc10: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74  e containing wit
bc20: 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49  hin the WhereOrI
bc30: 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20  nfo.  ** object 
bc40: 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65 64  that is attached
bc50: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
bc60: 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e   OR clause term.
bc70: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
bc80: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
bc90: 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c  & (TERM_DYNAMIC|
bca0: 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d  TERM_ORINFO|TERM
bcb0: 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  _ANDINFO))==0 );
bcc0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
bcd0: 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ->op==TK_OR );. 
bce0: 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66   pTerm->u.pOrInf
bcf0: 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71  o = pOrInfo = sq
bd00: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
bd10: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f  o(db, sizeof(*pO
bd20: 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70  rInfo));.  if( p
bd30: 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75  OrInfo==0 ) retu
bd40: 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46  rn;.  pTerm->wtF
bd50: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49  lags |= TERM_ORI
bd60: 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26  NFO;.  pOrWc = &
bd70: 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77  pOrInfo->wc;.  w
bd80: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70  hereClauseInit(p
bd90: 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  OrWc, pWInfo);. 
bda0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57   whereSplit(pOrW
bdb0: 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29  c, pExpr, TK_OR)
bdc0: 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  ;.  exprAnalyzeA
bdd0: 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b  ll(pSrc, pOrWc);
bde0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
bdf0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
be00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 57  ;.  assert( pOrW
be10: 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a  c->nTerm>=2 );..
be20: 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74    /*.  ** Comput
be30: 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  e the set of tab
be40: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
be50: 61 74 69 73 66 79 20 63 61 73 65 73 20 31 20 6f  atisfy cases 1 o
be60: 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65  r 2..  */.  inde
be70: 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73  xable = ~(Bitmas
be80: 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20  k)0;.  chngToIN 
be90: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
bea0: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
beb0: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
bec0: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26  OrWc->a; i>=0 &&
bed0: 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c   indexable; i--,
bee0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
bef0: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
bf00: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
bf10: 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NGLE)==0 ){.    
bf20: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
bf30: 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAndInfo;.      
bf40: 61 73 73 65 72 74 28 20 28 70 4f 72 54 65 72 6d  assert( (pOrTerm
bf50: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
bf60: 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f  M_ANDINFO|TERM_O
bf70: 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  RINFO))==0 );.  
bf80: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
bf90: 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66 6f  ;.      pAndInfo
bfa0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
bfb0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
bfc0: 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20  (*pAndInfo));.  
bfd0: 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66 6f      if( pAndInfo
bfe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
bff0: 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 3b  eClause *pAndWC;
c000: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
c010: 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20  rm *pAndTerm;.  
c020: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
c030: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
c040: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   0;.        pOrT
c050: 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20  erm->u.pAndInfo 
c060: 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20  = pAndInfo;.    
c070: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
c080: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44  lags |= TERM_AND
c090: 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f  INFO;.        pO
c0a0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
c0b0: 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20   = WO_AND;.     
c0c0: 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41 6e     pAndWC = &pAn
c0d0: 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
c0e0: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
c0f0: 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e  it(pAndWC, pWC->
c100: 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
c110: 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64   whereSplit(pAnd
c120: 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  WC, pOrTerm->pEx
c130: 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  pr, TK_AND);.   
c140: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
c150: 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43  All(pSrc, pAndWC
c160: 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  );.        pAndW
c170: 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  C->pOuter = pWC;
c180: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
c190: 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e( db->mallocFai
c1a0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
c1b0: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
c1c0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
c1d0: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54    for(j=0, pAndT
c1e0: 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a  erm=pAndWC->a; j
c1f0: 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20  <pAndWC->nTerm; 
c200: 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29  j++, pAndTerm++)
c210: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
c220: 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e  sert( pAndTerm->
c230: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  pExpr );.       
c240: 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65 64       if( allowed
c250: 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78  Op(pAndTerm->pEx
c260: 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20  pr->op) ){.     
c270: 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65           b |= ge
c280: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
c290: 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72  MaskSet, pAndTer
c2a0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
c2c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c2d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65    }.        inde
c2e0: 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20  xable &= b;.    
c2f0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
c300: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
c310: 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44  gs & TERM_COPIED
c320: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69   ){.      /* Ski
c330: 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20  p this term for 
c340: 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74  now.  We revisit
c350: 20 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63   it when we proc
c360: 65 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ess the.      **
c370: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54   corresponding T
c380: 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d  ERM_VIRTUAL term
c390: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
c3a0: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a       Bitmask b;.
c3b0: 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d 61 73        b = getMas
c3c0: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
c3d0: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
c3e0: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
c3f0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
c400: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
c410: 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  TUAL ){.        
c420: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
c430: 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  r = &pOrWc->a[pO
c440: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  rTerm->iParent];
c450: 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65  .        b |= ge
c460: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
c470: 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d  MaskSet, pOther-
c480: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
c490: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64 65      }.      inde
c4a0: 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20  xable &= b;.    
c4b0: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
c4c0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
c4d0: 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Q)==0 ){.       
c4e0: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
c4f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c500: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20      chngToIN &= 
c510: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
c520: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
c530: 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f  Record the set o
c540: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 61  f tables that sa
c550: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 54  tisfy case 2.  T
c560: 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65 0a  he set might be.
c570: 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f    ** empty..  */
c580: 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .  pOrInfo->inde
c590: 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c  xable = indexabl
c5a0: 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65  e;.  pTerm->eOpe
c5b0: 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c  rator = indexabl
c5c0: 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52  e==0 ? 0 : WO_OR
c5d0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e  ;..  /*.  ** chn
c5e0: 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73 65  gToIN holds a se
c5f0: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
c600: 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66 79   *might* satisfy
c610: 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20 20   case 1.  But.  
c620: 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f  ** we have to do
c630: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
c640: 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65   checking to see
c650: 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c 6c   if case 1 reall
c660: 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73 66  y.  ** is satisf
c670: 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  ied..  **.  ** c
c680: 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c  hngToIN will hol
c690: 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20 6f  d either 0, 1, o
c6a0: 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20 30  r 2 bits.  The 0
c6b0: 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73 0a  -bit case means.
c6c0: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20    ** that there 
c6d0: 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74  is no possibilit
c6e0: 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e  y of transformin
c6f0: 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  g the OR clause 
c700: 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20  into an.  ** IN 
c710: 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73 65  operator because
c720: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72   one or more ter
c730: 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61  ms in the OR cla
c740: 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a  use contain.  **
c750: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
c760: 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f   than == on a co
c770: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e 67  lumn in the sing
c780: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 31  le table.  The 1
c790: 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d  -bit.  ** case m
c7a0: 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79 20  eans that every 
c7b0: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63  term of the OR c
c7c0: 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 20  lause is of the 
c7d0: 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65  form.  ** "table
c7e0: 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f  .column=expr" fo
c7f0: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61  r some single ta
c800: 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62 69  ble.  The one bi
c810: 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20 20  t that is set.  
c820: 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f  ** will correspo
c830: 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  nd to the common
c840: 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69 6c   table.  We stil
c850: 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  l need to check 
c860: 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  to make.  ** sur
c870: 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  e the same colum
c880: 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c  n is used on all
c890: 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d 62   terms.  The 2-b
c8a0: 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e 0a  it case is when.
c8b0: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65 72    ** the all ter
c8c0: 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f  ms are of the fo
c8d0: 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  rm "table1.colum
c8e0: 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22  n=table2.column"
c8f0: 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74  .  It.  ** might
c900: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
c910: 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61  form an IN opera
c920: 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72 20  tor with either 
c930: 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20  table1.column.  
c940: 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c  ** or table2.col
c950: 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20 69  umn as the LHS i
c960: 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d 6d  f either is comm
c970: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
c980: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20   of.  ** the OR 
c990: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
c9a0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72 6d  * Note that term
c9b0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  s of the form "t
c9c0: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62  able.column1=tab
c9d0: 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65  le.column2" (the
c9e0: 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65  .  ** same table
c9f0: 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20 6f   on both sizes o
ca00: 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74  f the ==) cannot
ca10: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20   be optimized.. 
ca20: 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54 6f   */.  if( chngTo
ca30: 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b  IN ){.    int ok
ca40: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20  ToChngToIN = 0; 
ca50: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
ca60: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f  he conversion to
ca70: 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a   IN is valid */.
ca80: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20      int iColumn 
ca90: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
caa0: 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e   Column index on
cab0: 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72 61   lhs of IN opera
cac0: 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  tor */.    int i
cad0: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20  Cursor = -1;    
cae0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75       /* Table cu
caf0: 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  rsor common to a
cb00: 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  ll terms */.    
cb10: 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20 20  int j = 0;      
cb20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
cb30: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
cb40: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
cb50: 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  a table and colu
cb60: 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73 20  mn that appears 
cb70: 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  on one side or t
cb80: 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  he.    ** other 
cb90: 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74  of the == operat
cba0: 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62 74  or in every subt
cbb0: 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c 65  erm.  That table
cbc0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   and column.    
cbd0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  ** will be recor
cbe0: 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20 61  ded in iCursor a
cbf0: 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65  nd iColumn.  The
cc00: 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  re might not be 
cc10: 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  any.    ** such 
cc20: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
cc30: 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54  .  Set okToChngT
cc40: 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f 70  oIN if an approp
cc50: 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20  riate table.    
cc60: 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  ** and column is
cc70: 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76 65   found but leave
cc80: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61   okToChngToIN fa
cc90: 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  lse if not found
cca0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
ccb0: 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b  (j=0; j<2 && !ok
ccc0: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29  ToChngToIN; j++)
ccd0: 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d 20  {.      pOrTerm 
cce0: 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20  = pOrWc->a;.    
ccf0: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
cd00: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
cd10: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
cd20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
cd30: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
cd40: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
cd50: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
cd60: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
cd70: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  R_OK;.        if
cd80: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
cd90: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
cda0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
cdb0: 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74  his is the 2-bit
cdc0: 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65   case and we are
cdd0: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
cde0: 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  teration and.   
cdf0: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
ce00: 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74  t term is from t
ce10: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
ce20: 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69  on.  So skip thi
ce30: 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  s term. */.     
ce40: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
ce50: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
ce60: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
ce70: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
ce80: 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61  chngToIN & getMa
ce90: 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
cea0: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
ceb0: 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29  eftCursor))==0 )
cec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
ced0: 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65  his term must be
cee0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e   of the form t1.
cef0: 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32  a==t2.b where t2
cf00: 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20   is in the.     
cf10: 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e       ** chngToIN
cf20: 20 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e   set but t1 is n
cf30: 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77  ot.  This term w
cf40: 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72  ill be either pr
cf50: 65 63 65 65 64 65 64 0a 20 20 20 20 20 20 20 20  eceeded.        
cf60: 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20    ** or follwed 
cf70: 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63  by an inverted c
cf80: 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29  opy (t2.b==t1.a)
cf90: 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  .  Skip this ter
cfa0: 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  m .          ** 
cfb0: 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76 65  and use its inve
cfc0: 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  rsion. */.      
cfd0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
cfe0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
cff0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a   TERM_COPIED );.
d000: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
d010: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
d020: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
d030: 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  UAL );.         
d040: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
d050: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
d060: 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49  M_COPIED|TERM_VI
d070: 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20  RTUAL) );.      
d080: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
d090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d0a0: 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72  iColumn = pOrTer
d0b0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
d0c0: 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72  .        iCursor
d0d0: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74   = pOrTerm->left
d0e0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
d0f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
d100: 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a       if( i<0 ){.
d110: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61          /* No ca
d120: 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f  ndidate table+co
d130: 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20  lumn was found. 
d140: 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
d150: 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ccur.        ** 
d160: 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74  on the second it
d170: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
d180: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20     assert( j==1 
d190: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
d1a0: 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
d1b0: 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20  chngToIN) );.   
d1c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68 6e       assert( chn
d1d0: 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 26  gToIN==getMask(&
d1e0: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
d1f0: 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  , iCursor) );.  
d200: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d210: 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
d220: 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20  ase( j==1 );..  
d230: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 66      /* We have f
d240: 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74 65  ound a candidate
d250: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
d260: 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  n.  Check to see
d270: 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   if that.      *
d280: 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  * table and colu
d290: 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  mn is common to 
d2a0: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
d2b0: 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20  e OR clause */. 
d2c0: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
d2d0: 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  N = 1;.      for
d2e0: 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43  (; i>=0 && okToC
d2f0: 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f  hngToIN; i--, pO
d300: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
d310: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
d320: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
d330: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
d340: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
d350: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72  tCursor!=iCursor
d360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
d370: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
d380: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
d390: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
d3a0: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
d3b0: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
d3c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54  ){.          okT
d3d0: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
d3e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d3f0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c          int affL
d400: 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20  eft, affRight;. 
d410: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
d420: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
d430: 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c  de is also a col
d440: 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66  umn, then the af
d450: 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20  finities.       
d460: 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69     ** of both ri
d470: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64  ght and left sid
d480: 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20  es must be such 
d490: 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20  that no type.   
d4a0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72         ** conver
d4b0: 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72  sions are requir
d4c0: 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  ed on the right.
d4d0: 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29    (Ticket #2249)
d4e0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
d4f0: 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74          affRight
d500: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
d510: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
d520: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
d530: 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66            affLef
d540: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
d550: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
d560: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
d570: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66            if( af
d580: 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66  fRight!=0 && aff
d590: 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29  Right!=affLeft )
d5a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b  {.            ok
d5b0: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
d5c0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
d5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72  .            pOr
d5e0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
d5f0: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20   TERM_OR_OK;.   
d600: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d610: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
d620: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
d630: 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67   point, okToChng
d640: 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20  ToIN is true if 
d650: 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73  original pTerm s
d660: 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20  atisfies.    ** 
d670: 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74  case 1.  In that
d680: 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74   case, construct
d690: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
d6a0: 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20  erm that is .   
d6b0: 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72   ** pTerm conver
d6c0: 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f  ted into an IN o
d6d0: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2a 0a  perator..    **.
d6e0: 20 20 20 20 2a 2a 20 45 56 3a 20 52 2d 30 30 32      ** EV: R-002
d6f0: 31 31 2d 31 35 31 30 30 0a 20 20 20 20 2a 2f 0a  11-15100.    */.
d700: 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67      if( okToChng
d710: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  ToIN ){.      Ex
d720: 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20  pr *pDup;       
d730: 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69       /* A transi
d740: 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78  ent duplicate ex
d750: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
d760: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d770: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  t = 0;   /* The 
d780: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
d790: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
d7a0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b  Expr *pLeft = 0;
d7b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48         /* The LH
d7c0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
d7d0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
d7e0: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
d7f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
d800: 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  lete IN operator
d810: 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   */..      for(i
d820: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
d830: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
d840: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  a; i>=0; i--, pO
d850: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
d860: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
d870: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
d880: 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69  R_OK)==0 ) conti
d890: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  nue;.        ass
d8a0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
d8b0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
d8c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
d8d0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t( pOrTerm->left
d8e0: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
d8f0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
d900: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  t( pOrTerm->u.le
d910: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
d920: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75  n );.        pDu
d930: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
d940: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
d950: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
d960: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
d970: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
d980: 73 74 41 70 70 65 6e 64 28 70 57 49 6e 66 6f 2d  stAppend(pWInfo-
d990: 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  >pParse, pList, 
d9a0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70  pDup);.        p
d9b0: 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Left = pOrTerm->
d9c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
d9d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
d9e0: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
d9f0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
da00: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
da10: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
da20: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50   pNew = sqlite3P
da30: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
da40: 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b  IN, pDup, 0, 0);
da50: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
da60: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
da70: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74  dxNew;.        t
da80: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
da90: 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29  ngs(pNew, pExpr)
daa0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
dab0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
dac0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53  ty(pNew, EP_xIsS
dad0: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
dae0: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
daf0: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
db00: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
db10: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
db20: 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54   pNew, TERM_VIRT
db30: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
db40: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
db50: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
db60: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
db70: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
db80: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
db90: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
dba0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
dbb0: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
dbc0: 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w].iParent = idx
dbd0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
dbe0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
dbf0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
dc00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
dc10: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
dc20: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
dc30: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
dc40: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50  erator = WO_NOOP
dc50: 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75  ;  /* case 1 tru
dc60: 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20 20  mps case 2 */.  
dc70: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
dc80: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
dc90: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
dca0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
dcb0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
dcc0: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f  .** The input to
dcd0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
dce0: 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74   an WhereTerm st
dcf0: 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c  ructure with onl
dd00: 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22  y the.** "pExpr"
dd10: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e   field filled in
dd20: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
dd30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
dd40: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20   analyze the.** 
dd50: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  subexpression an
dd60: 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74  d populate all t
dd70: 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  he other fields 
dd80: 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  of the WhereTerm
dd90: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
dda0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
ddb0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
ddc0: 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f   form "<expr> <o
ddd0: 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f  p> X" it gets co
dde0: 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  mmuted.** to the
ddf0: 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f   standard form o
de00: 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  f "X <op> <expr>
de10: 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  "..**.** If the 
de20: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
de30: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
de40: 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20  > Y" where both 
de50: 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63  X and Y are.** c
de60: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65  olumns, then the
de70: 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73   original expres
de80: 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65  sion is unchange
de90: 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74  d and a new virt
dea0: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74  ual.** term of t
deb0: 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20  he form "Y <op> 
dec0: 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  X" is added to t
ded0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
dee0: 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  and.** analyzed 
def0: 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65  separately.  The
df00: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69   original term i
df10: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
df20: 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64  RM_COPIED.** and
df30: 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73   the new term is
df40: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52   marked with TER
df50: 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75  M_DYNAMIC (becau
df60: 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a  se it's pExpr.**
df70: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
df80: 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65 72  ed with the Wher
df90: 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52  eClause) and TER
dfa0: 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61 75  M_VIRTUAL (becau
dfb0: 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f  se it.** is a co
dfc0: 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61  mmuted copy of a
dfd0: 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54   prior term.)  T
dfe0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
dff0: 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a   has nChild=1.**
e000: 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61   and the copy ha
e010: 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74 20  s idxParent set 
e020: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
e030: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  the original ter
e040: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
e050: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20  d exprAnalyze(. 
e060: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
e070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
e080: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
e090: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
e0a0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
e0b0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e0c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
e0d0: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
e0e0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
e0f0: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
e100: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
e110: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
e120: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20  pWC->pWInfo; /* 
e130: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
e140: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
e150: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
e160: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
e170: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72        /* The ter
e180: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
e190: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
e1a0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
e1b0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66         /* Set of
e1c0: 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73   table index mas
e1d0: 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ks */.  Expr *pE
e1e0: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
e1f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e200: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
e210: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42   analyzed */.  B
e220: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66  itmask prereqLef
e230: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
e240: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
e250: 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70   of the pExpr->p
e260: 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Left */.  Bitmas
e270: 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20  k prereqAll;    
e280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
e290: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70  erequesites of p
e2a0: 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Expr */.  Bitmas
e2b0: 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30  k extraRight = 0
e2c0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ;          /* Ex
e2d0: 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73  tra dependencies
e2e0: 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f   on LEFT JOIN */
e2f0: 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d  .  Expr *pStr1 =
e300: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e310: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
e320: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
e330: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70   */.  int isComp
e340: 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  lete = 0;       
e350: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
e360: 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20   LIKE/GLOB ends 
e370: 77 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f  with wildcard */
e380: 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20  .  int noCase = 
e390: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
e3a0: 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42      /* LIKE/GLOB
e3b0: 20 64 69 73 74 69 6e 67 75 69 73 68 65 73 20 63   distinguishes c
e3c0: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ase */.  int op;
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
e3f0: 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e  -level operator.
e400: 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20    pExpr->op */. 
e410: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
e420: 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
e430: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
e440: 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
e450: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e460: 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  db;        /* Da
e470: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e480: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  n */..  if( db->
e490: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
e4a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
e4b0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
e4c0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d  a[idxTerm];.  pM
e4d0: 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f  askSet = &pWInfo
e4e0: 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45  ->sMaskSet;.  pE
e4f0: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
e500: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  pr;.  assert( pE
e510: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 26  xpr->op!=TK_AS &
e520: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
e530: 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 70 72 65  COLLATE );.  pre
e540: 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61  reqLeft = exprTa
e550: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
e560: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
e570: 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  ;.  op = pExpr->
e580: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
e590: 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _IN ){.    asser
e5a0: 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
e5b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 45  ==0 );.    if( E
e5c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e5d0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
e5e0: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65  ct) ){.      pTe
e5f0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
e600: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
e610: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
e620: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
e630: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
e640: 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72       pTerm->prer
e650: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69  eqRight = exprLi
e660: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
e670: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
e680: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
e690: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
e6a0: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70  _ISNULL ){.    p
e6b0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
e6c0: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
e6d0: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
e6e0: 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62  qRight = exprTab
e6f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
e700: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
e710: 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c  ;.  }.  prereqAl
e720: 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  l = exprTableUsa
e730: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
e740: 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  pr);.  if( ExprH
e750: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
e760: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
e770: 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20  {.    Bitmask x 
e780: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
e790: 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68  et, pExpr->iRigh
e7a0: 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20  tJoinTable);.   
e7b0: 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b   prereqAll |= x;
e7c0: 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74 20  .    extraRight 
e7d0: 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c  = x-1;  /* ON cl
e7e0: 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e  ause terms may n
e7f0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
e800: 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  an index.       
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65  ** on left table
e830: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
e840: 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a    Ticket #3015 *
e850: 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70  /.  }.  pTerm->p
e860: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
e870: 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c  qAll;.  pTerm->l
e880: 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  eftCursor = -1;.
e890: 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74    pTerm->iParent
e8a0: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
e8b0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20  eOperator = 0;. 
e8c0: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f   if( allowedOp(o
e8d0: 70 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  p) ){.    Expr *
e8e0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
e8f0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
e900: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
e910: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
e920: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
e930: 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70  Collate(pExpr->p
e940: 52 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36 20  Right);.    u16 
e950: 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d 2d  opMask = (pTerm-
e960: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
e970: 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f 20  rereqLeft)==0 ? 
e980: 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55 49  WO_ALL : WO_EQUI
e990: 56 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  V;.    if( pLeft
e9a0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
e9b0: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
e9c0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
e9d0: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
e9e0: 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43    pTerm->u.leftC
e9f0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
ea00: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54  Column;.      pT
ea10: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
ea20: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70   operatorMask(op
ea30: 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20  ) & opMask;.    
ea40: 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  }.    if( pRight
ea50: 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   && pRight->op==
ea60: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
ea70: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
ea80: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
ea90: 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36 20  pDup;.      u16 
eaa0: 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20 20  eExtraOp = 0;   
eab0: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 69       /* Extra bi
eac0: 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f 70  ts for pNew->eOp
ead0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
eae0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
eaf0: 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ursor>=0 ){.    
eb00: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
eb10: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
eb20: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
eb30: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
eb40: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
eb50: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
eb60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
eb70: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75  prDelete(db, pDu
eb80: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
eb90: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
eba0: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
ebb0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
ebc0: 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45  rt(pWC, pDup, TE
ebd0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
ebe0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
ebf0: 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20    if( idxNew==0 
ec00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
ec10: 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61    pNew = &pWC->a
ec20: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
ec30: 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20    pNew->iParent 
ec40: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
ec50: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
ec60: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
ec70: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
ec80: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ld = 1;.        
ec90: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
eca0: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
ecb0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
ecc0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20 20 20  ->op==TK_EQ.    
ecd0: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
ece0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
ecf0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
ed00: 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
ed10: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
ed20: 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74 69   SQLITE_Transiti
ed30: 76 65 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ve).        ){. 
ed40: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
ed50: 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f  eOperator |= WO_
ed60: 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 20  EQUIV;.         
ed70: 20 65 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45   eExtraOp = WO_E
ed80: 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a  QUIV;.        }.
ed90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
eda0: 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70       pDup = pExp
edb0: 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  r;.        pNew 
edc0: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
edd0: 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75  .      exprCommu
ede0: 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29  te(pParse, pDup)
edf0: 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20  ;.      pLeft = 
ee00: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
ee10: 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70 4c 65  ollate(pDup->pLe
ee20: 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ft);.      pNew-
ee30: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
ee40: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
ee50: 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43     pNew->u.leftC
ee60: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
ee70: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65  Column;.      te
ee80: 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71 4c  stcase( (prereqL
ee90: 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74  eft | extraRight
eea0: 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20  ) != prereqLeft 
eeb0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
eec0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
eed0: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52  reqLeft | extraR
eee0: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  ight;.      pNew
eef0: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
ef00: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
ef10: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  New->eOperator =
ef20: 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70   (operatorMask(p
ef30: 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72  Dup->op) + eExtr
ef40: 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  aOp) & opMask;. 
ef50: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65     }.  }..#ifnde
ef60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  f SQLITE_OMIT_BE
ef70: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
ef80: 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72  ON.  /* If a ter
ef90: 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e  m is the BETWEEN
efa0: 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74   operator, creat
efb0: 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61  e two new virtua
efc0: 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61  l terms.  ** tha
efd0: 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e  t define the ran
efe0: 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57  ge that the BETW
eff0: 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20  EEN implements. 
f000: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   For example:.  
f010: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42  **.  **      a B
f020: 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20  ETWEEN b AND c. 
f030: 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76   **.  ** is conv
f040: 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  erted into:.  **
f050: 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45  .  **      (a BE
f060: 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41  TWEEN b AND c) A
f070: 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61  ND (a>=b) AND (a
f080: 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  <=c).  **.  ** T
f090: 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73  he two new terms
f0a0: 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20   are added onto 
f0b0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
f0c0: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
f0d0: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20  t..  ** The new 
f0e0: 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d  terms are "dynam
f0f0: 69 63 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c  ic" and are chil
f100: 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67  dren of the orig
f110: 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a  inal BETWEEN.  *
f120: 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65  * term.  That me
f130: 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 20  ans that if the 
f140: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
f150: 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64  coded, the child
f160: 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69  ren are.  ** ski
f170: 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68  pped.  Or, if th
f180: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73  e children are s
f190: 61 74 69 73 66 69 65 64 20 62 79 20 61 6e 20 69  atisfied by an i
f1a0: 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e  ndex, the origin
f1b0: 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20  al.  ** BETWEEN 
f1c0: 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e  term is skipped.
f1d0: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
f1e0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42   pExpr->op==TK_B
f1f0: 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f  ETWEEN && pWC->o
f200: 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
f210: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
f220: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
f230: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
f240: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
f250: 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45  8 ops[] = {TK_GE
f260: 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73  , TK_LE};.    as
f270: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
f280: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
f290: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b  ist->nExpr==2 );
f2a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f2b0: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  2; i++){.      E
f2c0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
f2d0: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
f2e0: 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20  .      pNewExpr 
f2f0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
f300: 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a  Parse, ops[i], .
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f330: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
f340: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
f350: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
f370: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
f380: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
f390: 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  xpr, 0), 0);.   
f3a0: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
f3b0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
f3c0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
f3d0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
f3e0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
f3f0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
f400: 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
f410: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
f420: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
f430: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
f440: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
f450: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
f460: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
f470: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
f480: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
f490: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
f4a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
f4b0: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
f4c0: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
f4d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
f4e0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
f4f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f500: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
f510: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74    /* Analyze a t
f520: 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70  erm that is comp
f530: 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d  osed of two or m
f540: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
f550: 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61  nected by.  ** a
f560: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n OR operator.. 
f570: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
f580: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
f590: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f5a0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
f5b0: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
f5c0: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
f5d0: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  C, idxTerm);.   
f5e0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
f5f0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23  [idxTerm];.  }.#
f600: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
f610: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
f620: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
f630: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
f640: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
f650: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
f660: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
f670: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
f680: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
f690: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
f6a0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
f6b0: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
f6c0: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62  form "x LIKE 'ab
f6d0: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
f6e0: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
f6f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
f700: 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44      x>='abc' AND
f710: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
f720: 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a  IKE 'abc%'.  **.
f730: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
f740: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
f750: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
f760: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
f770: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
f780: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
f790: 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20  n "abd"..  */.  
f7a0: 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  if( pWC->op==TK_
f7b0: 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b  AND .   && isLik
f7c0: 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20  eOrGlob(pParse, 
f7d0: 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26  pExpr, &pStr1, &
f7e0: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
f7f0: 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  ase).  ){.    Ex
f800: 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
f810: 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f   /* LHS of LIKE/
f820: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
f830: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32  .    Expr *pStr2
f840: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
f850: 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f  of pStr1 - RHS o
f860: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
f870: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
f880: 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20   *pNewExpr1;.   
f890: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32   Expr *pNewExpr2
f8a0: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
f8b0: 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  1;.    int idxNe
f8c0: 77 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43  w2;.    Token sC
f8d0: 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20  ollSeqName;  /* 
f8e0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
f8f0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
f900: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
f910: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
f920: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
f930: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
f940: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
f950: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
f960: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
f970: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
f980: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
f990: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
f9a0: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
f9b0: 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
f9c0: 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
f9d0: 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
f9e0: 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
f9f0: 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
fa00: 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
fa10: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
fa20: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
fa30: 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
fa40: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
fa50: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
fa60: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
fa70: 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
fa80: 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
fa90: 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
faa0: 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
fab0: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
fac0: 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
fad0: 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
fae0: 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
faf0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
fb00: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
fb10: 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
fb20: 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
fb30: 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
fb40: 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
fb50: 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
fb60: 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
fb70: 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
fb80: 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
fb90: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
fba0: 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
fbb0: 6c 65 74 65 20 3d 20 30 3b 20 20 20 2f 2a 20 45  lete = 0;   /* E
fbc0: 56 3a 20 52 2d 36 34 33 33 39 2d 30 38 32 30 37  V: R-64339-08207
fbd0: 20 2a 2f 0a 0a 0a 20 20 20 20 20 20 20 20 63 20   */...        c 
fbe0: 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  = sqlite3UpperTo
fbf0: 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20  Lower[c];.      
fc00: 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20  }.      *pC = c 
fc10: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  + 1;.    }.    s
fc20: 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 7a 20 3d 20  CollSeqName.z = 
fc30: 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43 41 53 45  noCase ? "NOCASE
fc40: 22 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  " : "BINARY";.  
fc50: 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 6e    sCollSeqName.n
fc60: 20 3d 20 36 3b 0a 20 20 20 20 70 4e 65 77 45 78   = 6;.    pNewEx
fc70: 70 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pr1 = sqlite3Exp
fc80: 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
fc90: 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
fca0: 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  1 = sqlite3PExpr
fcb0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20  (pParse, TK_GE, 
fcc0: 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
fcd0: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
fce0: 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e  eToken(pParse,pN
fcf0: 65 77 45 78 70 72 31 2c 26 73 43 6f 6c 6c 53 65  ewExpr1,&sCollSe
fd00: 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  qName),.        
fd10: 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20     pStr1, 0);.  
fd20: 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72    idxNew1 = wher
fd30: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
fd40: 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45  C, pNewExpr1, TE
fd50: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
fd60: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
fd70: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d  stcase( idxNew1=
fd80: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
fd90: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
fda0: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
fdb0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
fdc0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
fdd0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
fde0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
fdf0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
fe00: 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _LT,.           
fe10: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
fe20: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
fe30: 65 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f  e,pNewExpr2,&sCo
fe40: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
fe50: 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29         pStr2, 0)
fe60: 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20  ;.    idxNew2 = 
fe70: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
fe80: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32  t(pWC, pNewExpr2
fe90: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
fea0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
feb0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
fec0: 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew2==0 );.    ex
fed0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
fee0: 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20  pWC, idxNew2);. 
fef0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
ff00: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
ff10: 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20   if( isComplete 
ff20: 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ){.      pWC->a[
ff30: 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74  idxNew1].iParent
ff40: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
ff50: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32    pWC->a[idxNew2
ff60: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
ff70: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
ff80: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
ff90: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
ffa0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
ffb0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
ffc0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
ffd0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
ffe0: 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
fff0: 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61  WO_MATCH auxilia
10000 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
10010 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
10020 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
10030 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
10040 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f  of the form:  co
10050 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e  lumn MATCH expr.
10060 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  .  ** This infor
10070 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  mation is used b
10080 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
10090 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a   methods of.  **
100a0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
100b0 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65    The native que
100c0 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65  ry optimizer doe
100d0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20  s not attempt.  
100e0 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  ** to do anythin
100f0 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e  g with MATCH fun
10100 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
10110 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  f( isMatchOfColu
10120 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  mn(pExpr) ){.   
10130 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
10140 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
10150 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65  pLeft;.    Where
10160 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
10170 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
10180 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71  eqColumn, prereq
10190 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68  Expr;..    pRigh
101a0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
101b0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
101c0 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
101d0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
101e0 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72  .pExpr;.    prer
101f0 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62  eqExpr = exprTab
10200 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
10210 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70  , pRight);.    p
10220 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78  rereqColumn = ex
10230 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
10240 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20  skSet, pLeft);. 
10250 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78     if( (prereqEx
10260 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d  pr & prereqColum
10270 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  n)==0 ){.      E
10280 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
10290 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
102a0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
102b0 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a  rse, TK_MATCH, .
102c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
102e0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
102f0 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20  db, pRight, 0), 
10300 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
10310 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
10320 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
10330 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
10340 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
10350 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10360 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
10370 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
10380 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
10390 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
103a0 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
103b0 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70  reqExpr;.      p
103c0 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
103d0 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
103e0 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
103f0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
10400 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
10410 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
10420 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
10430 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  WO_MATCH;.      
10440 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
10450 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
10460 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
10470 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
10480 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
10490 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
104a0 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
104b0 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
104c0 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
104d0 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
104e0 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
104f0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
10500 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
10510 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
10520 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
10530 54 41 54 33 0a 20 20 2f 2a 20 57 68 65 6e 20 73  TAT3.  /* When s
10540 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74  qlite_stat3 hist
10550 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
10560 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61  ailable an opera
10570 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  tor of the.  ** 
10580 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e  form "x IS NOT N
10590 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d  ULL" can sometim
105a0 65 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  es be evaluated 
105b0 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79  more efficiently
105c0 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c  .  ** as "x>NULL
105d0 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e  " if x is not an
105e0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
105f0 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72   KEY.  So constr
10600 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75  uct a.  ** virtu
10610 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20  al term of that 
10620 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form..  **.  ** 
10630 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69  Note that the vi
10640 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20  rtual term must 
10650 62 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54  be tagged with T
10660 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73  ERM_VNULL.  This
10670 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c  .  ** TERM_VNULL
10680 20 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72 65   tag will suppre
10690 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20  ss the not-null 
106a0 63 68 65 63 6b 20 61 74 20 74 68 65 20 62 65 67  check at the beg
106b0 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74  inning.  ** of t
106c0 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75  he loop.  Withou
106d0 74 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c  t the TERM_VNULL
106e0 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e   flag, the not-n
106f0 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20 2a  ull check at.  *
10700 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  * the start of t
10710 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65  he loop will pre
10720 76 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74 73  vent any results
10730 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74 75   from being retu
10740 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rned..  */.  if(
10750 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
10760 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45 78  OTNULL.   && pEx
10770 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
10780 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70  K_COLUMN.   && p
10790 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  Expr->pLeft->iCo
107a0 6c 75 6d 6e 3e 3d 30 0a 20 20 29 7b 0a 20 20 20  lumn>=0.  ){.   
107b0 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
107c0 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
107d0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
107e0 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
107f0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
10800 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70  pNewTerm;..    p
10810 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
10820 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
10830 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_GT,.          
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
10860 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a  (db, pLeft, 0),.
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10880 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10890 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
108a0 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
108b0 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78  0), 0);..    idx
108c0 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
108d0 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
108e0 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  wExpr,.         
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10900 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41       TERM_VIRTUA
10910 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54  L|TERM_DYNAMIC|T
10920 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20  ERM_VNULL);.    
10930 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20  if( idxNew ){.  
10940 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
10950 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
10960 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10970 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
10980 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
10990 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
109a0 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
109b0 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
109c0 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
109d0 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
109e0 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
109f0 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20  rator = WO_GT;. 
10a00 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
10a10 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
10a20 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
10a30 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
10a40 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
10a50 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
10a60 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
10a70 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
10a80 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10a90 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
10aa0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
10ab0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
10ac0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
10ad0 53 54 41 54 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72  STAT */..  /* Pr
10ae0 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20  event ON clause 
10af0 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20  terms of a LEFT 
10b00 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20  JOIN from being 
10b10 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20  used to drive.  
10b20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ** an index for 
10b30 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
10b40 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  ft of the join..
10b50 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72    */.  pTerm->pr
10b60 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74  ereqRight |= ext
10b70 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  raRight;.}../*.*
10b80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
10b90 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66  searches pList f
10ba0 6f 72 20 61 20 65 6e 74 72 79 20 74 68 61 74 20  or a entry that 
10bb0 6d 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c  matches the iCol
10bc0 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  -th column.** of
10bd0 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
10be0 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78  ** If such an ex
10bf0 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
10c00 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20  d, its index in 
10c10 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65  pList->a[] is re
10c20 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f  turned. If.** no
10c30 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
10c40 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ound, -1 is retu
10c50 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
10c60 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  int findIndexCol
10c70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10c80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10c90 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
10ca0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
10cb0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
10cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
10cd0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
10ce0 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
10cf0 69 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20  iBase,          
10d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
10d10 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20  ursor for table 
10d20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10d30 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
10d40 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
10d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
10d60 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75  ex to match colu
10d70 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69  mn of */.  int i
10d80 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
10d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
10da0 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f  lumn of index to
10db0 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
10dc0 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
10dd0 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
10de0 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a  ->azColl[iCol];.
10df0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
10e00 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
10e10 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
10e20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
10e30 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
10e40 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
10e50 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
10e60 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69  UMN.     && p->i
10e70 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
10e80 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20  Column[iCol].   
10e90 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d    && p->iTable==
10ea0 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20  iBase.    ){.   
10eb0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
10ec0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
10ed0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
10ee0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10ef0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  );.      if( ALW
10f00 41 59 53 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d  AYS(pColl) && 0=
10f10 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
10f20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
10f30 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
10f40 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20  return i;.      
10f50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
10f60 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
10f70 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
10f80 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65  f the DISTINCT e
10f90 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70  xpression-list p
10fa0 61 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69  assed as the thi
10fb0 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  rd argument.** i
10fc0 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a  s redundant..**.
10fd0 2a 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69  ** A DISTINCT li
10fe0 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20  st is redundant 
10ff0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
11000 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 73 75  contains some su
11010 62 73 65 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d  bset of.** colum
11020 6e 73 20 74 68 61 74 20 61 72 65 20 75 6e 69 71  ns that are uniq
11030 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e  ue and non-null.
11040 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
11050 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
11060 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
11070 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
11080 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
11090 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
110a0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
110b0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
110c0 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
110d0 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
110e0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
110f0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
11100 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
11110 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
11120 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65  sult set that ne
11130 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e  eds to be DISTIN
11140 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  CT */.){.  Table
11150 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
11160 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20  *pIdx;.  int i; 
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
11190 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  iBase;..  /* If 
111a0 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68  there is more th
111b0 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20  an one table or 
111c0 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68  sub-select in th
111d0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
111e0 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79  .  ** this query
111f0 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e  , then it will n
11200 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
11210 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  o show that the 
11220 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63  DISTINCT .  ** c
11230 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61  lause is redunda
11240 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  nt. */.  if( pTa
11250 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29  bList->nSrc!=1 )
11260 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61   return 0;.  iBa
11270 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  se = pTabList->a
11280 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70  [0].iCursor;.  p
11290 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
112a0 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
112b0 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
112c0 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e  xpressions is an
112d0 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   IPK column on t
112e0 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e  able iBase, then
112f0 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72   return .  ** tr
11300 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70  ue. Note: The (p
11310 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29  ->iTable==iBase)
11320 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65   part of this te
11330 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20  st may be false 
11340 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  if the.  ** curr
11350 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20  ent SELECT is a 
11360 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71  correlated sub-q
11370 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
11380 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63  (i=0; i<pDistinc
11390 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
113a0 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
113b0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
113c0 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
113d0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
113e0 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
113f0 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62  OLUMN && p->iTab
11400 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e  le==iBase && p->
11410 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
11420 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
11430 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
11440 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
11450 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20  table, checking 
11460 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69  each to see if i
11470 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65  t makes.  ** the
11480 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
11490 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49  ier redundant. I
114a0 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20  t does so if:.  
114b0 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65  **.  **   1. The
114c0 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66   index is itself
114d0 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a   UNIQUE, and.  *
114e0 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20  *.  **   2. All 
114f0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
11500 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
11510 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74  either part of t
11520 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a  he pDistinct.  *
11530 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20  *      list, or 
11540 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63  else the WHERE c
11550 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
11560 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
11570 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20  m "col=X",.  ** 
11580 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20       where X is 
11590 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65  a constant value
115a0 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  . The collation 
115b0 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65  sequences of the
115c0 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61  .  **      compa
115d0 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  rison and select
115e0 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  -list expression
115f0 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f  s must match tho
11600 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  se of the index.
11610 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20  .  **.  **   3. 
11620 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64  All of those ind
11630 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77  ex columns for w
11640 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63  hich the WHERE c
11650 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20  lause does not. 
11660 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   **      contain
11670 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20   a "col=X" term 
11680 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61  are subject to a
11690 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
116a0 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
116b0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
116c0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
116d0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
116e0 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
116f0 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f  or==OE_None ) co
11700 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
11710 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
11720 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
11730 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64    int iCol = pId
11740 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
11750 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e        if( 0==fin
11760 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65  dTerm(pWC, iBase
11770 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73  , iCol, ~(Bitmas
11780 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78  k)0, WO_EQ, pIdx
11790 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
117a0 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49   iIdxCol = findI
117b0 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20  ndexCol(pParse, 
117c0 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65  pDistinct, iBase
117d0 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20  , pIdx, i);.    
117e0 20 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c      if( iIdxCol<
117f0 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  0 || pTab->aCol[
11800 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
11810 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b  ]].notNull==0 ){
11820 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11830 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11840 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
11850 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( i==pIdx->nColu
11860 6d 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  mn ){.      /* T
11870 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65  his index implie
11880 73 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  s that the DISTI
11890 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73  NCT qualifier is
118a0 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20   redundant. */. 
118b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
118c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
118d0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  rn 0;.}../* .** 
118e0 54 68 65 20 28 61 6e 20 61 70 70 72 6f 78 69 6d  The (an approxim
118f0 61 74 65 29 20 73 75 6d 20 6f 66 20 74 77 6f 20  ate) sum of two 
11900 57 68 65 72 65 43 6f 73 74 73 2e 20 20 54 68 69  WhereCosts.  Thi
11910 73 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  s computation is
11920 0a 2a 2a 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65  .** not a simple
11930 20 22 2b 22 20 6f 70 65 72 61 74 6f 72 20 62 65   "+" operator be
11940 63 61 75 73 65 20 57 68 65 72 65 43 6f 73 74 20  cause WhereCost 
11950 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6c  is stored as a l
11960 6f 67 61 72 69 74 68 6d 69 63 0a 2a 2a 20 76 61  ogarithmic.** va
11970 6c 75 65 2e 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  lue..** .*/.stat
11980 69 63 20 57 68 65 72 65 43 6f 73 74 20 77 68 65  ic WhereCost whe
11990 72 65 43 6f 73 74 41 64 64 28 57 68 65 72 65 43  reCostAdd(WhereC
119a0 6f 73 74 20 61 2c 20 57 68 65 72 65 43 6f 73 74  ost a, WhereCost
119b0 20 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f   b){.  static co
119c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
119d0 72 20 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 31  r x[] = {.     1
119e0 30 2c 20 31 30 2c 20 20 20 20 20 20 20 20 20 20  0, 10,          
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11a00 2a 20 30 2c 31 20 2a 2f 0a 20 20 20 20 20 20 39  * 0,1 */.      9
11a10 2c 20 39 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 9,            
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11a30 20 32 2c 33 20 2a 2f 0a 20 20 20 20 20 20 38 2c   2,3 */.      8,
11a40 20 38 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   8,             
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11a60 34 2c 35 20 2a 2f 0a 20 20 20 20 20 20 37 2c 20  4,5 */.      7, 
11a70 37 2c 20 37 2c 20 20 20 20 20 20 20 20 20 20 20  7, 7,           
11a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36              /* 6
11a90 2c 37 2c 38 20 2a 2f 0a 20 20 20 20 20 20 36 2c  ,7,8 */.      6,
11aa0 20 36 2c 20 36 2c 20 20 20 20 20 20 20 20 20 20   6, 6,          
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ac0 39 2c 31 30 2c 31 31 20 2a 2f 0a 20 20 20 20 20  9,10,11 */.     
11ad0 20 35 2c 20 35 2c 20 35 2c 20 20 20 20 20 20 20   5, 5, 5,       
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11af0 2f 2a 20 31 32 2d 31 34 20 2a 2f 0a 20 20 20 20  /* 12-14 */.    
11b00 20 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 20 20    4, 4, 4, 4,   
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b20 20 2f 2a 20 31 35 2d 31 38 20 2a 2f 0a 20 20 20   /* 15-18 */.   
11b30 20 20 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33     3, 3, 3, 3, 3
11b40 2c 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 3,            
11b50 20 20 2f 2a 20 31 39 2d 32 34 20 2a 2f 0a 20 20    /* 19-24 */.  
11b60 20 20 20 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20      2, 2, 2, 2, 
11b70 32 2c 20 32 2c 20 32 2c 20 20 20 20 20 20 20 20  2, 2, 2,        
11b80 20 20 20 2f 2a 20 32 35 2d 33 31 20 2a 2f 0a 20     /* 25-31 */. 
11b90 20 7d 3b 0a 20 20 69 66 28 20 61 3e 3d 62 20 29   };.  if( a>=b )
11ba0 7b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b 34 39  {.    if( a>b+49
11bb0 20 29 20 72 65 74 75 72 6e 20 61 3b 0a 20 20 20   ) return a;.   
11bc0 20 69 66 28 20 61 3e 62 2b 33 31 20 29 20 72 65   if( a>b+31 ) re
11bd0 74 75 72 6e 20 61 2b 31 3b 0a 20 20 20 20 72 65  turn a+1;.    re
11be0 74 75 72 6e 20 61 2b 78 5b 61 2d 62 5d 3b 0a 20  turn a+x[a-b];. 
11bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
11c00 62 3e 61 2b 34 39 20 29 20 72 65 74 75 72 6e 20  b>a+49 ) return 
11c10 62 3b 0a 20 20 20 20 69 66 28 20 62 3e 61 2b 33  b;.    if( b>a+3
11c20 31 20 29 20 72 65 74 75 72 6e 20 62 2b 31 3b 0a  1 ) return b+1;.
11c30 20 20 20 20 72 65 74 75 72 6e 20 62 2b 78 5b 62      return b+x[b
11c40 2d 61 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  -a];.  }.}../*.*
11c50 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 69 6e 74  * Convert an int
11c60 65 67 65 72 20 69 6e 74 6f 20 61 20 57 68 65 72  eger into a Wher
11c70 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72  eCost.  In other
11c80 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20   words, compute 
11c90 61 0a 2a 2a 20 67 6f 6f 64 20 61 70 70 72 6f 78  a.** good approx
11ca0 69 6d 61 74 61 74 69 6f 6e 20 66 6f 72 20 31 30  imatation for 10
11cb0 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f 0a 73 74 61  *log2(x)..*/.sta
11cc0 74 69 63 20 57 68 65 72 65 43 6f 73 74 20 77 68  tic WhereCost wh
11cd0 65 72 65 43 6f 73 74 28 74 52 6f 77 63 6e 74 20  ereCost(tRowcnt 
11ce0 78 29 7b 0a 20 20 73 74 61 74 69 63 20 57 68 65  x){.  static Whe
11cf0 72 65 43 6f 73 74 20 61 5b 5d 20 3d 20 7b 20 30  reCost a[] = { 0
11d00 2c 20 32 2c 20 33 2c 20 35 2c 20 36 2c 20 37 2c  , 2, 3, 5, 6, 7,
11d10 20 38 2c 20 39 20 7d 3b 0a 20 20 57 68 65 72 65   8, 9 };.  Where
11d20 43 6f 73 74 20 79 20 3d 20 34 30 3b 0a 20 20 69  Cost y = 40;.  i
11d30 66 28 20 78 3c 38 20 29 7b 0a 20 20 20 20 69 66  f( x<8 ){.    if
11d40 28 20 78 3c 32 20 29 20 72 65 74 75 72 6e 20 30  ( x<2 ) return 0
11d50 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3c 38  ;.    while( x<8
11d60 20 29 7b 20 20 79 20 2d 3d 20 31 30 3b 20 78 20   ){  y -= 10; x 
11d70 3c 3c 3d 20 31 3b 20 7d 0a 20 20 7d 65 6c 73 65  <<= 1; }.  }else
11d80 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3e 32  {.    while( x>2
11d90 35 35 20 29 7b 20 79 20 2b 3d 20 34 30 3b 20 78  55 ){ y += 40; x
11da0 20 3e 3e 3d 20 34 3b 20 7d 0a 20 20 20 20 77 68   >>= 4; }.    wh
11db0 69 6c 65 28 20 78 3e 31 35 20 29 7b 20 20 79 20  ile( x>15 ){  y 
11dc0 2b 3d 20 31 30 3b 20 78 20 3e 3e 3d 20 31 3b 20  += 10; x >>= 1; 
11dd0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  }.  }.  return a
11de0 5b 78 26 37 5d 20 2b 20 79 20 2d 20 31 30 3b 0a  [x&7] + y - 10;.
11df0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11e00 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11e10 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  BLE./*.** Conver
11e20 74 20 61 20 64 6f 75 62 6c 65 20 28 61 73 20 72  t a double (as r
11e30 65 63 65 69 76 65 64 20 66 72 6f 6d 20 78 42 65  eceived from xBe
11e40 73 74 49 6e 64 65 78 20 6f 66 20 61 20 76 69 72  stIndex of a vir
11e50 74 75 61 6c 20 74 61 62 6c 65 29 0a 2a 2a 20 69  tual table).** i
11e60 6e 74 6f 20 61 20 57 68 65 72 65 43 6f 73 74 2e  nto a WhereCost.
11e70 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
11e80 2c 20 63 6f 6d 70 75 74 65 20 61 6e 20 61 70 70  , compute an app
11e90 72 6f 78 69 6d 61 74 69 6f 6e 20 66 6f 72 0a 2a  roximation for.*
11ea0 2a 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a 2a 2f  * 10*log2(x)..*/
11eb0 0a 73 74 61 74 69 63 20 57 68 65 72 65 43 6f 73  .static WhereCos
11ec0 74 20 77 68 65 72 65 43 6f 73 74 46 72 6f 6d 44  t whereCostFromD
11ed0 6f 75 62 6c 65 28 64 6f 75 62 6c 65 20 78 29 7b  ouble(double x){
11ee0 0a 20 20 75 36 34 20 61 3b 0a 20 20 57 68 65 72  .  u64 a;.  Wher
11ef0 65 43 6f 73 74 20 65 3b 0a 20 20 61 73 73 65 72  eCost e;.  asser
11f00 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
11f10 26 26 20 73 69 7a 65 6f 66 28 61 29 3d 3d 38 20  && sizeof(a)==8 
11f20 29 3b 0a 20 20 69 66 28 20 78 3c 3d 31 20 29 20  );.  if( x<=1 ) 
11f30 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
11f40 78 3c 3d 32 30 30 30 30 30 30 30 30 30 20 29 20  x<=2000000000 ) 
11f50 72 65 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74  return whereCost
11f60 28 28 74 52 6f 77 63 6e 74 29 78 29 3b 0a 20 20  ((tRowcnt)x);.  
11f70 6d 65 6d 63 70 79 28 26 61 2c 20 26 78 2c 20 38  memcpy(&a, &x, 8
11f80 29 3b 0a 20 20 65 20 3d 20 28 61 3e 3e 35 32 29  );.  e = (a>>52)
11f90 20 2d 20 31 30 32 32 3b 0a 20 20 72 65 74 75 72   - 1022;.  retur
11fa0 6e 20 65 2a 31 30 3b 0a 7d 0a 23 65 6e 64 69 66  n e*10;.}.#endif
11fb0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11fc0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
11fd0 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
11fe0 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  the logarithm of
11ff0 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65   the input value
12000 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73   to base 2..*/.s
12010 74 61 74 69 63 20 57 68 65 72 65 43 6f 73 74 20  tatic WhereCost 
12020 65 73 74 4c 6f 67 28 57 68 65 72 65 43 6f 73 74  estLog(WhereCost
12030 20 4e 29 7b 0a 20 20 57 68 65 72 65 43 6f 73 74   N){.  WhereCost
12040 20 78 20 3d 20 77 68 65 72 65 43 6f 73 74 28 4e   x = whereCost(N
12050 29 3b 0a 20 20 72 65 74 75 72 6e 20 78 3e 33 33  );.  return x>33
12060 20 3f 20 78 20 2d 20 33 33 20 3a 20 30 3b 0a 7d   ? x - 33 : 0;.}
12070 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74  ../*.** Two rout
12080 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e  ines for printin
12090 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
120a0 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
120b0 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  x_info.** struct
120c0 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74  ure.  Used for t
120d0 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
120e0 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e  ging only.  If n
120f0 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45  either.** SQLITE
12100 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f  _TEST or SQLITE_
12110 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65  DEBUG are define
12120 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f  d, then these ro
12130 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f  utines.** are no
12140 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  -ops..*/.#if !de
12150 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12160 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
12170 26 26 20 64 65 66 69 6e 65 64 28 57 48 45 52 45  && defined(WHERE
12180 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73  TRACE_ENABLED).s
12190 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
121a0 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69  _IDX_INPUTS(sqli
121b0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
121c0 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
121d0 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
121e0 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
121f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
12200 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
12210 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
12220 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e  bugPrintf("  con
12230 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c  straint[%d]: col
12240 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70  =%d termid=%d op
12250 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e  =%d usabled=%d\n
12260 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
12270 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
12280 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  nt[i].iColumn,. 
12290 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
122a0 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66  aint[i].iTermOff
122b0 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  set,.       p->a
122c0 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70  Constraint[i].op
122d0 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
122e0 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
122f0 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
12300 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79  0; i<p->nOrderBy
12310 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
12320 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12330 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63    orderby[%d]: c
12340 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22  ol=%d desc=%d\n"
12350 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
12360 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
12370 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
12380 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
12390 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74  .desc);.  }.}.st
123a0 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
123b0 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69  IDX_OUTPUTS(sqli
123c0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
123d0 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
123e0 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
123f0 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
12400 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
12410 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
12420 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
12430 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61  bugPrintf("  usa
12440 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d  ge[%d]: argvIdx=
12450 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20  %d omit=%d\n",. 
12460 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
12470 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
12480 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
12490 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
124a0 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
124b0 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  omit);.  }.  sql
124c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
124d0 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c  "  idxNum=%d\n",
124e0 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73   p->idxNum);.  s
124f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
12500 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e  f("  idxStr=%s\n
12510 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20  ", p->idxStr);. 
12520 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
12530 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f  ntf("  orderByCo
12540 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d  nsumed=%d\n", p-
12550 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
12560 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
12570 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d  gPrintf("  estim
12580 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20  atedCost=%g\n", 
12590 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  p->estimatedCost
125a0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
125b0 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  ne TRACE_IDX_INP
125c0 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54  UTS(A).#define T
125d0 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
125e0 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  (A).#endif..#ifn
125f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12600 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
12610 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
12620 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
12630 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
12640 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
12650 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
12660 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
12670 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
12680 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
12690 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
126a0 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
126b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
126c0 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
126d0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
126e0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
126f0 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
12700 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
12710 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
12720 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
12730 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
12740 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
12750 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
12760 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
12770 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
12780 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
12790 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
127a0 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
127b0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
127c0 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
127d0 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
127e0 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
127f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
12800 45 51 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  EQ)==0 ) return 
12810 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
12820 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
12830 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65  otReady)!=0 ) re
12840 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54  turn 0;.  if( pT
12850 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
12860 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n<0 ) return 0;.
12870 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54    aff = pSrc->pT
12880 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e  ab->aCol[pTerm->
12890 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66  u.leftColumn].af
128a0 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73  finity;.  if( !s
128b0 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
128c0 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78  ityOk(pTerm->pEx
128d0 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72  pr, aff) ) retur
128e0 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  n 0;.  return 1;
128f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
12900 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12910 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
12920 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
12930 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ode to construct
12940 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
12950 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74  t for an automat
12960 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  ic index.** and 
12970 74 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68  to set up the Wh
12980 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20  ereLevel object 
12990 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74  pLevel so that t
129a0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
129b0 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f  r.** makes use o
129c0 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  f the automatic 
129d0 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
129e0 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41   void constructA
129f0 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20  utomaticIndex(. 
12a00 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12a20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
12a30 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
12a40 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
12a50 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
12a60 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
12a70 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
12a80 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65  m *pSrc,  /* The
12a90 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
12aa0 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78  m to get the nex
12ab0 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74  t index */.  Bit
12ac0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
12ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
12ae0 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
12af0 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
12b00 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  le */.  WhereLev
12b10 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20  el *pLevel      
12b20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
12b30 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29   index here */.)
12b40 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b  {.  int nColumn;
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
12b70 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  umns in the cons
12b80 74 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f  tructed index */
12b90 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
12ba0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  erm;           /
12bb0 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
12bc0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
12bd0 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
12be0 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20  rm *pWCEnd;     
12bf0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
12c00 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  WC->a[] */.  int
12c10 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
12c20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
12c30 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65   of memory neede
12c40 64 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20  d for pIdx */.  
12c50 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
12c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12c70 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67  bject describing
12c80 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69   the transient i
12c90 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
12ca0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
12cb0 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65        /* Prepare
12cc0 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
12cd0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
12ce0 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74  /.  int addrInit
12cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12d00 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
12d10 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
12d20 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a   bypass jump */.
12d30 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12d50 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
12d60 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65   indexed */.  Ke
12d70 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b  yInfo *pKeyinfo;
12d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
12d90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
12da0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20   the index */   
12db0 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12dd0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64  * Top of the ind
12de0 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a  ex fill loop */.
12df0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12e10 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
12e20 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72  g an index recor
12e30 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75     /* Column cou
12e60 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  nter */.  int i;
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
12e90 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d  unter */.  int m
12ea0 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  xBitCol;        
12eb0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
12ec0 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63  m column in pSrc
12ed0 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43  ->colUsed */.  C
12ee0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
12ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
12f00 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
12f10 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   to on a column 
12f20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
12f30 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
12f40 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a   /* The Loop obj
12f50 65 63 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ect */.  Bitmask
12f60 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20   idxCols;       
12f70 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f       /* Bitmap o
12f80 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66  f columns used f
12f90 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20  or indexing */. 
12fa0 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f   Bitmask extraCo
12fb0 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ls;          /* 
12fc0 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69  Bitmap of additi
12fd0 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  onal columns */.
12fe0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
12ff0 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  ode to skip over
13000 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e   the creation an
13010 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  d initialization
13020 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61   of the.  ** tra
13030 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20  nsient index on 
13040 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
13050 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66  nt iterations of
13060 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20   the loop. */.  
13070 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
13080 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
13090 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20  0 );.  addrInit 
130a0 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
130b0 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  e(pParse);..  /*
130c0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
130d0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  r of columns tha
130e0 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  t will be added 
130f0 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  to the index.  *
13100 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61  * and used to ma
13110 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  tch WHERE clause
13120 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
13130 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20    nColumn = 0;. 
13140 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e   pTable = pSrc->
13150 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d  pTab;.  pWCEnd =
13160 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
13170 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  erm];.  pLoop = 
13180 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
13190 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
131a0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
131b0 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
131c0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
131d0 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
131e0 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
131f0 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
13200 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
13210 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
13220 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
13230 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
13240 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42  =BMS ? MASKBIT(B
13250 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28  MS-1) : MASKBIT(
13260 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  iCol);.      tes
13270 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
13280 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13290 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
132a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  );.      if( (id
132b0 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
132c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
132d0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
132e0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  (pParse->db, pLo
132f0 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 29 20 29  op, nColumn+1) )
13300 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
13310 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
13320 43 6f 6c 75 6d 6e 2b 2b 5d 20 3d 20 70 54 65 72  Column++] = pTer
13330 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
13340 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
13350 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
13360 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
13370 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
13380 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
13390 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 43 6f  op->nLTerm = nCo
133a0 6c 75 6d 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  lumn;.  pLoop->w
133b0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
133c0 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
133d0 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
133e0 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
13400 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
13410 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
13420 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
13430 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
13440 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
13450 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
13460 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
13470 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
13480 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
13490 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
134a0 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
134b0 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
134c0 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
134d0 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
134e0 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
134f0 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
13500 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
13510 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
13520 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
13530 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
13540 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
13550 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
13560 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
13570 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
13580 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
13590 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
135a0 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
135b0 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
135c0 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
135d0 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
135e0 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
135f0 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
13600 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
13610 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
13620 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e   (pTable->nCol >
13630 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31  = BMS-1) ? BMS-1
13640 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   : pTable->nCol;
13650 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
13660 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  ble->nCol==BMS-1
13670 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
13680 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
13690 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  S-2 );.  for(i=0
136a0 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
136b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
136c0 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
136d0 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a  i) ) nColumn++;.
136e0 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
136f0 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
13700 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20  T(BMS-1) ){.    
13710 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c  nColumn += pTabl
13720 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20  e->nCol - BMS + 
13730 31 3b 0a 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e  1;.  }.  pLoop->
13740 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
13750 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
13760 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20  RE_IDX_ONLY;..  
13770 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
13780 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
13790 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69   describe this i
137a0 6e 64 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20  ndex */.  nByte 
137b0 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b  = sizeof(Index);
137c0 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
137d0 75 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b  umn*sizeof(int);
137e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
137f0 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74  Column */.  nByt
13800 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a  e += nColumn*siz
13810 65 6f 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a  eof(char*);   /*
13820 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f   Index.azColl */
13830 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
13840 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  umn;            
13850 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
13860 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49  ortOrder */.  pI
13870 64 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  dx = sqlite3DbMa
13880 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
13890 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  >db, nByte);.  i
138a0 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74  f( pIdx==0 ) ret
138b0 75 72 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e  urn;.  pLoop->u.
138c0 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
138d0 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43  Idx;.  pIdx->azC
138e0 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70  oll = (char**)&p
138f0 49 64 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e  Idx[1];.  pIdx->
13900 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a  aiColumn = (int*
13910 29 26 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e  )&pIdx->azColl[n
13920 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d  Column];.  pIdx-
13930 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
13940 38 2a 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75  8*)&pIdx->aiColu
13950 6d 6e 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70  mn[nColumn];.  p
13960 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75  Idx->zName = "au
13970 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64  to-index";.  pId
13980 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f  x->nColumn = nCo
13990 6c 75 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54  lumn;.  pIdx->pT
139a0 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  able = pTable;. 
139b0 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c   n = 0;.  idxCol
139c0 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  s = 0;.  for(pTe
139d0 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
139e0 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
139f0 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43  ){.    if( termC
13a00 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
13a10 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
13a20 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
13a30 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
13a40 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
13a50 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
13a60 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d   = iCol>=BMS ? M
13a70 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20  ASKBIT(BMS-1) : 
13a80 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20  MASKBIT(iCol);. 
13a90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
13aa0 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
13ab0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
13ac0 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
13ad0 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20   if( (idxCols & 
13ae0 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  cMask)==0 ){.   
13af0 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20       Expr *pX = 
13b00 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
13b10 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
13b20 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20   cMask;.        
13b30 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
13b40 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  ] = pTerm->u.lef
13b50 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  tColumn;.       
13b60 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
13b70 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
13b80 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
13b90 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67  >pLeft, pX->pRig
13ba0 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ht);.        pId
13bb0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41  x->azColl[n] = A
13bc0 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70  LWAYS(pColl) ? p
13bd0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42  Coll->zName : "B
13be0 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20  INARY";.        
13bf0 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
13c00 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
13c10 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e   (u32)n==pLoop->
13c20 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a  u.btree.nEq );..
13c30 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f    /* Add additio
13c40 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64  nal columns need
13c50 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61  ed to make the a
13c60 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
13c70 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72  nto.  ** a cover
13c80 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66  ing index */.  f
13c90 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
13ca0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
13cb0 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41  ( extraCols & MA
13cc0 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20  SKBIT(i) ){.    
13cd0 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
13ce0 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  [n] = i;.      p
13cf0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
13d00 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
13d10 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
13d20 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
13d30 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d  sed & MASKBIT(BM
13d40 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28  S-1) ){.    for(
13d50 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c  i=BMS-1; i<pTabl
13d60 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  e->nCol; i++){. 
13d70 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
13d80 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
13d90 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
13da0 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
13db0 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
13dc0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d   }.  assert( n==
13dd0 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a  nColumn );..  /*
13de0 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f   Create the auto
13df0 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20  matic index */. 
13e00 20 70 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69   pKeyinfo = sqli
13e10 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
13e20 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
13e30 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
13e40 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20  >iIdxCur>=0 );. 
13e50 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
13e60 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
13e70 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  +;.  sqlite3Vdbe
13e80 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
13e90 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76  nAutoindex, pLev
13ea0 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f  el->iIdxCur, nCo
13eb0 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20  lumn+1, 0,.     
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13ed0 63 68 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20  char*)pKeyinfo, 
13ee0 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
13ef0 46 46 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  FF);.  VdbeComme
13f00 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c  nt((v, "for %s",
13f10 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29   pTable->zName))
13f20 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  ;..  /* Fill the
13f30 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
13f40 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f   with content */
13f50 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
13f60 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13f70 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65  , OP_Rewind, pLe
13f80 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20  vel->iTabCur);. 
13f90 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
13fa0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
13fb0 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
13fc0 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
13fd0 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20  y(pParse, pIdx, 
13fe0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
13ff0 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a   regRecord, 1);.
14000 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14010 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
14020 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
14030 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
14040 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
14050 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
14060 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
14070 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14080 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
14090 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
140a0 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  r, addrTop+1);. 
140b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
140c0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
140d0 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
140e0 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
140f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
14100 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
14110 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
14120 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
14130 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d  rd);.  .  /* Jum
14140 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70  p here when skip
14150 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
14160 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ization */.  sql
14170 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14180 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d  (v, addrInit);.}
14190 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
141a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
141b0 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64  _INDEX */..#ifnd
141c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
141d0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
141e0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  * Allocate and p
141f0 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74  opulate an sqlit
14200 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
14210 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74  ructure. It is t
14220 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
14230 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
14240 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
14250 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74  y release the st
14260 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61  ructure.** by pa
14270 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65  ssing the pointe
14280 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
14290 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73  is function to s
142a0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
142b0 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
142c0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c  _index_info *all
142d0 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a  ocateIndexInfo(.
142e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
142f0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
14300 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72  pWC,.  struct Sr
14310 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
14320 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ,.  ExprList *pO
14330 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20  rderBy.){.  int 
14340 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72  i, j;.  int nTer
14350 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  m;.  struct sqli
14360 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
14370 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
14380 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
14390 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
143a0 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
143b0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
143c0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
143d0 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
143e0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
143f0 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
14400 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
14410 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
14420 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
14430 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
14440 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
14450 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
14460 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ferring.  ** to 
14470 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  this virtual tab
14480 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54  le */.  for(i=nT
14490 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
144a0 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
144b0 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
144c0 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
144d0 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
144e0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
144f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
14500 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
14510 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
14520 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
14530 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14540 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14550 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
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 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69  _ISNULL );.    i
14590 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
145a0 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
145b0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
145c0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
145d0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
145e0 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
145f0 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a    nTerm++;.  }..
14600 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45    /* If the ORDE
14610 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74  R BY clause cont
14620 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e  ains only column
14630 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
14640 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74   .  ** virtual t
14650 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
14660 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
14670 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
14680 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  f.  ** the sqlit
14690 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
146a0 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ructure..  */.  
146b0 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
146c0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
146d0 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64      int n = pOrd
146e0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
146f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
14700 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
14710 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
14720 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
14730 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
14740 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
14750 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
14760 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
14770 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14780 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20   if( i==n){.    
14790 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a    nOrderBy = n;.
147a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
147b0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
147c0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
147d0 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20  structure.  */. 
147e0 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69   pIdxInfo = sqli
147f0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
14800 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
14810 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20  of(*pIdxInfo).  
14820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14830 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65           + (size
14840 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20  of(*pIdxCons) + 
14850 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29  sizeof(*pUsage))
14860 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  *nTerm.         
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
14890 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
148a0 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  y );.  if( pIdxI
148b0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  nfo==0 ){.    sq
148c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
148d0 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65  arse, "out of me
148e0 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75  mory");.    retu
148f0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
14900 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
14910 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73  tructure.  The s
14920 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
14930 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  o structure cont
14940 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66  ains.  ** many f
14950 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
14960 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
14970 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
14980 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20  Index from.  ** 
14990 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20  changing them.  
149a0 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  We have to do so
149b0 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67  me funky casting
149c0 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
149d0 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f  * initialize tho
149e0 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a  se fields..  */.
149f0 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
14a00 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14a10 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
14a20 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70  pIdxInfo[1];.  p
14a30 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74  IdxOrderBy = (st
14a40 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14a50 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64  ex_orderby*)&pId
14a60 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20  xCons[nTerm];.  
14a70 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74  pUsage = (struct
14a80 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
14a90 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
14aa0 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f  )&pIdxOrderBy[nO
14ab0 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74  rderBy];.  *(int
14ac0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  *)&pIdxInfo->nCo
14ad0 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d  nstraint = nTerm
14ae0 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
14af0 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
14b00 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73   nOrderBy;.  *(s
14b10 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
14b20 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
14b30 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
14b40 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f  straint = pIdxCo
14b50 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  ns;.  *(struct s
14b60 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
14b70 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f  erby**)&pIdxInfo
14b80 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64  ->aOrderBy = pId
14b90 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  xOrderBy;.  *(st
14ba0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14bb0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
14bc0 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  age**)&pIdxInfo-
14bd0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
14be0 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a         pUsage;..
14c30 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
14c40 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
14c50 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
14c60 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f  erm++){.    u8 o
14c70 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  p;.    if( pTerm
14c80 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
14c90 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
14ca0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
14cb0 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
14cc0 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
14cd0 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
14ce0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
14cf0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
14d00 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
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 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
14d40 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
14d50 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
14d60 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
14d70 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
14d80 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
14d90 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
14da0 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
14db0 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e  Column = pTerm->
14dc0 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
14dd0 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54    pIdxCons[j].iT
14de0 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  ermOffset = i;. 
14df0 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72     op = (u8)pTer
14e00 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
14e10 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f  O_ALL;.    if( o
14e20 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20  p==WO_IN ) op = 
14e30 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43  WO_EQ;.    pIdxC
14e40 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a  ons[j].op = op;.
14e50 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
14e60 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20  t assignment in 
14e70 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e  the previous lin
14e80 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e  e is possible on
14e90 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a  ly because.    *
14ea0 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51  * the WO_ and SQ
14eb0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
14ec0 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65  RAINT_ codes are
14ed0 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65   identical.  The
14ee0 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
14ef0 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79  g asserts verify
14f00 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
14f10 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51     assert( WO_EQ
14f20 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
14f30 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a  ONSTRAINT_EQ );.
14f40 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
14f50 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
14f60 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b  CONSTRAINT_LT );
14f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
14f80 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LE==SQLITE_INDEX
14f90 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29  _CONSTRAINT_LE )
14fa0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
14fb0 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GT==SQLITE_INDE
14fc0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20  X_CONSTRAINT_GT 
14fd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
14fe0 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GE==SQLITE_IND
14ff0 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45  EX_CONSTRAINT_GE
15000 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15010 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45  WO_MATCH==SQLITE
15020 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
15030 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61  T_MATCH );.    a
15040 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
15050 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e  perator & (WO_IN
15060 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_EQ|WO_LT|WO_
15070 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  LE|WO_GT|WO_GE|W
15080 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20  O_MATCH) );.    
15090 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  j++;.  }.  for(i
150a0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
150b0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
150c0 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
150d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
150e0 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
150f0 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  .iColumn = pExpr
15100 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  ->iColumn;.    p
15110 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  IdxOrderBy[i].de
15120 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  sc = pOrderBy->a
15130 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
15140 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64   }..  return pId
15150 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xInfo;.}../*.** 
15160 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  The table object
15170 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65   reference passe
15180 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
15190 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
151a0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
151b0 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69  t represent a vi
151c0 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69  rtual table. Thi
151d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b  s function invok
151e0 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  es the xBestInde
151f0 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  x().** method of
15200 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
15210 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69  le with the sqli
15220 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f  te3_index_info o
15230 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f  bject that.** co
15240 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20 33 72  mes in as the 3r
15250 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
15260 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
15270 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
15280 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73  ccurs, pParse is
15290 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
152a0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
152b0 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65   and a.** non-ze
152c0 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  ro value is retu
152d0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
152e0 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61   0 is returned a
152f0 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
15300 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c   part of the sql
15310 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15320 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66  structure is lef
15330 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a  t populated..**.
15340 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
15350 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  t an error is re
15360 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68  turned, it is th
15370 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
15380 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
15390 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
153a0 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69  free p->idxStr i
153b0 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  f p->needToFreeI
153c0 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a  dxStr indicates.
153d0 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ** that this is 
153e0 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
153f0 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74  tic int vtabBest
15400 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
15410 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
15420 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
15430 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69  info *p){.  sqli
15440 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
15450 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
15460 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  le(pParse->db, p
15470 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69  Tab)->pVtab;.  i
15480 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
15490 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  .  TRACE_IDX_INP
154a0 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70  UTS(p);.  rc = p
154b0 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
154c0 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c  BestIndex(pVtab,
154d0 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58   p);.  TRACE_IDX
154e0 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20  _OUTPUTS(p);..  
154f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15500 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
15510 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
15520 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
15530 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15540 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
15550 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d  f( !pVtab->zErrM
15560 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  sg ){.      sqli
15570 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15580 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  se, "%s", sqlite
15590 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20  3ErrStr(rc));.  
155a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
155b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
155c0 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74  Parse, "%s", pVt
155d0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
155e0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
155f0 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45  3_free(pVtab->zE
15600 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d  rrMsg);.  pVtab-
15610 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  >zErrMsg = 0;.. 
15620 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
15630 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
15640 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43  {.    if( !p->aC
15650 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
15660 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74  ble && p->aConst
15670 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
15680 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20  gvIndex>0 ){.   
15690 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
156a0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
156b0 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a        "table %s:
156c0 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75   xBestIndex retu
156d0 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20  rned an invalid 
156e0 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  plan", pTab->zNa
156f0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  me);.    }.  }..
15700 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
15710 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20  >nErr;.}.#endif 
15720 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
15730 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
15740 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66 64 65  ABLE) */...#ifde
15750 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15760 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT3./*.** Esti
15770 6d 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f  mate the locatio
15780 6e 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61  n of a particula
15790 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20  r key among all 
157a0 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  keys in an.** in
157b0 64 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20  dex.  Store the 
157c0 72 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74  results in aStat
157d0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
157e0 2a 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20  **    aStat[0]  
157f0 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
15800 6f 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61  of rows less tha
15810 6e 20 70 56 61 6c 0a 2a 2a 20 20 20 20 61 53 74  n pVal.**    aSt
15820 61 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20  at[1]      Est. 
15830 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65  number of rows e
15840 71 75 61 6c 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a  qual to pVal.**.
15850 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
15860 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
15870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
15880 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50  ereKeyStats(.  P
15890 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
158a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
158b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
158c0 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
158d0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
158e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63     /* Index to c
158f0 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f  onsider domain o
15900 66 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  f */.  sqlite3_v
15910 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20 20 20  alue *pVal,     
15920 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 63     /* Value to c
15930 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74  onsider */.  int
15940 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20   roundUp,       
15950 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e           /* Roun
15960 64 20 75 70 20 69 66 20 74 72 75 65 2e 20 20 52  d up if true.  R
15970 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66 61 6c  ound down if fal
15980 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  se */.  tRowcnt 
15990 2a 61 53 74 61 74 20 20 20 20 20 20 20 20 20 20  *aStat          
159a0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74      /* OUT: stat
159b0 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  s written here *
159c0 2f 0a 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e  /.){.  tRowcnt n
159d0 3b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20  ;.  IndexSample 
159e0 2a 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20  *aSample;.  int 
159f0 69 2c 20 65 54 79 70 65 3b 0a 20 20 69 6e 74 20  i, eType;.  int 
15a00 69 73 45 71 20 3d 20 30 3b 0a 20 20 69 36 34 20  isEq = 0;.  i64 
15a10 76 3b 0a 20 20 64 6f 75 62 6c 65 20 72 2c 20 72  v;.  double r, r
15a20 53 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 72 6f  S;..  assert( ro
15a30 75 6e 64 55 70 3d 3d 30 20 7c 7c 20 72 6f 75 6e  undUp==0 || roun
15a40 64 55 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  dUp==1 );.  asse
15a50 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  rt( pIdx->nSampl
15a60 65 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 56 61  e>0 );.  if( pVa
15a70 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
15a80 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 6e 20  LITE_ERROR;.  n 
15a90 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74  = pIdx->aiRowEst
15aa0 5b 30 5d 3b 0a 20 20 61 53 61 6d 70 6c 65 20 3d  [0];.  aSample =
15ab0 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a   pIdx->aSample;.
15ac0 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
15ad0 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61  3_value_type(pVa
15ae0 6c 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  l);..  if( eType
15af0 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
15b00 20 29 7b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69   ){.    v = sqli
15b10 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
15b20 70 56 61 6c 29 3b 0a 20 20 20 20 72 20 3d 20 28  pVal);.    r = (
15b30 69 36 34 29 76 3b 0a 20 20 20 20 66 6f 72 28 69  i64)v;.    for(i
15b40 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  =0; i<pIdx->nSam
15b50 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
15b60 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
15b70 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  eType==SQLITE_NU
15b80 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
15b90 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
15ba0 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49 54  [i].eType>=SQLIT
15bb0 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b 0a  E_TEXT ) break;.
15bc0 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
15bd0 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[i].eType==SQLI
15be0 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TE_INTEGER ){.  
15bf0 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
15c00 65 5b 69 5d 2e 75 2e 69 3e 3d 76 20 29 7b 0a 20  e[i].u.i>=v ){. 
15c10 20 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20           isEq = 
15c20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3d 3d  aSample[i].u.i==
15c30 76 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  v;.          bre
15c40 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
15c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15c60 20 20 20 61 73 73 65 72 74 28 20 61 53 61 6d 70     assert( aSamp
15c70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
15c80 49 54 45 5f 46 4c 4f 41 54 20 29 3b 0a 20 20 20  ITE_FLOAT );.   
15c90 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
15ca0 5b 69 5d 2e 75 2e 72 3e 3d 72 20 29 7b 0a 20 20  [i].u.r>=r ){.  
15cb0 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 61          isEq = a
15cc0 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3d 3d 72  Sample[i].u.r==r
15cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
15ce0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
15cf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
15d00 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  se if( eType==SQ
15d10 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
15d20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    r = sqlite3_va
15d30 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c 29  lue_double(pVal)
15d40 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
15d50 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
15d60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
15d70 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
15d80 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
15d90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
15da0 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
15db0 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58  Type>=SQLITE_TEX
15dc0 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  T ) break;.     
15dd0 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
15de0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
15df0 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 72  OAT ){.        r
15e00 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  S = aSample[i].u
15e10 2e 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  .r;.      }else{
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 69 3b 0a 20 20  ample[i].u.i;.  
15e40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
15e50 72 53 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20  rS>=r ){.       
15e60 20 69 73 45 71 20 3d 20 72 53 3d 3d 72 3b 0a 20   isEq = rS==r;. 
15e70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15e80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
15e90 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d 53  lse if( eType==S
15ea0 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
15eb0 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 66 28    i = 0;.    if(
15ec0 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 65 54 79 70   aSample[0].eTyp
15ed0 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  e==SQLITE_NULL )
15ee0 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 7d 65 6c   isEq = 1;.  }el
15ef0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
15f00 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45  eType==SQLITE_TE
15f10 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  XT || eType==SQL
15f20 49 54 45 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  ITE_BLOB );.    
15f30 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
15f40 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
15f50 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
15f60 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[i].eType==SQLI
15f70 54 45 5f 54 45 58 54 20 7c 7c 20 61 53 61 6d 70  TE_TEXT || aSamp
15f80 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
15f90 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
15fa0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15fb0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
15fc0 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
15fd0 20 29 7b 20 20 20 20 20 20 0a 20 20 20 20 20 20   ){      .      
15fe0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
15ff0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
16000 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
16010 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
16020 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  z;.      if( eTy
16030 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  pe==SQLITE_BLOB 
16040 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28  ){.        z = (
16050 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74  const u8 *)sqlit
16060 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56  e3_value_blob(pV
16070 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  al);.        pCo
16080 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
16090 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ll;.        asse
160a0 72 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d  rt( pColl->enc==
160b0 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20  SQLITE_UTF8 );. 
160c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
160d0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
160e0 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
160f0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  arse, SQLITE_UTF
16100 38 2c 20 30 2c 20 2a 70 49 64 78 2d 3e 61 7a 43  8, 0, *pIdx->azC
16110 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
16120 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ( pColl==0 ){.  
16130 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
16140 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
16150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
16160 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73   = (const u8 *)s
16170 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
16180 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  pVal, pColl->enc
16190 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
161a0 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  z ){.          r
161b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
161c0 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
161d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 20        assert( z 
161e0 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  && pColl && pCol
161f0 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20 20  l->xCmp );.     
16200 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c   }.      n = sql
16210 69 74 65 33 56 61 6c 75 65 42 79 74 65 73 28 70  ite3ValueBytes(p
16220 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  Val, pColl->enc)
16230 3b 0a 20 20 0a 20 20 20 20 20 20 66 6f 72 28 3b  ;.  .      for(;
16240 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
16250 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16260 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69  int c;.        i
16270 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20 3d  nt eSampletype =
16280 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
16290 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  e;.        if( e
162a0 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65  Sampletype<eType
162b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
162c0 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65       if( eSample
162d0 74 79 70 65 21 3d 65 54 79 70 65 20 29 20 62 72  type!=eType ) br
162e0 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eak;.#ifndef SQL
162f0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
16300 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
16310 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54  ->enc!=SQLITE_UT
16320 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F8 ){.          
16330 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20  int nSample;.   
16340 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61         char *zSa
16350 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74  mple = sqlite3Ut
16360 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20  f8to16(.        
16370 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d        db, pColl-
16380 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  >enc, aSample[i]
16390 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  .u.z, aSample[i]
163a0 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65  .nByte, &nSample
163b0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
163c0 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 53 61          if( !zSa
163d0 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  mple ){.        
163e0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
163f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
16400 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
16410 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
16420 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16430 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c         c = pColl
16440 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
16450 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53  ser, nSample, zS
16460 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20  ample, n, z);.  
16470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
16480 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c  bFree(db, zSampl
16490 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
164a0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
164b0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   {.          c =
164c0 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
164d0 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d 70  ll->pUser, aSamp
164e0 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61  le[i].nByte, aSa
164f0 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20  mple[i].u.z, n, 
16500 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z);.        }.  
16510 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30 20 29        if( c>=0 )
16520 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
16530 63 3d 3d 30 20 29 20 69 73 45 71 20 3d 20 31 3b  c==0 ) isEq = 1;
16540 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16550 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16560 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
16570 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
16580 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73  t, aSample[i] is
16590 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
165a0 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
165b0 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65  r than.  ** or e
165c0 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f  qual to pVal.  O
165d0 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  r if i==pIdx->nS
165e0 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20  ample, then all 
165f0 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73 73  samples are less
16600 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e  .  ** than pVal.
16610 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d    If aSample[i]=
16620 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73 45 71  =pVal, then isEq
16630 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ==1..  */.  if( 
16640 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73 73 65  isEq ){.    asse
16650 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  rt( i<pIdx->nSam
16660 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74 61 74  ple );.    aStat
16670 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] = aSample[i]
16680 2e 6e 4c 74 3b 0a 20 20 20 20 61 53 74 61 74 5b  .nLt;.    aStat[
16690 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  1] = aSample[i].
166a0 6e 45 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nEq;.  }else{.  
166b0 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
166c0 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a  , iUpper, iGap;.
166d0 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
166e0 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
166f0 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  ;.      iUpper =
16700 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74 3b   aSample[0].nLt;
16710 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16720 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49    iUpper = i>=pI
16730 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 20  dx->nSample ? n 
16740 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74  : aSample[i].nLt
16750 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  ;.      iLower =
16760 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 45   aSample[i-1].nE
16770 71 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  q + aSample[i-1]
16780 2e 6e 4c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  .nLt;.    }.    
16790 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d  aStat[1] = pIdx-
167a0 3e 61 76 67 45 71 3b 0a 20 20 20 20 69 66 28 20  >avgEq;.    if( 
167b0 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
167c0 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
167d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
167e0 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
167f0 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
16800 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
16810 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
16820 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
16830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
16840 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
16850 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
16860 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
16870 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
16880 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
16890 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
168a0 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a  LE_STAT3 */../*.
168b0 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e  ** If expression
168c0 20 70 45 78 70 72 20 72 65 70 72 65 73 65 6e 74   pExpr represent
168d0 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
168e0 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f  e, set *pp to po
168f0 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c  int to.** an sql
16900 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
16910 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
16920 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2c 20  the same value, 
16930 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a  with affinity.**
16940 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20   aff applied to 
16950 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74 75 72  it, before retur
16960 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68 65 20  ning. It is the 
16970 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
16980 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  f the .** caller
16990 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
169a0 65 6c 65 61 73 65 20 74 68 69 73 20 73 74 72 75  elease this stru
169b0 63 74 75 72 65 20 62 79 20 70 61 73 73 69 6e 67  cture by passing
169c0 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74   it to .** sqlit
169d0 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
169e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
169f0 65 6e 74 20 70 61 72 73 65 20 69 73 20 61 20 72  ent parse is a r
16a00 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74 65  ecompile (sqlite
16a10 33 52 65 70 72 65 70 61 72 65 28 29 29 20 61 6e  3Reprepare()) an
16a20 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e  d pExpr.** is an
16a30 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 74 68   SQL variable th
16a40 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  at currently has
16a50 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
16a60 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a  e bound to it,.*
16a70 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  * create an sqli
16a80 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
16a90 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
16aa0 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61 69 6e  his value, again
16ab0 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74   with.** affinit
16ac0 79 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f  y aff applied to
16ad0 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a   it, instead..**
16ae0 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f  .** If neither o
16af0 66 20 74 68 65 20 61 62 6f 76 65 20 61 70 70 6c  f the above appl
16b00 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55  y, set *pp to NU
16b10 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  LL..**.** If an 
16b20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
16b30 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
16b40 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
16b50 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66  QLITE_OK..*/.#if
16b60 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
16b70 45 5f 53 54 41 54 33 0a 73 74 61 74 69 63 20 69  E_STAT3.static i
16b80 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72  nt valueFromExpr
16b90 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
16ba0 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  e, .  Expr *pExp
16bb0 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20 0a 20  r, .  u8 aff, . 
16bc0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
16bd0 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70 45 78  *pp.){.  if( pEx
16be0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  pr->op==TK_VARIA
16bf0 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78 70 72  BLE.   || (pExpr
16c00 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
16c10 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d  R && pExpr->op2=
16c20 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20 20  =TK_VARIABLE).  
16c30 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20  ){.    int iVar 
16c40 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
16c50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16c60 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
16c70 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29  se->pVdbe, iVar)
16c80 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69  ;.    *pp = sqli
16c90 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28  te3VdbeGetValue(
16ca0 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
16cb0 72 65 2c 20 69 56 61 72 2c 20 61 66 66 29 3b 0a  re, iVar, aff);.
16cc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16cd0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
16ce0 72 6e 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  rn sqlite3ValueF
16cf0 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e  romExpr(pParse->
16d00 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54  db, pExpr, SQLIT
16d10 45 5f 55 54 46 38 2c 20 61 66 66 2c 20 70 70 29  E_UTF8, aff, pp)
16d20 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
16d30 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16d40 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d  is used to estim
16d50 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
16d60 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
16d70 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62   be visited.** b
16d80 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e  y scanning an in
16d90 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20  dex for a range 
16da0 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72  of values. The r
16db0 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e  ange may have an
16dc0 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c   upper.** bound,
16dd0 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20   a lower bound, 
16de0 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45  or both. The WHE
16df0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
16e00 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70  that set the upp
16e10 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20  er.** and lower 
16e20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65  bounds are repre
16e30 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72  sented by pLower
16e40 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70   and pUpper resp
16e50 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a  ectively. For.**
16e60 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
16e70 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20  ng that index p 
16e80 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a  is on t1(a):.**.
16e90 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
16ea0 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
16eb0 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20   a < ? ....**   
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ed0 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f   |_____|   |____
16ee0 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _|.**           
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
16f00 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16f20 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a  Lower    pUpper.
16f30 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
16f40 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20  of the upper or 
16f50 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e  lower bound is n
16f60 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  ot present, then
16f70 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20   NULL is passed 
16f80 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74  in.** place of t
16f90 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
16fa0 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
16fb0 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61 6d 65  * The nEq parame
16fc0 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74 68  ter is passed th
16fd0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 69  e index of the i
16fe0 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62 6a  ndex column subj
16ff0 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72 61  ect to the.** ra
17000 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  nge constraint. 
17010 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79  Or, equivalently
17020 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  , the number of 
17030 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
17040 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  ints.** optimize
17050 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65  d by the propose
17060 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f  d index scan. Fo
17070 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  r example, assum
17080 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 0a 2a  ing index p is.*
17090 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61  * on t1(a, b), a
170a0 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79  nd the SQL query
170b0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
170c0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
170d0 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41   = ? AND b > ? A
170e0 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND b < ? ....**.
170f0 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75  ** then nEq shou
17100 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68 65  ld be passed the
17110 20 76 61 6c 75 65 20 31 20 28 61 73 20 74 68 65   value 1 (as the
17120 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
17130 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c 20  d column,.** b, 
17140 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65  is the second le
17150 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
17160 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72  f the index). Or
17170 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  , if the query i
17180 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
17190 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
171a0 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
171b0 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
171c0 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
171d0 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65   0..**.** The re
171e0 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
171f0 61 6e 20 69 6e 74 65 67 65 72 20 64 69 76 69 73  an integer divis
17200 6f 72 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  or to reduce the
17210 20 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20 73 65   estimated.** se
17220 61 72 63 68 20 73 70 61 63 65 2e 20 20 41 20 72  arch space.  A r
17230 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 31  eturn value of 1
17240 20 6d 65 61 6e 73 20 74 68 61 74 20 72 61 6e 67   means that rang
17250 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
17260 65 0a 2a 2a 20 6e 6f 20 68 65 6c 70 20 61 74 20  e.** no help at 
17270 61 6c 6c 2e 20 20 41 20 72 65 74 75 72 6e 20 76  all.  A return v
17280 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20  alue of 2 means 
17290 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
172a0 73 20 61 72 65 0a 2a 2a 20 65 78 70 65 63 74 65  s are.** expecte
172b0 64 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20  d to reduce the 
172c0 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
172d0 68 61 6c 66 2e 20 20 41 6e 64 20 73 6f 20 66 6f  half.  And so fo
172e0 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  rth....**.** In 
172f0 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
17300 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c  qlite_stat3 ANAL
17310 59 5a 45 20 64 61 74 61 2c 20 65 61 63 68 20 72  YZE data, each r
17320 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 0a  ange inequality.
17330 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65 20 73  ** reduces the s
17340 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61  earch space by a
17350 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 20 48   factor of 4.  H
17360 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63 6f  ence a single co
17370 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a  nstraint (x>?).*
17380 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 72  * results in a r
17390 65 74 75 72 6e 20 6f 66 20 34 20 61 6e 64 20 61  eturn of 4 and a
173a0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
173b0 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  t (x>? AND x<?) 
173c0 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20  results.** in a 
173d0 72 65 74 75 72 6e 20 6f 66 20 31 36 2e 0a 2a 2f  return of 16..*/
173e0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
173f0 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20  eRangeScanEst(. 
17400 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
17410 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
17420 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
17430 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
17440 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
17450 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
17460 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  x containing the
17470 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20   range-compared 
17480 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20  column; "x" */. 
17490 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20   int nEq,       
174a0 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78 20 69        /* index i
174b0 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66  nto p->aCol[] of
174c0 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61   the range-compa
174d0 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  red column */.  
174e0 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
174f0 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
17500 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
17510 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
17520 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
17530 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
17540 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
17550 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
17560 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
17570 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
17580 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 52 61    WhereCost *pRa
17590 6e 67 65 44 69 76 20 2f 2a 20 4f 55 54 3a 20 52  ngeDiv /* OUT: R
175a0 65 64 75 63 65 20 73 65 61 72 63 68 20 73 70 61  educe search spa
175b0 63 65 20 62 79 20 74 68 69 73 20 64 69 76 69 73  ce by this divis
175c0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  or */.){.  int r
175d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
175e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
175f0 41 42 4c 45 5f 53 54 41 54 33 0a 0a 20 20 69 66  ABLE_STAT3..  if
17600 28 20 6e 45 71 3d 3d 30 20 26 26 20 70 2d 3e 6e  ( nEq==0 && p->n
17610 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73 71  Sample ){.    sq
17620 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 61  lite3_value *pRa
17630 6e 67 65 56 61 6c 3b 0a 20 20 20 20 74 52 6f 77  ngeVal;.    tRow
17640 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a  cnt iLower = 0;.
17650 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70      tRowcnt iUpp
17660 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74  er = p->aiRowEst
17670 5b 30 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74  [0];.    tRowcnt
17680 20 61 5b 32 5d 3b 0a 20 20 20 20 75 38 20 61 66   a[2];.    u8 af
17690 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61  f = p->pTable->a
176a0 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Col[p->aiColumn[
176b0 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20  0]].affinity;.. 
176c0 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b     if( pLower ){
176d0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
176e0 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78  pr = pLower->pEx
176f0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
17700 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
17710 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
17720 70 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65  pr, aff, &pRange
17730 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Val);.      asse
17740 72 74 28 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70  rt( (pLower->eOp
17750 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
17760 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_GE))!=0 );.  
17770 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17780 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20  TE_OK.       && 
17790 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
177a0 61 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56  arse, p, pRangeV
177b0 61 6c 2c 20 30 2c 20 61 29 3d 3d 53 51 4c 49 54  al, 0, a)==SQLIT
177c0 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20  E_OK.      ){.  
177d0 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
177e0 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
177f0 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61   (pLower->eOpera
17800 74 6f 72 20 26 20 57 4f 5f 47 54 29 21 3d 30 20  tor & WO_GT)!=0 
17810 29 20 69 4c 6f 77 65 72 20 2b 3d 20 61 5b 31 5d  ) iLower += a[1]
17820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17830 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
17840 28 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20  (pRangeVal);.   
17850 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
17860 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 55 70 70  QLITE_OK && pUpp
17870 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  er ){.      Expr
17880 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72   *pExpr = pUpper
17890 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
178a0 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75  .      rc = valu
178b0 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
178c0 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70  , pExpr, aff, &p
178d0 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 20  RangeVal);.     
178e0 20 61 73 73 65 72 74 28 20 28 70 55 70 70 65 72   assert( (pUpper
178f0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
17900 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20  O_LT|WO_LE))!=0 
17910 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
17920 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
17930 20 20 26 26 20 77 68 65 72 65 4b 65 79 53 74 61    && whereKeySta
17940 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
17950 61 6e 67 65 56 61 6c 2c 20 31 2c 20 61 29 3d 3d  angeVal, 1, a)==
17960 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
17970 29 7b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65  ){.        iUppe
17980 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  r = a[0];.      
17990 20 20 69 66 28 20 28 70 55 70 70 65 72 2d 3e 65    if( (pUpper->e
179a0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
179b0 29 21 3d 30 20 29 20 69 55 70 70 65 72 20 2b 3d  )!=0 ) iUpper +=
179c0 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   a[1];.      }. 
179d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
179e0 65 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c 29  eFree(pRangeVal)
179f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17a00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17a10 0a 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74  .      WhereCost
17a20 20 69 42 61 73 65 20 3d 20 77 68 65 72 65 43 6f   iBase = whereCo
17a30 73 74 28 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30  st(p->aiRowEst[0
17a40 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 55  ]);.      if( iU
17a50 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20  pper>iLower ){. 
17a60 20 20 20 20 20 20 20 69 42 61 73 65 20 2d 3d 20         iBase -= 
17a70 77 68 65 72 65 43 6f 73 74 28 69 55 70 70 65 72  whereCost(iUpper
17a80 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - iLower);.    
17a90 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 61 6e 67    }.      *pRang
17aa0 65 44 69 76 20 3d 20 69 42 61 73 65 3b 0a 20 20  eDiv = iBase;.  
17ab0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
17ac0 78 31 30 30 2c 20 28 22 72 61 6e 67 65 20 73 63  x100, ("range sc
17ad0 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e  an regions: %u..
17ae0 25 75 20 20 64 69 76 3d 25 64 5c 6e 22 2c 0a 20  %u  div=%d\n",. 
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b00 20 20 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f          (u32)iLo
17b10 77 65 72 2c 20 28 75 33 32 29 69 55 70 70 65 72  wer, (u32)iUpper
17b20 2c 20 2a 70 52 61 6e 67 65 44 69 76 29 29 3b 0a  , *pRangeDiv));.
17b30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17b40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
17b50 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
17b60 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73  _PARAMETER(pPars
17b70 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
17b80 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55  AMETER(p);.  UNU
17b90 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 45  SED_PARAMETER(nE
17ba0 71 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  q);.#endif.  ass
17bb0 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70  ert( pLower || p
17bc0 55 70 70 65 72 20 29 3b 0a 20 20 2a 70 52 61 6e  Upper );.  *pRan
17bd0 67 65 44 69 76 20 3d 20 30 3b 0a 20 20 2f 2a 20  geDiv = 0;.  /* 
17be0 54 55 4e 49 4e 47 3a 20 20 45 61 63 68 20 69 6e  TUNING:  Each in
17bf0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
17c00 69 6e 74 20 72 65 64 75 63 65 73 20 74 68 65 20  int reduces the 
17c10 73 65 61 72 63 68 20 73 70 61 63 65 20 34 2d 66  search space 4-f
17c20 6f 6c 64 2e 0a 20 20 2a 2a 20 41 20 42 45 54 57  old..  ** A BETW
17c30 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68  EEN operator, th
17c40 65 72 65 66 6f 72 65 2c 20 72 65 64 75 63 65 73  erefore, reduces
17c50 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
17c60 65 20 31 36 2d 66 6f 6c 64 20 2a 2f 0a 20 20 69  e 16-fold */.  i
17c70 66 28 20 70 4c 6f 77 65 72 20 26 26 20 28 70 4c  f( pLower && (pL
17c80 6f 77 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20  ower->wtFlags & 
17c90 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
17ca0 7b 0a 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76  {.    *pRangeDiv
17cb0 20 2b 3d 20 32 30 3b 20 20 61 73 73 65 72 74 28   += 20;  assert(
17cc0 20 32 30 3d 3d 77 68 65 72 65 43 6f 73 74 28 34   20==whereCost(4
17cd0 29 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) );.  }.  if( p
17ce0 55 70 70 65 72 20 29 7b 0a 20 20 20 20 2a 70 52  Upper ){.    *pR
17cf0 61 6e 67 65 44 69 76 20 2b 3d 20 32 30 3b 20 20  angeDiv += 20;  
17d00 61 73 73 65 72 74 28 20 32 30 3d 3d 77 68 65 72  assert( 20==wher
17d10 65 43 6f 73 74 28 34 29 20 29 3b 0a 20 20 7d 0a  eCost(4) );.  }.
17d20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17d30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17d40 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a  ABLE_STAT3./*.**
17d50 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
17d60 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
17d70 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
17d80 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  ed based on.** a
17d90 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  n equality const
17da0 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e  raint x=VALUE an
17db0 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c  d where that VAL
17dc0 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20  UE occurs in.** 
17dd0 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61  the histogram da
17de0 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77  ta.  This only w
17df0 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74  orks when x is t
17e00 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20  he left-most.** 
17e10 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64  column of an ind
17e20 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74  ex and sqlite_st
17e30 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61  at3 histogram da
17e40 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a  ta is available.
17e50 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65  ** for that inde
17e60 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d  x.  When pExpr==
17e70 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
17e80 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
17e90 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22  s.** "x IS NULL"
17ea0 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56   instead of "x=V
17eb0 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69  ALUE"..**.** Wri
17ec0 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
17ed0 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
17ee0 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
17ef0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
17f00 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
17f10 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
17f20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
17f30 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
17f40 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
17f50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17f60 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
17f70 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
17f80 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
17f90 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
17fa0 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
17fb0 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
17fc0 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
17fd0 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
17fe0 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
17ff0 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
18000 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
18010 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
18020 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
18030 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
18040 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
18050 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20  EqualScanEst(.  
18060 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
18070 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
18080 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
18090 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
180a0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
180b0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
180c0 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74   whose left-most
180d0 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d   column is pTerm
180e0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
180f0 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  r,         /* Ex
18100 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c  pression for VAL
18110 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55  UE in the x=VALU
18120 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
18130 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
18140 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
18150 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
18160 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
18170 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  .){.  sqlite3_va
18180 6c 75 65 20 2a 70 52 68 73 20 3d 20 30 3b 20 20  lue *pRhs = 0;  
18190 2f 2a 20 56 41 4c 55 45 20 6f 6e 20 72 69 67 68  /* VALUE on righ
181a0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 70  t-hand side of p
181b0 54 65 72 6d 20 2a 2f 0a 20 20 75 38 20 61 66 66  Term */.  u8 aff
181c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
181d0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66      /* Column af
181e0 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20  finity */.  int 
181f0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
18200 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63        /* Subfunc
18210 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
18220 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b   */.  tRowcnt a[
18230 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
18240 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f  /* Statistics */
18250 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ..  assert( p->a
18260 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61  Sample!=0 );.  a
18270 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c  ssert( p->nSampl
18280 65 3e 30 20 29 3b 0a 20 20 61 66 66 20 3d 20 70  e>0 );.  aff = p
18290 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
182a0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61  ->aiColumn[0]].a
182b0 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 70  ffinity;.  if( p
182c0 45 78 70 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  Expr ){.    rc =
182d0 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70   valueFromExpr(p
182e0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66  Parse, pExpr, af
182f0 66 2c 20 26 70 52 68 73 29 3b 0a 20 20 20 20 69  f, &pRhs);.    i
18300 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65  f( rc ) goto whe
18310 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63  reEqualScanEst_c
18320 61 6e 63 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ancel;.  }else{.
18330 20 20 20 20 70 52 68 73 20 3d 20 73 71 6c 69 74      pRhs = sqlit
18340 65 33 56 61 6c 75 65 4e 65 77 28 70 50 61 72 73  e3ValueNew(pPars
18350 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66  e->db);.  }.  if
18360 28 20 70 52 68 73 3d 3d 30 20 29 20 72 65 74 75  ( pRhs==0 ) retu
18370 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
18380 4e 44 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65  ND;.  rc = where
18390 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
183a0 20 70 2c 20 70 52 68 73 2c 20 30 2c 20 61 29 3b   p, pRhs, 0, a);
183b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
183c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 57 48 45 52  E_OK ){.    WHER
183d0 45 54 52 41 43 45 28 30 78 31 30 30 2c 28 22 65  ETRACE(0x100,("e
183e0 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67  quality scan reg
183f0 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e  ions: %d\n", (in
18400 74 29 61 5b 31 5d 29 29 3b 0a 20 20 20 20 2a 70  t)a[1]));.    *p
18410 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 7d  nRow = a[1];.  }
18420 0a 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45  .whereEqualScanE
18430 73 74 5f 63 61 6e 63 65 6c 3a 0a 20 20 73 71 6c  st_cancel:.  sql
18440 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52  ite3ValueFree(pR
18450 68 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  hs);.  return rc
18460 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  ;.}.#endif /* de
18470 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
18480 42 4c 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 23  BLE_STAT3) */..#
18490 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
184a0 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20  BLE_STAT3./*.** 
184b0 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
184c0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
184d0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
184e0 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
184f0 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77   IN constraint w
18500 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68  here the right-h
18510 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
18520 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  IN operator.** i
18530 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  s a list of valu
18540 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  es.  Example:.**
18550 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45  .**        WHERE
18560 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a   x IN (1,2,3,4).
18570 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
18580 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
18590 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
185a0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
185b0 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
185c0 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
185d0 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
185e0 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
185f0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
18600 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
18610 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
18620 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
18630 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
18640 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18650 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
18660 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
18670 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
18680 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
18690 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
186a0 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
186b0 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
186c0 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
186d0 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
186e0 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
186f0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
18700 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45  int whereInScanE
18710 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
18720 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
18730 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
18740 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
18750 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
18760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18770 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66   index whose lef
18780 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
18790 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72   pTerm */.  Expr
187a0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
187b0 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69   /* The value li
187c0 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  st on the RHS of
187d0 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33   "x IN (v1,v2,v3
187e0 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77  ,...)" */.  tRow
187f0 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20  cnt *pnRow      
18800 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
18810 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61  vised row estima
18820 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  te here */.){.  
18830 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18840 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75  OK;     /* Subfu
18850 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
18860 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
18870 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  nEst;           
18880 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
18890 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
188a0 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  erm */.  tRowcnt
188b0 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20   nRowEst = 0;   
188c0 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65   /* New estimate
188d0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
188e0 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20  f rows */.  int 
188f0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
18900 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
18910 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
18920 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
18930 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  );.  for(i=0; rc
18940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
18950 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
18960 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20  ++){.    nEst = 
18970 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  p->aiRowEst[0];.
18980 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71      rc = whereEq
18990 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
189a0 65 2c 20 70 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  e, p, pList->a[i
189b0 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b  ].pExpr, &nEst);
189c0 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20  .    nRowEst += 
189d0 6e 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nEst;.  }.  if( 
189e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
189f0 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74  .    if( nRowEst
18a00 20 3e 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30   > p->aiRowEst[0
18a10 5d 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d  ] ) nRowEst = p-
18a20 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
18a30 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45    *pnRow = nRowE
18a40 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  st;.    WHERETRA
18a50 43 45 28 30 78 31 30 30 2c 28 22 49 4e 20 72 6f  CE(0x100,("IN ro
18a60 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d  w estimate: est=
18a70 25 67 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  %g\n", nRowEst))
18a80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18a90 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64  c;.}.#endif /* d
18aa0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
18ab0 41 42 4c 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a  ABLE_STAT3) */..
18ac0 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20  /*.** Disable a 
18ad0 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
18ae0 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70  E clause.  Excep
18af0 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c  t, do not disabl
18b00 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66  e the term.** if
18b10 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c   it controls a L
18b20 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61  EFT OUTER JOIN a
18b30 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72  nd it did not or
18b40 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f  iginate in the O
18b50 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c  N.** or USING cl
18b60 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69  ause of that joi
18b70 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65  n..**.** Conside
18b80 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d  r the term t2.z=
18b90 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c  'ok' in the foll
18ba0 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a  owing queries:.*
18bb0 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45  *.**   (1)  SELE
18bc0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
18bd0 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
18be0 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e  a=t2.x WHERE t2.
18bf0 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20  z='ok'.**   (2) 
18c00 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
18c10 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
18c20 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  N t1.a=t2.x AND 
18c30 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
18c40 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3)  SELECT * FRO
18c50 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74  M t1, t2 WHERE t
18c60 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
18c70 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65  z='ok'.**.** The
18c80 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69   t2.z='ok' is di
18c90 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e  sabled in the in
18ca0 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20   (2) because it 
18cb0 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e  originates.** in
18cc0 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20   the ON clause. 
18cd0 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73   The term is dis
18ce0 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63  abled in (3) bec
18cf0 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  ause it is not p
18d00 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54  art.** of a LEFT
18d10 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e   OUTER JOIN.  In
18d20 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69   (1), the term i
18d30 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a  s not disabled..
18d40 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  **.** IMPLEMENTA
18d50 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35 39 37  TION-OF: R-24597
18d60 2d 35 38 36 35 35 20 4e 6f 20 74 65 73 74 73 20  -58655 No tests 
18d70 61 72 65 20 64 6f 6e 65 20 66 6f 72 20 74 65 72  are done for ter
18d80 6d 73 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  ms that are.** c
18d90 6f 6d 70 6c 65 74 65 6c 79 20 73 61 74 69 73 66  ompletely satisf
18da0 69 65 64 20 62 79 20 69 6e 64 69 63 65 73 2e 0a  ied by indices..
18db0 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20  **.** Disabling 
18dc0 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68  a term causes th
18dd0 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62  at term to not b
18de0 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20  e tested in the 
18df0 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
18e00 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61   the join.  Disa
18e10 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69  bling is an opti
18e20 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20  mization.  When 
18e30 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66  terms are satisf
18e40 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65  ied.** by indice
18e50 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68  s, we disable th
18e60 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  em to prevent re
18e70 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e  dundant tests in
18e80 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f   the inner.** lo
18e90 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65  op.  We would ge
18ea0 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  t the correct re
18eb0 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67  sults if nothing
18ec0 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62   were ever disab
18ed0 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e  led,.** but join
18ee0 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
18ef0 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68  ttle slower.  Th
18f00 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69  e trick is to di
18f10 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a  sable as much.**
18f20 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f   as we can witho
18f30 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f  ut disabling too
18f40 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69   much.  If we di
18f50 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77  sabled in (1), w
18f60 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77  e'd get.** the w
18f70 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65  rong answer.  Se
18f80 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a  e ticket #813..*
18f90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
18fa0 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c  sableTerm(WhereL
18fb0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68  evel *pLevel, Wh
18fc0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b  ereTerm *pTerm){
18fd0 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20  .  if( pTerm.   
18fe0 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
18ff0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
19000 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  ED)==0.      && 
19010 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f  (pLevel->iLeftJo
19020 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
19030 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
19040 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
19050 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  in)).  ){.    pT
19060 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
19070 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
19080 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  if( pTerm->iPare
19090 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  nt>=0 ){.      W
190a0 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72  hereTerm *pOther
190b0 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e   = &pTerm->pWC->
190c0 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  a[pTerm->iParent
190d0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d  ];.      if( (--
190e0 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d  pOther->nChild)=
190f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  =0 ){.        di
19100 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
19110 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20  , pOther);.     
19120 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
19130 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
19140 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
19150 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63 6f   to apply the co
19160 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
19170 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20  ring zAff.** to 
19180 74 68 65 20 6e 20 72 65 67 69 73 74 65 72 73 20  the n registers 
19190 73 74 61 72 74 69 6e 67 20 61 74 20 62 61 73 65  starting at base
191a0 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f  . .**.** As an o
191b0 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c  ptimization, SQL
191c0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
191d0 72 69 65 73 20 28 77 68 69 63 68 20 61 72 65 20  ries (which are 
191e0 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65 0a 2a  no-ops) at the.*
191f0 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  * beginning and 
19200 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72 65 20  end of zAff are 
19210 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c  ignored.  If all
19220 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41 66 66   entries in zAff
19230 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41   are.** SQLITE_A
19240 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f  FF_NONE, then no
19250 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e 65 72   code gets gener
19260 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ated..**.** This
19270 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69   routine makes i
19280 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a  ts own copy of z
19290 41 66 66 20 73 6f 20 74 68 61 74 20 74 68 65 20  Aff so that the 
192a0 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65 0a 2a  caller is free.*
192b0 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66  * to modify zAff
192c0 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   after this rout
192d0 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a  ine returns..*/.
192e0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
192f0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61  ApplyAffinity(Pa
19300 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
19310 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68   base, int n, ch
19320 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62  ar *zAff){.  Vdb
19330 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
19340 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41 66 66  Vdbe;.  if( zAff
19350 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
19360 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
19370 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
19380 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
19390 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
193a0 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20 62 61  ..  /* Adjust ba
193b0 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70  se and n to skip
193c0 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41 46 46   over SQLITE_AFF
193d0 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 61 74  _NONE entries at
193e0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
193f0 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20 74   ** and end of t
19400 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
19410 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ng..  */.  while
19420 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d  ( n>0 && zAff[0]
19430 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
19440 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  E ){.    n--;.  
19450 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41    base++;.    zA
19460 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  ff++;.  }.  whil
19470 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e  e( n>1 && zAff[n
19480 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  -1]==SQLITE_AFF_
19490 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b  NONE ){.    n--;
194a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  .  }..  /* Code 
194b0 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
194c0 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72 65 20  opcode if there 
194d0 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65 66 74  is anything left
194e0 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28   to do. */.  if(
194f0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   n>0 ){.    sqli
19500 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19510 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61   OP_Affinity, ba
19520 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  se, n);.    sqli
19530 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
19540 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b  v, -1, zAff, n);
19550 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19560 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
19570 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61 73 65  nge(pParse, base
19580 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  , n);.  }.}.../*
19590 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
195a0 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65  e for a single e
195b0 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20  quality term of 
195c0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
195d0 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a  .  An equality.*
195e0 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69  * term can be ei
195f0 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58  ther X=expr or X
19600 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65   IN (...).   pTe
19610 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74  rm is the term t
19620 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a  o be .** coded..
19630 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  **.** The curren
19640 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
19650 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65  constraint is le
19660 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ft in register i
19670 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  Reg..**.** For a
19680 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74   constraint of t
19690 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20  he form X=expr, 
196a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
196b0 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  s evaluated and 
196c0 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  its.** result is
196d0 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61   left on the sta
196e0 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61  ck.  For constra
196f0 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ints of the form
19700 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74   X IN (...).** t
19710 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
19720 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20   up a loop that 
19730 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65  will iterate ove
19740 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
19750 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  X..*/.static int
19760 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
19770 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
19780 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
19790 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
197a0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
197b0 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20  pTerm,   /* The 
197c0 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
197d0 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63  E clause to be c
197e0 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
197f0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a  evel *pLevel, /*
19800 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68   The level of th
19810 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65  e FROM clause we
19820 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
19830 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20 20 20  */.  int iEq,   
19840 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
19850 78 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74  x of the equalit
19860 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  y term within th
19870 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e  is level */.  in
19880 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  t bRev,         
19890 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 65    /* True for re
198a0 76 65 72 73 65 2d 6f 72 64 65 72 20 49 4e 20 6f  verse-order IN o
198b0 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  perations */.  i
198c0 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20 20  nt iTarget      
198d0 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f     /* Attempt to
198e0 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20 69   leave results i
198f0 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
19900 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58  */.){.  Expr *pX
19910 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
19920 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
19930 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
19940 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20 20  t iReg;         
19950 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
19960 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73  ster holding res
19970 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ults */..  asser
19980 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a  t( iTarget>0 );.
19990 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
199a0 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20  _EQ ){.    iReg 
199b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
199c0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
199d0 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72  pX->pRight, iTar
199e0 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  get);.  }else if
199f0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  ( pX->op==TK_ISN
19a00 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20  ULL ){.    iReg 
19a10 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73  = iTarget;.    s
19a20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19a30 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
19a40 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53  iReg);.#ifndef S
19a50 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
19a60 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ERY.  }else{.   
19a70 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20   int eType;.    
19a80 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74  int iTab;.    st
19a90 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
19aa0 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20  ;.    WhereLoop 
19ab0 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d  *pLoop = pLevel-
19ac0 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 69 66  >pWLoop;..    if
19ad0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
19ae0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
19af0 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20 20 20 20  LTABLE)==0.     
19b00 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   && pLoop->u.btr
19b10 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a 20 20 20  ee.pIndex!=0.   
19b20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e 62     && pLoop->u.b
19b30 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 61 53 6f  tree.pIndex->aSo
19b40 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a 20 20 20  rtOrder[iEq].   
19b50 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
19b60 73 65 28 20 69 45 71 3d 3d 30 20 29 3b 0a 20 20  se( iEq==0 );.  
19b70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52      testcase( bR
19b80 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76  ev );.      bRev
19b90 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a   = !bRev;.    }.
19ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
19bb0 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op==TK_IN );.   
19bc0 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
19bd0 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c  .    eType = sql
19be0 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
19bf0 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a  pParse, pX, 0);.
19c00 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49      if( eType==I
19c10 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
19c20 53 43 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  SC ){.      test
19c30 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20  case( bRev );.  
19c40 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76      bRev = !bRev
19c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 61 62  ;.    }.    iTab
19c60 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
19c70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19c80 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f  dOp2(v, bRev ? O
19c90 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69  P_Last : OP_Rewi
19ca0 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
19cb0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
19cc0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
19cd0 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29  E_MULTI_OR)==0 )
19ce0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ;.    pLoop->wsF
19cf0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e  lags |= WHERE_IN
19d00 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 70  _ABLE;.    if( p
19d10 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d  Level->u.in.nIn=
19d20 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
19d30 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71  el->addrNxt = sq
19d40 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19d50 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  el(v);.    }.   
19d60 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
19d70 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n++;.    pLevel-
19d80 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a  >u.in.aInLoop =.
19d90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
19da0 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50  ReallocOrFree(pP
19db0 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c  arse->db, pLevel
19dc0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a  ->u.in.aInLoop,.
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
19df0 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69  zeof(pLevel->u.i
19e00 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c  n.aInLoop[0])*pL
19e10 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b  evel->u.in.nIn);
19e20 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65  .    pIn = pLeve
19e30 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b  l->u.in.aInLoop;
19e40 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a  .    if( pIn ){.
19e50 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65        pIn += pLe
19e60 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20  vel->u.in.nIn - 
19e70 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43  1;.      pIn->iC
19e80 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  ur = iTab;.     
19e90 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
19ea0 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
19eb0 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
19ec0 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
19ed0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
19ee0 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67  owid, iTab, iReg
19ef0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
19f00 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
19f10 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
19f20 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19f30 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30  _Column, iTab, 0
19f40 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
19f50 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64  .      pIn->eEnd
19f60 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20  LoopOp = bRev ? 
19f70 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
19f80 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
19f90 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
19fa0 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a  _IsNull, iReg);.
19fb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19fc0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
19fd0 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  n = 0;.    }.#en
19fe0 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c  dif.  }.  disabl
19ff0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
1a000 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  erm);.  return i
1a010 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
1a020 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1a030 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61   will evaluate a
1a040 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  ll == and IN con
1a050 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a  straints for an.
1a060 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  ** index..**.** 
1a070 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e  For example, con
1a080 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61  sider table t1(a
1a090 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68  ,b,c,d,e,f) with
1a0a0 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29   index i1(a,b,c)
1a0b0 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  ..** Suppose the
1a0c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
1a0d0 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44   this:  a==5 AND
1a0e0 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e   b IN (1,2,3) AN
1a0f0 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a  D c>5 AND c<10.*
1a100 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20  * The index has 
1a110 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65  as many as three
1a120 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1a130 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68  aints, but in th
1a140 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74  is.** example, t
1a150 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c  he third "c" val
1a160 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c  ue is an inequal
1a170 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77  ity.  So only tw
1a180 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  o .** constraint
1a190 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68  s are coded.  Th
1a1a0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1a1b0 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
1a1c0 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d   evaluate.** a==
1a1d0 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c  5 and b IN (1,2,
1a1e0 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74  3).  The current
1a1f0 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e   values for a an
1a200 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  d b will be stor
1a210 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75  ed.** in consecu
1a220 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61  tive registers a
1a230 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  nd the index of 
1a240 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
1a250 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  er is returned..
1a260 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
1a270 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d  mple above nEq==
1a280 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62  2.  But this sub
1a290 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
1a2a0 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f  r any value.** o
1a2b0 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20  f nEq including 
1a2c0 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74  0.  If nEq==0, t
1a2d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
1a2e0 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  early a no-op..*
1a2f0 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
1a300 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f   it does is allo
1a310 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d  cate the pLevel-
1a320 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c  >iMem memory cel
1a330 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65  l and.** compute
1a340 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
1a350 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
1a360 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20   routine always 
1a370 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61  allocates at lea
1a380 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65  st one memory ce
1a390 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a  ll and returns.*
1a3a0 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * the index of t
1a3b0 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  hat memory cell.
1a3c0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
1a3d0 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
1a3e0 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68  tine will use th
1a3f0 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  at memory cell t
1a400 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d  o store the term
1a410 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76  ination.** key v
1a420 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  alue of the loop
1a430 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  If one or mor
1a440 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61  e IN operators a
1a450 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74  ppear, then.** t
1a460 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
1a470 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f  cates an additio
1a480 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63  nal nEq memory c
1a490 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61  ells for interna
1a4a0 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  l.** use..**.** 
1a4b0 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
1a4c0 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20  , *pzAff is set 
1a4d0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
1a4e0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
1a4f0 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65  a.** copy of the
1a500 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
1a510 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69   string of the i
1a520 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75  ndex allocated u
1a530 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44  sing.** sqlite3D
1a540 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70  bMalloc(). Excep
1a550 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  t, entries in th
1a560 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74  e copy of the st
1a570 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a  ring associated.
1a580 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79  ** with equality
1a590 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
1a5a0 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e  t use NONE affin
1a5b0 69 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a  ity are set to.*
1a5c0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
1a5d0 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65  E. This is to de
1a5e0 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68  al with SQL such
1a5f0 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   as the followin
1a600 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
1a610 45 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58  E TABLE t1(a TEX
1a620 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  T PRIMARY KEY, b
1a630 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e  );.**   SELECT .
1a640 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32  .. FROM t1 AS t2
1a650 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20  , t1 WHERE t1.a 
1a660 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e  = t2.b;.**.** In
1a670 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
1a680 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ve, the index on
1a690 20 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20   t1(a) has TEXT 
1a6a0 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69  affinity. But si
1a6b0 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74  nce.** the right
1a6c0 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68   hand side of th
1a6d0 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
1a6e0 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73  raint (t2.b) has
1a6f0 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a   NONE affinity,.
1a700 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  ** no conversion
1a710 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d   should be attem
1a720 70 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e  pted before usin
1a730 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61  g a t2.b value a
1a740 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b  s part of.** a k
1a750 65 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65  ey to search the
1a760 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68   index. Hence th
1a770 65 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20  e first byte in 
1a780 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66  the returned aff
1a790 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20  inity.** string 
1a7a0 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20  in this example 
1a7b0 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  would be set to 
1a7c0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
1a7d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1a7e0 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
1a7f0 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
1a800 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
1a810 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1a820 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
1a830 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
1a840 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
1a850 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
1a860 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69  re coding */.  i
1a870 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
1a880 20 20 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20       /* Reverse 
1a890 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20  the order of IN 
1a8a0 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69  operators */.  i
1a8b0 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20  nt nExtraReg,   
1a8c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a8d0 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
1a8e0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
1a8f0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20  .  char **pzAff 
1a900 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1a910 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   Set to point to
1a920 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
1a930 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71   */.){.  int nEq
1a940 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a950 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
1a960 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
1a970 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
1a980 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  code */.  Vdbe *
1a990 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1a9a0 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  e;      /* The v
1a9b0 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  m under construc
1a9c0 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
1a9d0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
1a9e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1a9f0 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20  ndex being used 
1aa00 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  for this loop */
1aa10 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
1aa20 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
1aa30 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e   /* A single con
1aa40 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a  straint term */.
1aa50 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
1aa60 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1aa70 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
1aa80 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
1aa90 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
1aaa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1aab0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1aac0 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aae0 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 2a   Base register *
1aaf0 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20  /.  int nReg;   
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
1ab20 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
1ab30 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cate */.  char *
1ab40 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  zAff;           
1ab50 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
1ab60 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65  ity string to re
1ab70 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  turn */..  /* Th
1ab80 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c  is module is onl
1ab90 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72  y called on quer
1aba0 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65  y plans that use
1abb0 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20   an index. */.  
1abc0 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
1abd0 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74  pWLoop;.  assert
1abe0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1abf0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
1ac00 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20  LTABLE)==0 );.  
1ac10 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  nEq = pLoop->u.b
1ac20 74 72 65 65 2e 6e 45 71 3b 0a 20 20 70 49 64 78  tree.nEq;.  pIdx
1ac30 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1ac40 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73 73 65  e.pIndex;.  asse
1ac50 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a  rt( pIdx!=0 );..
1ac60 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1ac70 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20  how many memory 
1ac80 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65  cells we will ne
1ac90 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  ed then allocate
1aca0 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65   them..  */.  re
1acb0 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  gBase = pParse->
1acc0 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67  nMem + 1;.  nReg
1acd0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1ace0 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65  e.nEq + nExtraRe
1acf0 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  g;.  pParse->nMe
1ad00 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41  m += nReg;..  zA
1ad10 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ff = sqlite3DbSt
1ad20 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
1ad30 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
1ad40 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78  inityStr(v, pIdx
1ad50 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20  ));.  if( !zAff 
1ad60 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ){.    pParse->d
1ad70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ad80 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  = 1;.  }..  /* E
1ad90 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61  valuate the equa
1ada0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1adb0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1adc0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e  pIdx->nColumn>=n
1add0 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  Eq );.  for(j=0;
1ade0 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20   j<nEq; j++){.  
1adf0 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70 54    int r1;.    pT
1ae00 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
1ae10 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65  erm[j];.    asse
1ae20 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
1ae30 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
1ae40 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20 69 6e  wing true for in
1ae50 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e  dices with redun
1ae60 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20  dant columns. . 
1ae70 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45     ** Ex: CREATE
1ae80 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
1ae90 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a  a,b,a); SELECT *
1aea0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
1aeb0 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20  =0 AND b=0; */. 
1aec0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54     testcase( (pT
1aed0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1aee0 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b  ERM_CODED)!=0 );
1aef0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1af00 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1af10 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
1af20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
1af30 31 36 36 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d  1662 */.    r1 =
1af40 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
1af50 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
1af60 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76   pLevel, j, bRev
1af70 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
1af80 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73    if( r1!=regBas
1af90 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28  e+j ){.      if(
1afa0 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nReg==1 ){.    
1afb0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1afc0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1afd0 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20  , regBase);.    
1afe0 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31      regBase = r1
1aff0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b010 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1b020 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73  Copy, r1, regBas
1b030 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e+j);.      }.  
1b040 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
1b050 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1b060 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
1b070 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1b080 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1b090 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
1b0a0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
1b0b0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
1b0c0 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b  LL|WO_IN))==0 ){
1b0d0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
1b0e0 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  ght = pTerm->pEx
1b0f0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
1b100 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1b110 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
1b120 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a  Right, regBase+j
1b130 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
1b140 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  k);.      if( zA
1b150 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
1b160 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
1b170 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
1b180 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54   zAff[j])==SQLIT
1b190 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
1b1a0 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
1b1b0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
1b1c0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
1b1d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1b1e0 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
1b1f0 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
1b200 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20  , zAff[j]) ){.  
1b210 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
1b220 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
1b230 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
1b240 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1b250 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a   *pzAff = zAff;.
1b260 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
1b270 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1b280 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
1b290 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1b2a0 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20  ine is a helper 
1b2b0 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  for explainIndex
1b2c0 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a  Range() below.**
1b2d0 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74  .** pStr holds t
1b2e0 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78  he text of an ex
1b2f0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65  pression that we
1b300 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70   are building up
1b310 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20   one term.** at 
1b320 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f  a time.  This ro
1b330 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77  utine adds a new
1b340 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64   term to the end
1b350 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1b360 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65  on..** Terms are
1b370 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e   separated by AN
1b380 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e  D so add the "AN
1b390 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f  D" text for seco
1b3a0 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
1b3b0 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e  t.** terms only.
1b3c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b3d0 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
1b3e0 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70  m(.  StrAccum *p
1b3f0 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Str,            
1b400 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70   /* The text exp
1b410 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75  ression being bu
1b420 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  ilt */.  int iTe
1b430 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
1b440 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1b450 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72   this term.  Fir
1b460 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20  st is zero */.  
1b470 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1b480 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  umn,        /* N
1b490 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
1b4a0 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
1b4b0 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20  r *zOp          
1b4c0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1b4d0 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  e operator */.){
1b4e0 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73  .  if( iTerm ) s
1b4f0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
1b500 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44  pend(pStr, " AND
1b510 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65   ", 5);.  sqlite
1b520 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
1b530 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d  pStr, zColumn, -
1b540 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  1);.  sqlite3Str
1b550 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
1b560 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c  , zOp, 1);.  sql
1b570 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1b580 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29  nd(pStr, "?", 1)
1b590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
1b5a0 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72  ent pLevel descr
1b5b0 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20  ibes a strategy 
1b5c0 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62  for scanning tab
1b5d0 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a  le pTab. This .*
1b5e0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
1b5f0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1b600 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
1b610 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73  containing a des
1b620 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  cription.** of t
1b630 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62  he subset of tab
1b640 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20  le rows scanned 
1b650 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20  by the strategy 
1b660 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  in the form of a
1b670 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73  n.** SQL express
1b680 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20  ion. Or, if all 
1b690 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64  rows are scanned
1b6a0 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
1b6b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
1b6c0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
1b6d0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
1b6e0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
1b6f0 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b  ERE a=1 AND b>2;
1b700 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e  .**.** is run an
1b710 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  d there is an in
1b720 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
1b730 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1b740 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73  n returns a.** s
1b750 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f  tring similar to
1b760 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41  :.**.**   "a=? A
1b770 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68  ND b>?".**.** Th
1b780 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
1b790 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d  er points to mem
1b7a0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
1b7b0 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
1b7c0 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
1b7d0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1b7e0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
1b7f0 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65  o free the buffe
1b800 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  r when it is.** 
1b810 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
1b820 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
1b830 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78  ar *explainIndex
1b840 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64  Range(sqlite3 *d
1b850 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  b, WhereLoop *pL
1b860 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  oop, Table *pTab
1b870 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
1b880 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
1b890 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
1b8a0 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
1b8b0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 69 6e  .btree.nEq;.  in
1b8c0 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e  t i, j;.  Column
1b8d0 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61   *aCol = pTab->a
1b8e0 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f  Col;.  int *aiCo
1b8f0 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
1b900 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63  iColumn;.  StrAc
1b910 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20  cum txt;..  if( 
1b920 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70  nEq==0 && (pLoop
1b930 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
1b940 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
1b950 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d  RE_TOP_LIMIT))==
1b960 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1b970 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1b980 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78  StrAccumInit(&tx
1b990 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f  t, 0, 0, SQLITE_
1b9a0 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74  MAX_LENGTH);.  t
1b9b0 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71  xt.db = db;.  sq
1b9c0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1b9d0 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20  end(&txt, " (", 
1b9e0 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  2);.  for(i=0; i
1b9f0 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nEq; i++){.    
1ba00 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
1ba10 6d 28 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b  m(&txt, i, aCol[
1ba20 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61  aiColumn[i]].zNa
1ba30 6d 65 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20  me, "=");.  }.. 
1ba40 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c   j = i;.  if( pL
1ba50 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
1ba60 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
1ba70 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a      char *z = (j
1ba80 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  ==pIndex->nColum
1ba90 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n ) ? "rowid" : 
1baa0 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  aCol[aiColumn[j]
1bab0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70  ].zName;.    exp
1bac0 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
1bad0 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22  txt, i++, z, ">"
1bae0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f  );.  }.  if( pLo
1baf0 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  op->wsFlags&WHER
1bb00 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_TOP_LIMIT ){. 
1bb10 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d     char *z = (j=
1bb20 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
1bb30 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61   ) ? "rowid" : a
1bb40 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  Col[aiColumn[j]]
1bb50 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c  .zName;.    expl
1bb60 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74  ainAppendTerm(&t
1bb70 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a  xt, i, z, "<");.
1bb80 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
1bb90 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
1bba0 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74  , ")", 1);.  ret
1bbb0 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63  urn sqlite3StrAc
1bbc0 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b  cumFinish(&txt);
1bbd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1bbe0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1bbf0 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e  op unless curren
1bc00 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61  tly processing a
1bc10 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
1bc20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  PLAN.** command.
1bc30 20 49 66 20 74 68 65 20 71 75 65 72 79 20 62 65   If the query be
1bc40 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20  ing compiled is 
1bc50 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  an EXPLAIN QUERY
1bc60 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a   PLAN, a single.
1bc70 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64 64  ** record is add
1bc80 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ed to the output
1bc90 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
1bca0 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61   table scan stra
1bcb0 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76  tegy in .** pLev
1bcc0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  el..*/.static vo
1bcd0 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61  id explainOneSca
1bce0 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
1bcf0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1bd00 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
1bd10 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
1bd20 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
1bd30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
1bd40 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f  ble list this lo
1bd50 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a  op refers to */.
1bd60 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1bd70 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
1bd80 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69    /* Scan to wri
1bd90 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70  te OP_Explain op
1bda0 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  code for */.  in
1bdb0 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
1bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bdd0 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65   Value for "leve
1bde0 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74  l" column of out
1bdf0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  put */.  int iFr
1be00 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  om,             
1be10 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1be20 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c  e for "from" col
1be30 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  umn of output */
1be40 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
1be50 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1be60 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
1be70 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
1be80 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a  reBegin() */.){.
1be90 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
1bea0 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
1beb0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1bec0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
1bed0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
1bee0 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64  ->iFrom];.    Vd
1bef0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1bf00 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56  pVdbe;      /* V
1bf10 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  M being construc
1bf20 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ted */.    sqlit
1bf30 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1bf40 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61  >db;     /* Data
1bf50 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
1bf60 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20     char *zMsg;  
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20   /* Text to add 
1bf90 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f  to EQP output */
1bfa0 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70  .    int iId = p
1bfb0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
1bfc0 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20  ;  /* Select id 
1bfd0 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75  (left-most outpu
1bfe0 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20  t column) */.   
1bff0 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20   int isSearch;  
1c000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c010 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53 45 41  * True for a SEA
1c020 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53  RCH. False for S
1c030 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72  CAN. */.    Wher
1c040 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
1c050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c060 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65   controlling Whe
1c070 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
1c080 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73 3b 20  .    u32 flags; 
1c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0a0 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 61 74     /* Flags that
1c0b0 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 6c   describe this l
1c0c0 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f  oop */..    pLoo
1c0d0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
1c0e0 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20  op;.    flags = 
1c0f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
1c100 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57      if( (flags&W
1c110 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c  HERE_MULTI_OR) |
1c120 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48  | (wctrlFlags&WH
1c130 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
1c140 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  Y) ) return;..  
1c150 20 20 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c    isSearch = (fl
1c160 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c  ags&(WHERE_BTM_L
1c170 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
1c180 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20  IMIT))!=0.      
1c190 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73        || ((flags
1c1a0 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  &WHERE_VIRTUALTA
1c1b0 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f  BLE)==0 && (pLoo
1c1c0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30  p->u.btree.nEq>0
1c1d0 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  )).            |
1c1e0 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57  | (wctrlFlags&(W
1c1f0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
1c200 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  |WHERE_ORDERBY_M
1c210 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20  AX));..    zMsg 
1c220 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1c230 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61  (db, "%s", isSea
1c240 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43  rch?"SEARCH":"SC
1c250 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49  AN");.    if( pI
1c260 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
1c270 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1c280 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1c290 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55   zMsg, "%s SUBQU
1c2a0 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49  ERY %d", zMsg,pI
1c2b0 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b  tem->iSelectId);
1c2c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c2d0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1c2e0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1c2f0 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73 22  g, "%s TABLE %s"
1c300 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a  , zMsg, pItem->z
1c310 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Name);.    }..  
1c320 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
1c330 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  ias ){.      zMs
1c340 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1c350 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1c360 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20  s AS %s", zMsg, 
1c370 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
1c380 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1c390 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 50  lags & (WHERE_IP
1c3a0 4b 7c 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  K|WHERE_VIRTUALT
1c3b0 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20 26  ABLE))==0.     &
1c3c0 26 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e  & ALWAYS(pLoop->
1c3d0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
1c3e0 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
1c3f0 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65  char *zWhere = e
1c400 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
1c410 28 64 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65  (db, pLoop, pIte
1c420 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20  m->pTab);.      
1c430 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c440 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c450 20 22 25 73 20 55 53 49 4e 47 20 25 73 25 73 49   "%s USING %s%sI
1c460 4e 44 45 58 25 73 25 73 25 73 22 2c 20 7a 4d 73  NDEX%s%s%s", zMs
1c470 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 28  g, .          ((
1c480 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  flags & WHERE_TE
1c490 4d 50 5f 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d  MP_INDEX)?"AUTOM
1c4a0 41 54 49 43 20 22 3a 22 22 29 2c 0a 20 20 20 20  ATIC ":""),.    
1c4b0 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20        ((flags & 
1c4c0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f  WHERE_IDX_ONLY)?
1c4d0 22 43 4f 56 45 52 49 4e 47 20 22 3a 22 22 29 2c  "COVERING ":""),
1c4e0 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61  .          ((fla
1c4f0 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
1c500 49 4e 44 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a  INDEX)?"":" "),.
1c510 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
1c520 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
1c530 4e 44 45 58 29 3f 22 22 3a 20 70 4c 6f 6f 70 2d  NDEX)?"": pLoop-
1c540 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
1c550 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  >zName),.       
1c560 20 20 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20     zWhere.      
1c570 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c580 44 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72  DbFree(db, zWher
1c590 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
1c5a0 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
1c5b0 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61  _IPK)!=0 && (fla
1c5c0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
1c5d0 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20  RAINT)!=0 ){.   
1c5e0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c5f0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1c600 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e  sg, "%s USING IN
1c610 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1c620 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20  Y", zMsg);..    
1c630 20 20 69 66 28 20 66 6c 61 67 73 26 28 57 48 45    if( flags&(WHE
1c640 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
1c650 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b  RE_COLUMN_IN) ){
1c660 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
1c670 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1c680 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
1c690 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid=?)", zMsg);
1c6a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1c6b0 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f   (flags&WHERE_BO
1c6c0 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45  TH_LIMIT)==WHERE
1c6d0 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20  _BOTH_LIMIT ){. 
1c6e0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
1c6f0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1c700 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
1c710 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f  id>? AND rowid<?
1c720 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
1c730 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1c740 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
1c750 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
1c760 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1c770 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1c780 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73   (rowid>?)", zMs
1c790 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
1c7a0 69 66 28 20 41 4c 57 41 59 53 28 66 6c 61 67 73  if( ALWAYS(flags
1c7b0 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  &WHERE_TOP_LIMIT
1c7c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  ) ){.        zMs
1c7d0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1c7e0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1c7f0 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d  s (rowid<?)", zM
1c800 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sg);.      }.   
1c810 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1c820 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1c830 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28  BLE.    else if(
1c840 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
1c850 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
1c860 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
1c870 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1c880 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56  (db, zMsg, "%s V
1c890 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44  IRTUAL TABLE IND
1c8a0 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c  EX %d:%s", zMsg,
1c8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c8c0 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
1c8d0 2e 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e  .idxNum, pLoop->
1c8e0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
1c8f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1c900 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1c910 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1c920 2c 20 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20  , "%s", zMsg);. 
1c930 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c940 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
1c950 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c  in, iId, iLevel,
1c960 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34   iFrom, zMsg, P4
1c970 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
1c980 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1c990 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75  explainOneScan(u
1c9a0 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  ,v,w,x,y,z).#end
1c9b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1c9c0 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f  T_EXPLAIN */.../
1c9d0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1c9e0 64 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  de for the start
1c9f0 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74   of the iLevel-t
1ca00 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48  h loop in the WH
1ca10 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d  ERE clause.** im
1ca20 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73  plementation des
1ca30 63 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f  cribed by pWInfo
1ca40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d  ..*/.static Bitm
1ca50 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  ask codeOneLoopS
1ca60 74 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66  tart(.  WhereInf
1ca70 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20  o *pWInfo,   /* 
1ca80 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61  Complete informa
1ca90 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57  tion about the W
1caa0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1cab0 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
1cac0 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c        /* Which l
1cad0 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e  evel of pWInfo->
1cae0 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  a[] should be co
1caf0 64 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ded */.  Bitmask
1cb00 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a   notReady     /*
1cb10 20 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72   Which tables ar
1cb20 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  e currently avai
1cb30 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lable */.){.  in
1cb40 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  t j, k;         
1cb50 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1cb60 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ers */.  int iCu
1cb70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
1cb80 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
1cb90 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a   for the table *
1cba0 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b  /.  int addrNxt;
1cbb0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
1cbc0 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e  e to jump to con
1cbd0 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
1cbe0 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20  ext IN case */. 
1cbf0 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20   int omitTable; 
1cc00 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1cc10 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65   we use the inde
1cc20 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  x only */.  int 
1cc30 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  bRev;           
1cc40 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e   /* True if we n
1cc50 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72  eed to scan in r
1cc60 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
1cc70 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1cc80 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68  evel;  /* The wh
1cc90 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20  ere level to be 
1cca0 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
1ccb0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
1ccc0 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
1ccd0 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f   object being co
1cce0 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ded */.  WhereCl
1ccf0 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a  ause *pWC;    /*
1cd00 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f   Decomposition o
1cd10 66 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45  f the entire WHE
1cd20 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
1cd30 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cd50 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65  * A WHERE clause
1cd60 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65   term */.  Parse
1cd70 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
1cd80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1cd90 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1cda0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
1cdd0 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f  ed stmt under co
1cde0 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20  nstructions */. 
1cdf0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1ce00 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
1ce10 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1ce20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64  term being coded
1ce30 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
1ce40 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1ce50 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
1ce60 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
1ce70 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
1ce80 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20   int addrCont;  
1ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cea0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
1ceb0 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
1cec0 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
1ced0 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30  nt iRowidReg = 0
1cee0 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
1cef0 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  d is stored in t
1cf00 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66  his register, if
1cf10 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69   not zero */.  i
1cf20 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d  nt iReleaseReg =
1cf30 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70   0;      /* Temp
1cf40 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65   register to fre
1cf50 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1cf60 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
1cf70 6e 65 77 4e 6f 74 52 65 61 64 79 3b 20 20 20 20  newNotReady;    
1cf80 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1cf90 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  e */..  pParse =
1cfa0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
1cfb0 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
1cfc0 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26 70  Vdbe;.  pWC = &p
1cfd0 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c  WInfo->sWC;.  pL
1cfe0 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
1cff0 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f  a[iLevel];.  pLo
1d000 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
1d010 6f 6f 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  oop;.  pTabItem 
1d020 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  = &pWInfo->pTabL
1d030 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
1d040 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20  From];.  iCur = 
1d050 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
1d060 72 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 57 49  r;.  bRev = (pWI
1d070 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c  nfo->revMask>>iL
1d080 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54  evel)&1;.  omitT
1d090 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77  able = (pLoop->w
1d0a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1d0b0 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20  DX_ONLY)!=0 .   
1d0c0 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
1d0d0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1d0e0 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
1d0f0 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4e 6f  LE)==0;.  VdbeNo
1d100 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  opComment((v, "B
1d110 65 67 69 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25  egin Join Loop %
1d120 64 22 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 0a 20  d", iLevel));.. 
1d130 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
1d140 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
1d150 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
1d160 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
1d170 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ** for the curre
1d180 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74  nt loop.  Jump t
1d190 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65  o addrBrk to bre
1d1a0 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
1d1b0 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63  ..  ** Jump to c
1d1c0 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
1d1d0 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
1d1e0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
1d1f0 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20  he.  ** loop..  
1d200 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65  **.  ** When the
1d210 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  re is an IN oper
1d220 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61  ator, we also ha
1d230 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c  ve a "addrNxt" l
1d240 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d  abel that.  ** m
1d250 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  eans to continue
1d260 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
1d270 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74  N value combinat
1d280 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20  ion.  When.  ** 
1d290 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20  there are no IN 
1d2a0 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  operators in the
1d2b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
1d2c0 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  e "addrNxt" labe
1d2d0 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61  l.  ** is the sa
1d2e0 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e  me as "addrBrk".
1d2f0 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20  .  */.  addrBrk 
1d300 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
1d310 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
1d320 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
1d330 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1d340 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76   addrCont = pLev
1d350 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73  el->addrCont = s
1d360 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1d370 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66  bel(v);..  /* If
1d380 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
1d390 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
1d3a0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61  FT OUTER JOIN, a
1d3b0 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a  llocate and.  **
1d3c0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
1d3d0 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
1d3e0 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
1d3f0 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
1d400 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
1d410 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74   left table of t
1d420 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
1d430 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
1d440 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
1d450 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [0].jointype & J
1d460 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
1d470 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a    pLevel->iLeftJ
1d480 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oin = ++pParse->
1d490 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1d4a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d4b0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c  P_Integer, 0, pL
1d4c0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
1d4d0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
1d4e0 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54  t((v, "init LEFT
1d4f0 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66   JOIN no-match f
1d500 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lag"));.  }..  /
1d510 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f  * Special case o
1d520 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
1d530 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65  subquery impleme
1d540 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
1d550 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54  tine */.  if( pT
1d560 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75  abItem->viaCorou
1d570 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tine ){.    int 
1d580 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49  regYield = pTabI
1d590 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
1d5a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d5b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1d5c0 67 65 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61  ger, pTabItem->a
1d5d0 64 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65  ddrFillSub-1, re
1d5e0 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65  gYield);.    pLe
1d5f0 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74  vel->p2 =  sqlit
1d600 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1d610 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65  OP_Yield, regYie
1d620 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ld);.    VdbeCom
1d630 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72  ment((v, "next r
1d640 6f 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65  ow of co-routine
1d650 20 25 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e   %s", pTabItem->
1d660 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
1d670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d680 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
1d690 65 67 59 69 65 6c 64 2b 31 2c 20 61 64 64 72 42  egYield+1, addrB
1d6a0 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  rk);.    pLevel-
1d6b0 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20  >op = OP_Goto;. 
1d6c0 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
1d6d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1d6e0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20  UALTABLE.  if(  
1d6f0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1d700 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1d710 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
1d720 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68 65 20  /* Case 1:  The 
1d730 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75  table is a virtu
1d740 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74  al-table.  Use t
1d750 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56  he VFilter and V
1d760 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  Next.    **     
1d770 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74       to access t
1d780 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  he data..    */.
1d790 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20      int iReg;   
1d7a0 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20  /* P3 Value for 
1d7b0 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20  OP_VFilter */.  
1d7c0 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75    int addrNotFou
1d7d0 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e  nd;.    int nCon
1d7e0 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d  straint = pLoop-
1d7f0 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71  >nLTerm;..    sq
1d800 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1d810 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1d820 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  iReg = sqlite3Ge
1d830 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1d840 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  e, nConstraint+2
1d850 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f  );.    addrNotFo
1d860 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  und = pLevel->ad
1d870 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a  drBrk;.    for(j
1d880 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; j<nConstrain
1d890 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  t; j++){.      i
1d8a0 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69 52 65  nt iTarget = iRe
1d8b0 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65  g+j+2;.      pTe
1d8c0 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
1d8d0 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  rm[j];.      if(
1d8e0 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74   pTerm==0 ) cont
1d8f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
1d900 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1d910 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
1d920 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79      codeEquality
1d930 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1d940 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62  rm, pLevel, j, b
1d950 52 65 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  Rev, iTarget);. 
1d960 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f         addrNotFo
1d970 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  und = pLevel->ad
1d980 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  drNxt;.      }el
1d990 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1d9a0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1d9b0 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
1d9c0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65  ->pRight, iTarge
1d9d0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1d9e0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1d9f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1da00 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e  teger, pLoop->u.
1da10 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65  vtab.idxNum, iRe
1da20 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
1da30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1da40 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72  Integer, nConstr
1da50 61 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20  aint, iReg+1);. 
1da60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1da70 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74  dOp4(v, OP_VFilt
1da80 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f  er, iCur, addrNo
1da90 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20  tFound, iReg,.  
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dab0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61      pLoop->u.vta
1dac0 62 2e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20  b.idxStr,.      
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dae0 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65  pLoop->u.vtab.ne
1daf0 65 64 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49  edFree ? P4_MPRI
1db00 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29  NTF : P4_STATIC)
1db10 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76  ;.    pLoop->u.v
1db20 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1db30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1db40 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20  <nConstraint && 
1db50 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  j<16; j++){.    
1db60 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e    if( (pLoop->u.
1db70 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a  vtab.omitMask>>j
1db80 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64  )&1 ){.        d
1db90 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1dba0 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  l, pLoop->aLTerm
1dbb0 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [j]);.      }.  
1dbc0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1dbd0 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
1dbe0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1dbf0 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1dc00 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
1dc10 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1dc20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1dc30 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1dc40 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e  arse, iReg, nCon
1dc50 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
1dc60 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1dc70 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
1dc80 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
1dc90 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1dca0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
1dcb0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1dcc0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
1dcd0 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f  )!=0.   && (pLoo
1dce0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
1dcf0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
1dd00 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21  ERE_COLUMN_EQ))!
1dd10 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43  =0.  ){.    /* C
1dd20 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64  ase 2:  We can d
1dd30 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63  irectly referenc
1dd40 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75  e a single row u
1dd50 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20  sing an.    **  
1dd60 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79          equality
1dd70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
1dd80 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
1dd90 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20  eld.  Or.    ** 
1dda0 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
1ddb0 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
1ddc0 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
1ddd0 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
1dde0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   **          con
1ddf0 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  struct..    */. 
1de00 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
1de10 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31  ->u.btree.nEq==1
1de20 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65   );.    iRelease
1de30 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1de40 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1de50 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
1de60 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
1de70 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1de80 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1de90 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21  t( pTerm->pExpr!
1dea0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1deb0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
1dec0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1ded0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1dee0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1def0 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
1df00 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f  11662 */.    iRo
1df10 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75  widReg = codeEqu
1df20 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
1df30 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
1df40 20 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61   0, bRev, iRelea
1df50 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72  seReg);.    addr
1df60 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
1df70 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  drNxt;.    sqlit
1df80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1df90 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52  OP_MustBeInt, iR
1dfa0 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74  owidReg, addrNxt
1dfb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1dfc0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
1dfd0 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20  otExists, iCur, 
1dfe0 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52  addrNxt, iRowidR
1dff0 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg);.    sqlite3
1e000 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1e010 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1e020 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20  iRowidReg, 1);. 
1e030 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e040 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
1e050 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
1e060 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43  dReg);.    VdbeC
1e070 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
1e080 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1e090 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d  p = OP_Noop;.  }
1e0a0 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d  else if( (pLoop-
1e0b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1e0c0 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20  _IPK)!=0.       
1e0d0 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
1e0e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
1e0f0 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20  UMN_RANGE)!=0.  
1e100 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33  ){.    /* Case 3
1e110 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e  :  We have an in
1e120 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
1e130 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
1e140 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20  ROWID field..   
1e150 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74   */.    int test
1e160 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
1e170 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
1e180 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65   int memEndValue
1e190 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54   = 0;.    WhereT
1e1a0 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45  erm *pStart, *pE
1e1b0 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  nd;..    assert(
1e1c0 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
1e1d0 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
1e1e0 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20  pStart = pEnd = 
1e1f0 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  0;.    if( pLoop
1e200 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1e210 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53  E_BTM_LIMIT ) pS
1e220 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  tart = pLoop->aL
1e230 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69  Term[j++];.    i
1e240 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1e250 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
1e260 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f  MIT ) pEnd = pLo
1e270 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1e280 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1e290 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d  art!=0 || pEnd!=
1e2a0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65  0 );.    if( bRe
1e2b0 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  v ){.      pTerm
1e2c0 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
1e2d0 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
1e2e0 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65        pEnd = pTe
1e2f0 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rm;.    }.    if
1e300 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
1e310 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1e320 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
1e330 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64  xpression that d
1e340 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74  efines the start
1e350 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
1e360 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20  int r1, rTemp;  
1e370 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1e380 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74  rs for holding t
1e390 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72  he start boundar
1e3a0 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  y */..      /* T
1e3b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
1e3c0 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78  stant maps TK_xx
1e3d0 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72   codes into corr
1e3e0 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20  esponding .     
1e3f0 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73   ** seek opcodes
1e400 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e  .  It depends on
1e410 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72   a particular or
1e420 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a  dering of TK_xx.
1e430 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1e440 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b  onst u8 aMoveOp[
1e450 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
1e460 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50   /* TK_GT */  OP
1e470 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20  _SeekGt,.       
1e480 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20      /* TK_LE */ 
1e490 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20   OP_SeekLe,.    
1e4a0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20         /* TK_LT 
1e4b0 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20  */  OP_SeekLt,. 
1e4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1e4d0 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65  GE */  OP_SeekGe
1e4e0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
1e4f0 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54  assert( TK_LE==T
1e500 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f  K_GT+1 );      /
1e510 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1e520 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20  ordering.. */.  
1e530 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1e540 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20  T==TK_GT+2 );   
1e550 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68     /*  ... of th
1e560 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e  e TK_xx values..
1e570 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1e580 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b  t( TK_GE==TK_GT+
1e590 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e  3 );      /*  ..
1e5a0 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a  . is correcct. *
1e5b0 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
1e5c0 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61  e( pStart->wtFla
1e5d0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1e5e0 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
1e5f0 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
1e600 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e     pX = pStart->
1e610 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1e620 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1e630 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
1e640 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rt->leftCursor==
1e650 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 72 31  iCur );.      r1
1e660 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e670 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e680 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d  X->pRight, &rTem
1e690 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
1e6a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
1e6b0 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b  MoveOp[pX->op-TK
1e6c0 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  _GT], iCur, addr
1e6d0 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
1e6e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1e6f0 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71  "pk"));.      sq
1e700 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1e710 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1e720 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  rse, r1, 1);.   
1e730 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1e740 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1e750 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64   rTemp);.      d
1e760 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1e770 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
1e780 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1e790 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e7a0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
1e7b0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
1e7c0 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
1e7d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64    }.    if( pEnd
1e7e0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1e7f0 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  pX;.      pX = p
1e800 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  End->pExpr;.    
1e810 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1e820 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e830 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f   pEnd->leftCurso
1e840 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
1e850 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d   testcase( pEnd-
1e860 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1e870 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
1e880 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
1e890 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56  */.      memEndV
1e8a0 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  alue = ++pParse-
1e8b0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
1e8c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1e8d0 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
1e8e0 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20   memEndValue);. 
1e8f0 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d       if( pX->op=
1e900 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LT || pX->op
1e910 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20  ==TK_GT ){.     
1e920 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1e930 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65   ? OP_Le : OP_Ge
1e940 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e950 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
1e960 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
1e970 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  P_Gt;.      }.  
1e980 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1e990 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20  pLevel, pEnd);. 
1e9a0 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d     }.    start =
1e9b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1e9c0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1e9d0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
1e9e0 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
1e9f0 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  _Next;.    pLeve
1ea00 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
1ea10 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
1ea20 74 61 72 74 3b 0a 20 20 20 20 61 73 73 65 72 74  tart;.    assert
1ea30 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
1ea40 29 3b 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f  );.    if( testO
1ea50 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
1ea60 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1ea70 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
1ea80 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1ea90 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1eaa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1eab0 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43  (v, OP_Rowid, iC
1eac0 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  ur, iRowidReg);.
1ead0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1eae0 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
1eaf0 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
1eb00 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1eb10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1eb20 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d  3(v, testOp, mem
1eb30 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72  EndValue, addrBr
1eb40 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  k, iRowidReg);. 
1eb50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1eb60 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
1eb70 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
1eb80 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1eb90 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  LL);.    }.  }el
1eba0 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  se if( pLoop->ws
1ebb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1ebc0 44 45 58 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20  DEXED ){.    /* 
1ebd0 43 61 73 65 20 34 3a 20 41 20 73 63 61 6e 20 75  Case 4: A scan u
1ebe0 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20  sing an index.. 
1ebf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1ec00 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63       The WHERE c
1ec10 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69  lause may contai
1ec20 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65  n zero or more e
1ec30 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20  quality .    ** 
1ec40 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22          terms ("
1ec50 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72  ==" or "IN" oper
1ec60 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65  ators) that refe
1ec70 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a  r to the N.    *
1ec80 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d  *         left-m
1ec90 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ost columns of t
1eca0 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79  he index. It may
1ecb0 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20   also contain.  
1ecc0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65    **         ine
1ecd0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1ece0 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72  nts (>, <, >= or
1ecf0 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65   <=) on the inde
1ed00 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  xed.    **      
1ed10 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69     column that i
1ed20 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
1ed30 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74  ws the N equalit
1ed40 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a  ies. Only .    *
1ed50 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69  *         the ri
1ed60 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  ght-most column 
1ed70 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61  can be an inequa
1ed80 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20  lity - the rest 
1ed90 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  must.    **     
1eda0 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22      use the "=="
1edb0 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74   and "IN" operat
1edc0 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ors. For example
1edd0 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  , if the .    **
1ede0 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69           index i
1edf0 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68  s on (x,y,z), th
1ee00 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
1ee10 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c   clauses are all
1ee20 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1ee30 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20   optimized:.    
1ee40 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1ee50 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20       x=5.    ** 
1ee60 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1ee70 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20  ND y=10.    **  
1ee80 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1ee90 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y<10.    **   
1eea0 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1eeb0 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   y>5 AND y<10.  
1eec0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1eed0 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20  x=5 AND y=5 AND 
1eee0 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20  z<=10.    **.   
1eef0 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
1ef00 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65  z<10 term of the
1ef10 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f   following canno
1ef20 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a  t be used, only.
1ef30 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1ef40 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20  he x=5 term:.   
1ef50 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1ef60 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c        x=5 AND z<
1ef70 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
1ef80 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62           N may b
1ef90 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  e zero if there 
1efa0 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
1efb0 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
1efc0 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68  **         If th
1efd0 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75  ere are no inequ
1efe0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1eff0 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a  s, then N is at.
1f000 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
1f010 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a  east one..    **
1f020 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f030 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  This case is als
1f040 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72  o used when ther
1f050 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
1f060 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20  lause.    **    
1f070 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73       constraints
1f080 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73   but an index is
1f090 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79   selected anyway
1f0a0 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a  , in order.    *
1f0b0 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72  *         to for
1f0c0 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  ce the output or
1f0d0 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74  der to conform t
1f0e0 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  o an ORDER BY.. 
1f0f0 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61 74     */  .    stat
1f100 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61  ic const u8 aSta
1f110 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  rtOp[] = {.     
1f120 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20   0,.      0,.   
1f130 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20     OP_Rewind,   
1f140 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21          /* 2: (!
1f150 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1f160 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
1f170 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1f180 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20   OP_Last,       
1f190 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74        /* 3: (!st
1f1a0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1f1b0 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20  && startEq &&   
1f1c0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1f1d0 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20 20  P_SeekGt,       
1f1e0 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74      /* 4: (start
1f1f0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1f200 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52   !startEq && !bR
1f210 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1f220 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20 20  SeekLt,         
1f230 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63    /* 5: (start_c
1f240 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21  onstraints  && !
1f250 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76  startEq &&  bRev
1f260 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1f270 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20 20  ekGe,           
1f280 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 6: (start_con
1f290 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
1f2a0 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
1f2b0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1f2c0 4c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Le            /*
1f2d0 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   7: (start_const
1f2e0 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72  raints  &&  star
1f2f0 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
1f300 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74  .    };.    stat
1f310 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 64  ic const u8 aEnd
1f320 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f  Op[] = {.      O
1f330 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 20  P_Noop,         
1f340 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f      /* 0: (!end_
1f350 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a  constraints) */.
1f360 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20        OP_IdxGE, 
1f370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a             /* 1:
1f380 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
1f390 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  s && !bRev) */. 
1f3a0 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20       OP_IdxLT   
1f3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
1f3c0 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
1f3d0 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20   && bRev) */.   
1f3e0 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71 20   };.    int nEq 
1f3f0 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
1f400 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  .nEq;  /* Number
1f410 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72   of == or IN ter
1f420 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ms */.    int is
1f430 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20  MinQuery = 0;   
1f440 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1f450 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
1f460 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  zed SELECT min(x
1f470 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ).. */.    int r
1f480 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
1f490 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
1f4a0 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
1f4b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75   constraint valu
1f4c0 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31  es */.    int r1
1f4d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f4e0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72         /* Temp r
1f4f0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 57  egister */.    W
1f500 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
1f510 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49  Start = 0;  /* I
1f520 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1f530 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74  aint at range st
1f540 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  art */.    Where
1f550 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20  Term *pRangeEnd 
1f560 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75  = 0;    /* Inequ
1f570 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1f580 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f   at range end */
1f590 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71  .    int startEq
1f5a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f5b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
1f5c0 67 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d  ge start uses ==
1f5d0 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
1f5e0 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20    int endEq;    
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f600 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
1f610 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  end uses ==, >= 
1f620 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
1f630 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1f640 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ts;       /* Sta
1f650 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63  rt of range is c
1f660 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20  onstrained */.  
1f670 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
1f680 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
1f690 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
1f6a0 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a  traint terms */.
1f6b0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6d0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
1f6e0 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a   will be using *
1f6f0 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  /.    int iIdxCu
1f700 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
1f710 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
1f720 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  ursor for the in
1f730 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  dex */.    int n
1f740 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20  ExtraReg = 0;   
1f750 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f760 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
1f770 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  ters needed */. 
1f780 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20     int op;      
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7a0 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f  /* Instruction o
1f7b0 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61  pcode */.    cha
1f7c0 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20  r *zStartAff;   
1f7d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
1f7e0 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74 20  inity for start 
1f7f0 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
1f800 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  int */.    char 
1f810 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20 20 20 20  *zEndAff;       
1f820 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
1f830 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72  ity for end of r
1f840 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
1f850 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70  */..    pIdx = p
1f860 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1f870 6e 64 65 78 3b 0a 20 20 20 20 69 49 64 78 43 75  ndex;.    iIdxCu
1f880 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
1f890 43 75 72 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  Cur;..    /* If 
1f8a0 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66  this loop satisf
1f8b0 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72  ies a sort order
1f8c0 20 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75   (pOrderBy) requ
1f8d0 65 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a  est that .    **
1f8e0 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
1f8f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
1f900 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c  implement a "SEL
1f910 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20  ECT min(x) ..." 
1f920 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74  .    ** query, t
1f930 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hen the caller w
1f940 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74  ill only allow t
1f950 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66  he loop to run f
1f960 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  or.    ** a sing
1f970 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68  le iteration. Th
1f980 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1f990 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75  e first row retu
1f9a0 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75  rned.    ** shou
1f9b0 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55  ld not have a NU
1f9c0 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  LL value stored 
1f9d0 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d  in 'x'. If colum
1f9e0 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20  n 'x' is.    ** 
1f9f0 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66  the first one af
1fa00 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61  ter the nEq equa
1fa10 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1fa20 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20   in the index,. 
1fa30 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69     ** this requi
1fa40 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c  res some special
1fa50 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a   handling..    *
1fa60 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  /.    if( (pWInf
1fa70 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48  o->wctrlFlags&WH
1fa80 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
1fa90 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49  !=0.     && (pWI
1faa0 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 29 0a  nfo->bOBSat!=0).
1fab0 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e       && (pIdx->n
1fac0 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20  Column>nEq).    
1fad0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  ){.      /* asse
1fae0 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rt( pOrderBy->nE
1faf0 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20  xpr==1 ); */.   
1fb00 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f     /* assert( pO
1fb10 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78  rderBy->a[0].pEx
1fb20 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64  pr->iColumn==pId
1fb30 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  x->aiColumn[nEq]
1fb40 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d   ); */.      isM
1fb50 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20  inQuery = 1;.   
1fb60 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
1fb70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1fb80 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c  Find any inequal
1fb90 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ity constraint t
1fba0 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61  erms for the sta
1fbb0 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20  rt and end .    
1fbc0 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  ** of the range.
1fbd0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20 3d   .    */.    j =
1fbe0 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 4c   nEq;.    if( pL
1fbf0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1fc00 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
1fc10 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74  {.      pRangeSt
1fc20 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  art = pLoop->aLT
1fc30 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20  erm[j++];.      
1fc40 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
1fc50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f     }.    if( pLo
1fc60 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1fc70 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
1fc80 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64  .      pRangeEnd
1fc90 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1fca0 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78  [j++];.      nEx
1fcb0 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
1fcc0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  }..    /* Genera
1fcd0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
1fce0 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ate all constrai
1fcf0 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d  nt terms using =
1fd00 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61  = or IN.    ** a
1fd10 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  nd store the val
1fd20 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
1fd30 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ms in an array o
1fd40 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
1fd50 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  ** starting at r
1fd60 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  egBase..    */. 
1fd70 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64     regBase = cod
1fd80 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
1fd90 73 28 70 50 61 72 73 65 2c 70 4c 65 76 65 6c 2c  s(pParse,pLevel,
1fda0 62 52 65 76 2c 6e 45 78 74 72 61 52 65 67 2c 26  bRev,nExtraReg,&
1fdb0 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
1fdc0 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c 69 74 65  zEndAff = sqlite
1fdd0 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65  3DbStrDup(pParse
1fde0 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29  ->db, zStartAff)
1fdf0 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
1fe00 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
1fe10 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  ..    /* If we a
1fe20 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72  re doing a rever
1fe30 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  se order scan on
1fe40 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
1fe50 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  dex, or.    ** a
1fe60 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73   forward order s
1fe70 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  can on a descend
1fe80 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72  ing index, inter
1fe90 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20  change the .    
1fea0 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  ** start and end
1feb0 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74   terms (pRangeSt
1fec0 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e  art and pRangeEn
1fed0 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
1fee0 66 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43  f( (nEq<pIdx->nC
1fef0 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28  olumn && bRev==(
1ff00 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
1ff10 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
1ff20 5f 41 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28  _ASC)).     || (
1ff30 62 52 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 43  bRev && pIdx->nC
1ff40 6f 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20  olumn==nEq).    
1ff50 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68  ){.      SWAP(Wh
1ff60 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67  ereTerm *, pRang
1ff70 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72  eEnd, pRangeStar
1ff80 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  t);.    }..    t
1ff90 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
1ffa0 74 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53  tart && (pRangeS
1ffb0 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
1ffc0 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20  & WO_LE)!=0 );. 
1ffd0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1ffe0 6e 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61  ngeStart && (pRa
1fff0 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
20000 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20  tor & WO_GE)!=0 
20010 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
20020 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70   pRangeEnd && (p
20030 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
20040 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20  tor & WO_LE)!=0 
20050 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
20060 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70   pRangeEnd && (p
20070 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
20080 74 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20  tor & WO_GE)!=0 
20090 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d  );.    startEq =
200a0 20 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c   !pRangeStart ||
200b0 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
200c0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
200d0 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64  |WO_GE);.    end
200e0 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e  Eq =   !pRangeEn
200f0 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e  d || pRangeEnd->
20100 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
20110 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73  LE|WO_GE);.    s
20120 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
20130 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c   = pRangeStart |
20140 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a  | nEq>0;..    /*
20150 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20   Seek the index 
20160 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74  cursor to the st
20170 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
20180 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72  . */.    nConstr
20190 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
201a0 69 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  if( pRangeStart 
201b0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
201c0 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74  Right = pRangeSt
201d0 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  art->pExpr->pRig
201e0 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
201f0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
20200 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
20210 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66  e+nEq);.      if
20220 28 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  ( (pRangeStart->
20230 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
20240 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
20250 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20260 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c  odeIsNullJump(v,
20270 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
20280 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
20290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
202a0 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20  ( zStartAff ){. 
202b0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
202c0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
202d0 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  y(pRight, zStart
202e0 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54  Aff[nEq])==SQLIT
202f0 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20  E_AFF_NONE){.   
20300 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20         /* Since 
20310 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
20320 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  s to be performe
20330 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72  d with no conver
20340 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  sions.          
20350 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68  ** applied to th
20360 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20  e operands, set 
20370 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
20380 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20  apply to pRight 
20390 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  to .          **
203a0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
203b0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
203c0 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d  zStartAff[nEq] =
203d0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
203e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
203f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
20400 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
20410 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
20420 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
20430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53   ){.          zS
20440 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53  tartAff[nEq] = S
20450 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
20460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20470 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  }  .      nConst
20480 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
20490 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
204a0 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
204b0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
204c0 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
204d0 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  1662 */.    }els
204e0 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79  e if( isMinQuery
204f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20500 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20510 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61  P_Null, 0, regBa
20520 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e  se+nEq);.      n
20530 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
20540 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b      startEq = 0;
20550 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  .      start_con
20560 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20  straints = 1;.  
20570 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c    }.    codeAppl
20580 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
20590 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
205a0 74 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41 66  traint, zStartAf
205b0 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74  f);.    op = aSt
205c0 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e  artOp[(start_con
205d0 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28  straints<<2) + (
205e0 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52  startEq<<1) + bR
205f0 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ev];.    assert(
20600 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74 65   op!=0 );.    te
20610 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52  stcase( op==OP_R
20620 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65 73  ewind );.    tes
20630 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61  tcase( op==OP_La
20640 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
20650 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
20660 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
20670 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65  e( op==OP_SeekGe
20680 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20690 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20  ( op==OP_SeekLe 
206a0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
206b0 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29   op==OP_SeekLt )
206c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
206d0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
206e0 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
206f0 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  xt, regBase, nCo
20700 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20  nstraint);..    
20710 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75  /* Load the valu
20720 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61  e for the inequa
20730 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
20740 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
20750 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28  e.    ** range (
20760 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a  if any)..    */.
20770 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
20780 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
20790 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20  RangeEnd ){.    
207a0 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
207b0 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70   pRangeEnd->pExp
207c0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
207d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
207e0 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
207f0 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b  regBase+nEq, 1);
20800 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20810 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
20820 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
20830 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Eq);.      if( (
20840 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
20850 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
20860 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
20870 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
20880 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
20890 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ht, regBase+nEq,
208a0 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
208b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45 6e   }.      if( zEn
208c0 64 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  dAff ){.        
208d0 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
208e0 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
208f0 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29  t, zEndAff[nEq])
20900 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
20910 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  E){.          /*
20920 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61   Since the compa
20930 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70  rison is to be p
20940 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
20950 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20   conversions.   
20960 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65         ** applie
20970 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64  d to the operand
20980 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e  s, set the affin
20990 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ity to apply to 
209a0 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20  pRight to .     
209b0 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41       ** SQLITE_A
209c0 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20  FF_NONE.  */.   
209d0 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e         zEndAff[n
209e0 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
209f0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
20a00 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
20a10 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
20a20 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
20a30 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45  ight, zEndAff[nE
20a40 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  q]) ){.         
20a50 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20   zEndAff[nEq] = 
20a60 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
20a70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20a80 20 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65 41   }  .      codeA
20a90 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
20aa0 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45  rse, regBase, nE
20ab0 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20  q+1, zEndAff);. 
20ac0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
20ad0 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
20ae0 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77  se( pRangeEnd->w
20af0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
20b00 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
20b10 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
20b20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
20b30 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
20b40 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  >db, zStartAff);
20b50 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
20b60 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
20b70 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a  EndAff);..    /*
20b80 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
20b90 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65   body */.    pLe
20ba0 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
20bb0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
20bc0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (v);..    /* Che
20bd0 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ck if the index 
20be0 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74  cursor is past t
20bf0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61  he end of the ra
20c00 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d  nge. */.    op =
20c10 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45   aEndOp[(pRangeE
20c20 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20  nd || nEq) * (1 
20c30 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65  + bRev)];.    te
20c40 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e  stcase( op==OP_N
20c50 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63  oop );.    testc
20c60 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
20c70 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
20c80 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  e( op==OP_IdxLT 
20c90 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f  );.    if( op!=O
20ca0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
20cb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20cc0 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
20cd0 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
20ce0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
20cf0 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
20d00 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
20d10 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31  , endEq!=bRev ?1
20d20 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  :0);.    }..    
20d30 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
20d40 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
20d50 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68  raints, check th
20d60 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  at the value.   
20d70 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
20d80 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
20d90 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74   inequality cont
20da0 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c  rains is not NUL
20db0 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20  L..    ** If it 
20dc0 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  is, jump to the 
20dd0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
20de0 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20  f the loop..    
20df0 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69  */.    r1 = sqli
20e00 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
20e10 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63  arse);.    testc
20e20 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  ase( pLoop->wsFl
20e30 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
20e40 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73  LIMIT );.    tes
20e50 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73  tcase( pLoop->ws
20e60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
20e70 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69  P_LIMIT );.    i
20e80 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
20e90 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f  gs & (WHERE_BTM_
20ea0 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
20eb0 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20 20  LIMIT))!=0 ){.  
20ec0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20ed0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
20ee0 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71  mn, iIdxCur, nEq
20ef0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
20f00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20f10 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c  , OP_IsNull, r1,
20f20 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20   addrCont);.    
20f30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  }.    sqlite3Rel
20f40 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
20f50 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a  se, r1);..    /*
20f60 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20   Seek the table 
20f70 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69  cursor, if requi
20f80 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62  red */.    disab
20f90 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
20fa0 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
20fb0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
20fc0 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b  vel, pRangeEnd);
20fd0 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61  .    if( !omitTa
20fe0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52 6f  ble ){.      iRo
20ff0 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73  widReg = iReleas
21000 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  eReg = sqlite3Ge
21010 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
21020 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21030 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21040 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75  IdxRowid, iIdxCu
21050 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  r, iRowidReg);. 
21060 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21070 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
21080 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
21090 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
210a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
210b0 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75  (v, OP_Seek, iCu
210c0 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20  r, iRowidReg);  
210d0 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65 65 6b  /* Deferred seek
210e0 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   */.    }..    /
210f0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73  * Record the ins
21100 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f  truction used to
21110 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
21120 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20  oop. Disable .  
21130 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73    ** WHERE claus
21140 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64  e terms made red
21150 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e  undant by the in
21160 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a  dex range scan..
21170 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
21180 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
21190 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a  WHERE_ONEROW ){.
211a0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
211b0 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
211c0 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29  }else if( bRev )
211d0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
211e0 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20  op = OP_Prev;.  
211f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
21200 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
21210 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
21220 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78  Level->p1 = iIdx
21230 43 75 72 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  Cur;.    if( (pL
21240 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21250 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29  HERE_CONSTRAINT)
21260 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ==0 ){.      pLe
21270 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
21280 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
21290 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d  SCAN_STEP;.    }
212a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
212b0 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d  rt( pLevel->p5==
212c0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  0 );.    }.  }el
212d0 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
212e0 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
212f0 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c  IZATION.  if( pL
21300 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21310 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b  HERE_MULTI_OR ){
21320 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20  .    /* Case 5: 
21330 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   Two or more sep
21340 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20  arately indexed 
21350 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
21360 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20  by OR.    **.   
21370 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
21380 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45   **.    **   CRE
21390 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62  ATE TABLE t1(a,b
213a0 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20  ,c,d);.    **   
213b0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
213c0 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a  ON t1(a);.    **
213d0 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
213e0 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20  i2 ON t1(b);.   
213f0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
21400 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a  EX i3 ON t1(c);.
21410 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
21420 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
21430 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d   WHERE a=5 OR b=
21440 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64  7 OR (c=11 AND d
21450 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  =13).    **.    
21460 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
21470 65 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72  e, there are thr
21480 65 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73  ee indexed terms
21490 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
214a0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70  ..    ** The top
214b0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f   of the loop loo
214c0 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ks like this:.  
214d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
214e0 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20       Null       
214f0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
21500 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73   # Zero the rows
21510 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20  et in reg 1.    
21520 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20  **.    ** Then, 
21530 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65 64  for each indexed
21540 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f   term, the follo
21550 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65  wing. The argume
21560 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f  nts to.    ** Ro
21570 77 53 65 74 54 65 73 74 20 61 72 65 20 73 75 63  wSetTest are suc
21580 68 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  h that the rowid
21590 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
215a0 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a  row is inserted.
215b0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
215c0 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69 73  RowSet. If it is
215d0 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
215e0 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20  , control skips 
215f0 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62  the.    ** Gosub
21600 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70   opcode and jump
21610 73 20 73 74 72 61 69 67 68 74 20 74 6f 20 74 68  s straight to th
21620 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
21630 20 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a   by WhereEnd()..
21640 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
21650 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
21660 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20  eBegin(<term>). 
21670 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
21680 6f 77 53 65 74 54 65 73 74 20 20 20 20 20 20 20  owSetTest       
21690 20 20 20 20 20 20 20 20 20 20 20 23 20 49 6e 73             # Ins
216a0 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72  ert rowid into r
216b0 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20  owset.    **    
216c0 20 20 20 20 20 20 47 6f 73 75 62 20 20 20 20 20        Gosub     
216d0 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20   2 A.    **     
216e0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
216f0 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nd().    **.    
21700 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** Following the
21710 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20   above, code to 
21720 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
21730 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65  op. Label A, the
21740 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f   target.    ** o
21750 66 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76  f the Gosub abov
21760 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20  e, jumps to the 
21770 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68  instruction righ
21780 74 20 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f  t after the Goto
21790 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
217a0 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20           Null   
217b0 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
217c0 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20       # Zero the 
217d0 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a  rowset in reg 1.
217e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
217f0 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20 20  Goto       B    
21800 20 20 20 20 20 20 20 20 20 20 20 20 23 20 54 68              # Th
21810 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68  e loop is finish
21820 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
21830 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70  *       A: <loop
21840 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20   body>          
21850 20 20 20 20 20 20 20 23 20 52 65 74 75 72 6e 20         # Return 
21860 64 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a  data, whatever..
21870 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
21880 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 20 20         Return   
21890 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
218a0 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74     # Jump back t
218b0 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20  o the Gosub.    
218c0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
218d0 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f  B: <after the lo
218e0 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  op>.    **.    *
218f0 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  /.    WhereClaus
21900 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20  e *pOrWc;    /* 
21910 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72  The OR-clause br
21920 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75  oken out into su
21930 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72  bterms */.    Sr
21940 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20  cList *pOrTab;  
21950 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65       /* Shortene
21960 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20  d table list or 
21970 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61  OR-clause genera
21980 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65  tion */.    Inde
21990 78 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20  x *pCov = 0;    
219a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65           /* Pote
219b0 6e 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69  ntial covering i
219c0 6e 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  ndex (or NULL) *
219d0 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75  /.    int iCovCu
219e0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
219f0 2b 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75  ++;  /* Cursor u
21a00 73 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63  sed for index sc
21a10 61 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ans (if any) */.
21a20 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75  .    int regRetu
21a30 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
21a40 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
21a50 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20  * Register used 
21a60 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f  with OP_Gosub */
21a70 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73  .    int regRows
21a80 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21aa0 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52  * Register for R
21ab0 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  owSet object */.
21ac0 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
21ad0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21af0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
21b00 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  g rowid */.    i
21b10 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73  nt iLoopBody = s
21b20 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
21b30 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72  bel(v);  /* Star
21b40 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a  t of loop body *
21b50 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e  /.    int iRetIn
21b60 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b80 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65  /* Address of re
21b90 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a  gReturn init */.
21ba0 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64      int untested
21bb0 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20  Terms = 0;      
21bc0 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74         /* Some t
21bd0 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  erms not complet
21be0 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ely tested */.  
21bf0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c10 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21c20 6e 74 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  nter */.    Expr
21c30 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20   *pAndExpr = 0; 
21c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21c50 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e  * An ".. AND (..
21c60 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  .)" expression *
21c70 2f 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20  /.   .    pTerm 
21c80 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
21c90 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0];.    assert( 
21ca0 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
21cb0 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
21cc0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
21cd0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21ce0 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
21cf0 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d  & TERM_ORINFO)!=
21d00 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d  0 );.    pOrWc =
21d10 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
21d20 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76  fo->wc;.    pLev
21d30 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75  el->op = OP_Retu
21d40 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  rn;.    pLevel->
21d50 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a  p1 = regReturn;.
21d60 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61  .    /* Set up a
21d70 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20   new SrcList in 
21d80 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e  pOrTab containin
21d90 67 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  g the table bein
21da0 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a  g scanned.    **
21db0 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e   by this loop in
21dc0 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61   the a[0] slot a
21dd0 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20  nd all notReady 
21de0 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d  tables in a[1..]
21df0 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54   slots..    ** T
21e00 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  his becomes the 
21e10 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72  SrcList in the r
21e20 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f  ecursive call to
21e30 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
21e40 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  in()..    */.   
21e50 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
21e60 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  vel>1 ){.      i
21e70 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20  nt nNotReady;   
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21e90 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   The number of n
21ea0 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a  otReady tables *
21eb0 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  /.      struct S
21ec0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69  rcList_item *ori
21ed0 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69  gSrc;     /* Ori
21ee0 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61  ginal list of ta
21ef0 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e  bles */.      nN
21f00 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f  otReady = pWInfo
21f10 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65  ->nLevel - iLeve
21f20 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72  l - 1;.      pOr
21f30 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61  Tab = sqlite3Sta
21f40 63 6b 41 6c 6c 6f 63 52 61 77 28 70 50 61 72 73  ckAllocRaw(pPars
21f50 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f70 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61     sizeof(*pOrTa
21f80 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69  b)+ nNotReady*si
21f90 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30  zeof(pOrTab->a[0
21fa0 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ]));.      if( p
21fb0 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  OrTab==0 ) retur
21fc0 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20  n notReady;.    
21fd0 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63    pOrTab->nAlloc
21fe0 20 3d 20 28 75 38 29 28 6e 4e 6f 74 52 65 61 64   = (u8)(nNotRead
21ff0 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f  y + 1);.      pO
22000 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72  rTab->nSrc = pOr
22010 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20  Tab->nAlloc;.   
22020 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62     memcpy(pOrTab
22030 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73  ->a, pTabItem, s
22040 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29  izeof(*pTabItem)
22050 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63  );.      origSrc
22060 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
22070 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f  ist->a;.      fo
22080 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65  r(k=1; k<=nNotRe
22090 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  ady; k++){.     
220a0 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61     memcpy(&pOrTa
220b0 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72  b->a[k], &origSr
220c0 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f  c[pLevel[k].iFro
220d0 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61  m], sizeof(pOrTa
220e0 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20  b->a[k]));.     
220f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
22100 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49      pOrTab = pWI
22110 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
22120 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69     }..    /* Ini
22130 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73  tialize the rows
22140 65 74 20 72 65 67 69 73 74 65 72 20 74 6f 20 63  et register to c
22150 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20  ontain NULL. An 
22160 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20  SQL NULL is .   
22170 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
22180 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65  o an empty rowse
22190 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
221a0 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65   Also initialize
221b0 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f   regReturn to co
221c0 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73  ntain the addres
221d0 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63  s of the instruc
221e0 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d  tion .    ** imm
221f0 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
22200 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e  ng the OP_Return
22210 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
22220 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73  f the loop. This
22230 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69  .    ** is requi
22240 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73  red in a few obs
22250 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63  cure LEFT JOIN c
22260 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72  ases where contr
22270 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20  ol jumps.    ** 
22280 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20  over the top of 
22290 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68  the loop into th
222a0 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e  e body of it. In
222b0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
222c0 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72      ** correct r
222d0 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20  esponse for the 
222e0 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65  end-of-loop code
222f0 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29   (the OP_Return)
22300 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66   is to .    ** f
22310 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
22320 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
22330 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20  ion, just as an 
22340 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a  OP_Next does if.
22350 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e      ** called on
22360 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   an uninitialize
22370 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f  d cursor..    */
22380 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
22390 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
223a0 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
223b0 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
223c0 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50  regRowset = ++pP
223d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
223e0 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
223f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
22400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22410 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
22420 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a   0, regRowset);.
22430 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e      }.    iRetIn
22440 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
22450 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
22460 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75  eger, 0, regRetu
22470 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  rn);..    /* If 
22480 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  the original WHE
22490 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f  RE clause is z o
224a0 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31  f the form:  (x1
224b0 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41   OR x2 OR ...) A
224c0 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e  ND y.    ** Then
224d0 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
224e0 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20  xN, evaluate as 
224f0 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
22500 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20  n: xN AND z.    
22510 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72  ** That way, ter
22520 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65  ms in y that are
22530 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74   factored into t
22540 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77  he disjunction w
22550 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69  ill.    ** be pi
22560 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72  cked up by the r
22570 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
22580 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
22590 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20  gin() below..   
225a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61   **.    ** Actua
225b0 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70  lly, each subexp
225c0 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65  ression is conve
225d0 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20  rted to "xN AND 
225e0 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20  w" where w is.  
225f0 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65    ** the "intere
22600 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20  sting" terms of 
22610 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64  z - terms that d
22620 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
22630 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f   in the.    ** O
22640 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
22650 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
22660 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74  , and terms that
22670 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a   are usable as .
22680 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a      ** indices..
22690 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
226a0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
226b0 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65  also only applie
226c0 73 20 69 66 20 74 68 65 20 28 78 31 20 4f 52 20  s if the (x1 OR 
226d0 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a  x2 OR ...) term.
226e0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f      ** is not co
226f0 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f  ntained in the O
22700 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
22710 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20  FT JOIN..    ** 
22720 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a  See ticket http:
22730 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
22740 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33  /src/info/f23693
22750 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20  04e4.    */.    
22760 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31  if( pWC->nTerm>1
22770 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
22780 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  erm;.      for(i
22790 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57  Term=0; iTerm<pW
227a0 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b  C->nTerm; iTerm+
227b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
227c0 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61   *pExpr = pWC->a
227d0 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20  [iTerm].pExpr;. 
227e0 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
227f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
22800 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
22810 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22820 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54     if( pWC->a[iT
22830 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28  erm].wtFlags & (
22840 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
22850 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74  M_ORINFO) ) cont
22860 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
22870 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( (pWC->a[iTerm]
22880 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  .eOperator & WO_
22890 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ALL)==0 ) contin
228a0 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  ue;.        pExp
228b0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
228c0 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
228d0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
228e0 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
228f0 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
22900 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72  se->db, pAndExpr
22910 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
22920 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
22930 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
22940 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
22950 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
22960 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45  TK_AND, 0, pAndE
22970 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
22980 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
22990 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e  ii=0; ii<pOrWc->
229a0 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
229b0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
229c0 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d  OrTerm = &pOrWc-
229d0 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66  >a[ii];.      if
229e0 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
229f0 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28  ursor==iCur || (
22a00 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
22a10 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
22a20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
22a30 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b  Info *pSubWInfo;
22a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
22a50 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d  o for single OR-
22a60 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20  term scan */.   
22a70 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78       Expr *pOrEx
22a80 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  pr = pOrTerm->pE
22a90 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
22aa0 20 70 41 6e 64 45 78 70 72 20 26 26 20 21 45 78   pAndExpr && !Ex
22ab0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f  prHasProperty(pO
22ac0 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rExpr, EP_FromJo
22ad0 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  in) ){.         
22ae0 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
22af0 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20   = pOrExpr;.    
22b00 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20        pOrExpr = 
22b10 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20  pAndExpr;.      
22b20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c    }.        /* L
22b30 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
22b40 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
22b50 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
22b60 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53  m. */.        pS
22b70 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  ubWInfo = sqlite
22b80 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
22b90 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45  se, pOrTab, pOrE
22ba0 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  xpr, 0, 0,.     
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bc0 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50     WHERE_OMIT_OP
22bd0 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45  EN_CLOSE | WHERE
22be0 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20  _AND_ONLY |.    
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c00 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f      WHERE_FORCE_
22c10 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e  TABLE | WHERE_ON
22c20 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f  ETABLE_ONLY, iCo
22c30 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61  vCur);.        a
22c40 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f  ssert( pSubWInfo
22c50 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
22c60 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
22c70 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
22c80 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
22c90 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  WInfo ){.       
22ca0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53     WhereLoop *pS
22cb0 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  ubLoop;.        
22cc0 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e    explainOneScan
22cd0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
22ce0 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
22cf0 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d  &pSubWInfo->a[0]
22d00 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c  , iLevel, pLevel
22d10 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20  ->iFrom, 0.     
22d20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
22d30 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
22d40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
22d50 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
22d60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
22d70 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28     int iSet = ((
22d80 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ii==pOrWc->nTerm
22d90 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20  -1)?-1:ii);.    
22da0 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20          int r;. 
22db0 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
22dc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
22dd0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
22de0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20  pTabItem->pTab, 
22df0 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20  -1, iCur, .     
22e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29      regRowid, 0)
22e30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
22e40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
22e50 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54  nt(v, OP_RowSetT
22e60 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a  est, regRowset,.
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e90 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
22ea0 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c  entAddr(v)+2, r,
22eb0 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20   iSet);.        
22ec0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
22ed0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22ee0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
22ef0 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64  Return, iLoopBod
22f00 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  y);..          /
22f10 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d  * The pSubWInfo-
22f20 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66  >untestedTerms f
22f30 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74  lag means that t
22f40 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20  his OR term.    
22f50 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
22f60 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41  ed one or more A
22f70 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e  ND term from a n
22f80 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20  otReady table.  
22f90 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  The.          **
22fa0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
22fb0 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63  notReady table c
22fc0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74  ould not be test
22fd0 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20  ed and will.    
22fe0 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
22ff0 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72   be tested later
23000 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
23010 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
23020 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
23030 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64  Terms ) untested
23040 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20  Terms = 1;..    
23050 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
23060 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63  of the OR-connec
23070 74 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70  ted terms are op
23080 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68  timized using th
23090 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20  e same.         
230a0 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74   ** index, and t
230b0 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  he index is open
230c0 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
230d0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
230e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20            ** by 
230f0 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c  each call to sql
23100 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
23110 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f   made by this lo
23120 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20  op, it may.     
23130 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69       ** be possi
23140 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74 20  ble to use that 
23150 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65 72  index as a cover
23160 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  ing index..     
23170 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
23180 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
23190 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
231a0 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65  Begin() above re
231b0 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e  sulted in a scan
231c0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
231d0 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  ** uses an index
231e0 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 65 69  , and this is ei
231f0 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20 4f  ther the first O
23200 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
23210 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
23220 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65 20 69  ocessed or the i
23230 6e 64 65 78 20 69 73 20 74 68 65 20 73 61 6d 65  ndex is the same
23240 20 61 73 20 74 68 61 74 20 75 73 65 64 20 62 79   as that used by
23250 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20   all previous.  
23260 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
23270 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68  , set pCov to th
23280 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65  e candidate cove
23290 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65  ring index. Othe
232a0 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20  rwise, set .    
232b0 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f        ** pCov to
232c0 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74   NULL to indicat
232d0 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64  e that no candid
232e0 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ate covering ind
232f0 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20  ex will .       
23300 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62     ** be availab
23310 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  le..          */
23320 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 4c  .          pSubL
23330 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d  oop = pSubWInfo-
23340 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20  >a[0].pWLoop;.  
23350 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23360 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61  (pSubLoop->wsFla
23370 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
23380 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20  INDEX)==0 );.   
23390 20 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62         if( (pSub
233a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
233b0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
233c0 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
233d0 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f  (ii==0 || pSubLo
233e0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
233f0 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20  ex==pCov).      
23400 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
23410 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57     assert( pSubW
23420 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43  Info->a[0].iIdxC
23430 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20  ur==iCovCur );. 
23440 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
23450 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74  = pSubLoop->u.bt
23460 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
23470 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23480 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
23490 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  0;.          }..
234a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
234b0 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72  ish the loop thr
234c0 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
234d0 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
234e0 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
234f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23500 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e  WhereEnd(pSubWIn
23510 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fo);.        }. 
23520 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
23530 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69   pLevel->u.pCovi
23540 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69  dx = pCov;.    i
23550 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c  f( pCov ) pLevel
23560 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76  ->iIdxCur = iCov
23570 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e  Cur;.    if( pAn
23580 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  dExpr ){.      p
23590 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  AndExpr->pLeft =
235a0 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
235b0 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
235c0 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72  se->db, pAndExpr
235d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
235e0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
235f0 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71  (v, iRetInit, sq
23600 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
23610 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71  Addr(v));.    sq
23620 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23630 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
23640 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
23650 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
23660 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23670 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
23680 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
23690 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53  vel>1 ) sqlite3S
236a0 74 61 63 6b 46 72 65 65 28 70 50 61 72 73 65 2d  tackFree(pParse-
236b0 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20  >db, pOrTab);.  
236c0 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54    if( !untestedT
236d0 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65  erms ) disableTe
236e0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
236f0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
23700 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
23710 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
23720 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20   */..  {.    /* 
23730 43 61 73 65 20 36 3a 20 20 54 68 65 72 65 20 69  Case 6:  There i
23740 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65  s no usable inde
23750 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61  x.  We must do a
23760 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a   complete.    **
23770 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f            scan o
23780 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  f the entire tab
23790 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  le..    */.    s
237a0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
237b0 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65  Step[] = { OP_Ne
237c0 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20  xt, OP_Prev };. 
237d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
237e0 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20  u8 aStart[] = { 
237f0 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61  OP_Rewind, OP_La
23800 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  st };.    assert
23810 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65  ( bRev==0 || bRe
23820 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70 4c 65 76  v==1 );.    pLev
23830 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62  el->op = aStep[b
23840 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Rev];.    pLevel
23850 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
23860 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
23870 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
23880 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52  Op2(v, aStart[bR
23890 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ev], iCur, addrB
238a0 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  rk);.    pLevel-
238b0 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
238c0 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
238d0 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 65 77  _STEP;.  }.  new
238e0 4e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65  NotReady = notRe
238f0 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26  ady & ~getMask(&
23900 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
23910 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49  , iCur);..  /* I
23920 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
23930 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72  st every subexpr
23940 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  ession that can 
23950 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20  be completely.  
23960 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e  ** computed usin
23970 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
23980 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a  t of tables..  *
23990 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  *.  ** IMPLEMENT
239a0 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32  ATION-OF: R-4952
239b0 35 2d 35 30 39 33 35 20 54 65 72 6d 73 20 74 68  5-50935 Terms th
239c0 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74  at cannot be sat
239d0 69 73 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20  isfied through. 
239e0 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69   ** the use of i
239f0 6e 64 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65  ndices become te
23a00 73 74 73 20 74 68 61 74 20 61 72 65 20 65 76 61  sts that are eva
23a10 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74 20 65  luated against e
23a20 61 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20  ach row of.  ** 
23a30 74 68 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70  the relevant inp
23a40 75 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  ut tables..  */.
23a50 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
23a60 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, j=pWC->nTerm
23a70 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
23a80 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
23a90 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  pE;.    testcase
23aa0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
23ab0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
23ac0 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35  ); /* IMP: R-305
23ad0 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
23ae0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
23af0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
23b00 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28  CODED );.    if(
23b10 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
23b20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
23b30 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
23b40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
23b50 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
23b60 6c 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29  l & newNotReady)
23b70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  !=0 ){.      tes
23b80 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75  tcase( pWInfo->u
23b90 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a  ntestedTerms==0.
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
23bb0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
23bc0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
23bd0 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20  ETABLE_ONLY)!=0 
23be0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  );.      pWInfo-
23bf0 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d  >untestedTerms =
23c00 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   1;.      contin
23c10 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  ue;.    }.    pE
23c20 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
23c30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21  .    assert( pE!
23c40 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =0 );.    if( pL
23c50 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
23c60 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
23c70 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
23c80 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  oin) ){.      co
23c90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
23ca0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
23cb0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c  alse(pParse, pE,
23cc0 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
23cd0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
23ce0 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
23cf0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
23d00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  .  }..  /* Inser
23d10 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 66  t code to test f
23d20 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74  or implied const
23d30 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e 20  raints based on 
23d40 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20 2a  transitivity.  *
23d50 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f 70  * of the "==" op
23d60 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
23d70 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68  * Example: If th
23d80 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
23d90 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74 32  ontains "t1.a=t2
23da0 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31 32  .b" and "t2.b=12
23db0 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61  3".  ** and we a
23dc0 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74 31  re coding the t1
23dd0 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74 32   loop and the t2
23de0 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79 65   loop has not ye
23df0 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68  t coded,.  ** th
23e00 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  en we cannot use
23e10 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62 22   the "t1.a=t2.b"
23e20 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75 74   constraint, but
23e30 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a   we can code.  *
23e40 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22 74  * the implied "t
23e50 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72 61  1.a=123" constra
23e60 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
23e70 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
23e80 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  pWC->nTerm; j>0;
23e90 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
23ea0 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
23eb0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c    WhereTerm *pAl
23ec0 74 3b 0a 20 20 20 20 45 78 70 72 20 73 45 71 3b  t;.    Expr sEq;
23ed0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
23ee0 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
23ef0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
23f00 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
23f10 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
23f20 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51  Operator!=(WO_EQ
23f30 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e  UIV|WO_EQ) ) con
23f40 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
23f50 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
23f60 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
23f70 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72  e;.    pE = pTer
23f80 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
23f90 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
23fa0 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
23fb0 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61  omJoin) );.    a
23fc0 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 70  ssert( (pTerm->p
23fd0 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 65 77  rereqRight & new
23fe0 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a  NotReady)!=0 );.
23ff0 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54      pAlt = findT
24000 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70  erm(pWC, iCur, p
24010 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
24020 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  mn, notReady, WO
24030 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20  _EQ|WO_IN, 0);. 
24040 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29     if( pAlt==0 )
24050 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
24060 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73  f( pAlt->wtFlags
24070 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20   & (TERM_CODED) 
24080 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24090 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e  testcase( pAlt->
240a0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
240b0 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Q );.    testcas
240c0 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74  e( pAlt->eOperat
240d0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
240e0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
240f0 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61  t((v, "begin tra
24100 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
24110 6e 74 22 29 29 3b 0a 20 20 20 20 73 45 71 20 3d  nt"));.    sEq =
24120 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20   *pAlt->pExpr;. 
24130 20 20 20 73 45 71 2e 70 4c 65 66 74 20 3d 20 70     sEq.pLeft = p
24140 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 73 71  E->pLeft;.    sq
24150 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24160 28 70 50 61 72 73 65 2c 20 26 73 45 71 2c 20 61  (pParse, &sEq, a
24170 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
24180 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d  JUMPIFNULL);.  }
24190 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
241a0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
241b0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
241c0 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
241d0 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
241e0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
241f0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
24200 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
24210 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
24220 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
24230 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
24240 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
24250 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
24260 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
24270 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
24280 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24290 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
242a0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
242b0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
242c0 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
242d0 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
242e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
242f0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
24300 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
24310 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
24320 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
24330 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
24340 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
24350 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
24360 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49  VIRTUAL );  /* I
24370 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  MP: R-30575-1166
24380 32 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  2 */.      testc
24390 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
243a0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
243b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
243c0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
243d0 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
243e0 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
243f0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
24400 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
24410 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21   & newNotReady)!
24420 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
24430 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e  sert( pWInfo->un
24440 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20  testedTerms );. 
24450 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
24460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
24470 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
24480 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  xpr );.      sql
24490 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
244a0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
244b0 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Expr, addrCont, 
244c0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
244d0 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  L);.      pTerm-
244e0 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
244f0 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
24500 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
24510 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
24520 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
24530 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 4e 6f 74  .  return newNot
24540 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66  Ready;.}..#ifdef
24550 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
24560 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
24570 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
24580 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ct for debugging
24590 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61   purposes.*/.sta
245a0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
245b0 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f  opPrint(WhereLoo
245c0 70 20 2a 70 2c 20 53 72 63 4c 69 73 74 20 2a 70  p *p, SrcList *p
245d0 54 61 62 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20  TabList){.  int 
245e0 6e 62 20 3d 20 31 2b 28 70 54 61 62 4c 69 73 74  nb = 1+(pTabList
245f0 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73  ->nSrc+7)/8;.  s
24600 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24610 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 54 61 62  em *pItem = pTab
24620 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61  List->a + p->iTa
24630 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  b;.  Table *pTab
24640 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
24650 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24660 69 6e 74 66 28 22 25 63 20 25 32 64 2e 25 30 2a  intf("%c %2d.%0*
24670 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e  llx.%0*llx", p->
24680 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cId,.           
24690 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61            p->iTa
246a0 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65  b, nb, p->maskSe
246b0 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65  lf, nb, p->prere
246c0 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  q);.  sqlite3Deb
246d0 75 67 50 72 69 6e 74 66 28 22 20 25 38 73 22 2c  ugPrintf(" %8s",
246e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
246f0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c        pItem->zAl
24700 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c  ias ? pItem->zAl
24710 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d  ias : pTab->zNam
24720 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73  e);.  if( (p->ws
24730 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
24740 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
24750 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62  {.    if( p->u.b
24760 74 72 65 65 2e 70 49 6e 64 65 78 20 29 7b 0a 20  tree.pIndex ){. 
24770 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
24780 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  *zName = p->u.bt
24790 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
247a0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61  e;.      if( zNa
247b0 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d 65 20 3d 20  me==0 ) zName = 
247c0 22 69 70 6b 22 3b 0a 20 20 20 20 20 20 69 66 28  "ipk";.      if(
247d0 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20   strncmp(zName, 
247e0 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
247f0 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20  x_", 17)==0 ){. 
24800 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73         int i = s
24810 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
24820 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20  Name) - 1;.     
24830 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b     while( zName[
24840 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20  i]!='_' ) i--;. 
24850 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20         zName += 
24860 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  i;.      }.     
24870 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24880 6e 74 66 28 22 2e 25 2d 31 32 73 20 25 32 64 22  ntf(".%-12s %2d"
24890 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74  , zName, p->u.bt
248a0 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65  ree.nEq);.    }e
248b0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
248c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
248d0 31 36 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a  16s","");.    }.
248e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
248f0 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d  r *z;.    if( p-
24900 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29  >u.vtab.idxStr )
24910 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
24920 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64  te3_mprintf("(%d
24930 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20  ,\"%s\",%x)",.  
24940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
24950 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
24960 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
24970 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  , p->u.vtab.omit
24980 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Mask);.    }else
24990 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
249a0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64  te3_mprintf("(%d
249b0 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62  ,%x)", p->u.vtab
249c0 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74  .idxNum, p->u.vt
249d0 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
249e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
249f0 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31  ebugPrintf(" %-1
24a00 35 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  5s", z);.    sql
24a10 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
24a20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
24a30 50 72 69 6e 74 66 28 22 20 66 67 20 25 30 35 78  Printf(" fg %05x
24a40 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61   N %d", p->wsFla
24a50 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a  gs, p->nLTerm);.
24a60 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24a70 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25  intf(" cost %d,%
24a80 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74  d,%d\n", p->rSet
24a90 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  up, p->rRun, p->
24aa0 6e 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  nOut);.}.#endif.
24ab0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62  ./*.** Convert b
24ac0 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20  ulk memory into 
24ad0 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f  a valid WhereLoo
24ae0 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61  p that can be pa
24af0 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65  ssed.** to where
24b00 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65  LoopClear harmle
24b10 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssly..*/.static 
24b20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e  void whereLoopIn
24b30 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  it(WhereLoop *p)
24b40 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  {.  p->aLTerm = 
24b50 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a  p->aLTermSpace;.
24b60 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b    p->nLTerm = 0;
24b70 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41  .  p->nLSlot = A
24b80 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65  rraySize(p->aLTe
24b90 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77  rmSpace);.  p->w
24ba0 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f  sFlags = 0;.}../
24bb0 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57  *.** Clear the W
24bc0 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e  hereLoop.u union
24bd0 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f  .  Leave WhereLo
24be0 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74  op.pLTerm intact
24bf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24c00 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
24c10 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  nion(sqlite3 *db
24c20 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
24c30 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
24c40 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55  s & (WHERE_VIRTU
24c50 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 54 45  ALTABLE|WHERE_TE
24c60 4d 50 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  MP_INDEX) ){.   
24c70 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
24c80 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
24c90 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e  TABLE)!=0 && p->
24ca0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
24cb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24cc0 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e  _free(p->u.vtab.
24cd0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70  idxStr);.      p
24ce0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
24cf0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  e = 0;.      p->
24d00 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
24d10 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
24d20 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
24d30 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
24d40 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65  !=0 && p->u.btre
24d50 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  e.pIndex!=0 ){. 
24d60 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
24d70 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
24d80 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66  e.pIndex->zColAf
24d90 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
24da0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
24db0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a  .btree.pIndex);.
24dc0 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65        p->u.btree
24dd0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
24de0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
24df0 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72  Deallocate inter
24e00 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  nal memory used 
24e10 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  by a WhereLoop o
24e20 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
24e30 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c  void whereLoopCl
24e40 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ear(sqlite3 *db,
24e50 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
24e60 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
24e70 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
24e80 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
24e90 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
24ea0 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
24eb0 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20  Union(db, p);.  
24ec0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
24ed0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  ;.}../*.** Incre
24ee0 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ase the memory a
24ef0 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c  llocation for pL
24f00 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f  oop->aLTerm[] to
24f10 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a   be at least n..
24f20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
24f30 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71  ereLoopResize(sq
24f40 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
24f50 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b  Loop *p, int n){
24f60 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70  .  WhereTerm **p
24f70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  aNew;.  if( p->n
24f80 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72  LSlot>=n ) retur
24f90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e  n SQLITE_OK;.  n
24fa0 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70   = (n+7)&~7;.  p
24fb0 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
24fc0 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
24fd0 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
24fe0 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e  ])*n);.  if( paN
24ff0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
25000 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
25010 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e  emcpy(paNew, p->
25020 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70  aLTerm, sizeof(p
25030 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e  ->aLTerm[0])*p->
25040 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70  nLSlot);.  if( p
25050 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
25060 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
25070 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
25080 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c  aLTerm);.  p->aL
25090 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20  Term = paNew;.  
250a0 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20  p->nLSlot = n;. 
250b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
250c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  K;.}../*.** Tran
250d0 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f  sfer content fro
250e0 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f  m the second pLo
250f0 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73  op into the firs
25100 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
25110 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73   whereLoopXfer(s
25120 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
25130 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72  eLoop *pTo, Wher
25140 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20  eLoop *pFrom){. 
25150 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
25160 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46  size(db, pTo, pF
25170 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 20 72  rom->nLTerm) ) r
25180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
25190 45 4d 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  EM;.  whereLoopC
251a0 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54  learUnion(db, pT
251b0 6f 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f  o);.  memcpy(pTo
251c0 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c  , pFrom, WHERE_L
251d0 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20  OOP_XFER_SZ);.  
251e0 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
251f0 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
25200 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
25210 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
25220 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46  m[0]));.  if( pF
25230 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
25240 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
25250 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E ){.    pFrom->
25260 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
25270 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
25280 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73   (pFrom->wsFlags
25290 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
252a0 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  DEX)!=0 ){.    p
252b0 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49  From->u.btree.pI
252c0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
252d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
252e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
252f0 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  e a WhereLoop ob
25300 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
25310 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c  oid whereLoopDel
25320 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
25330 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
25340 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
25350 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  (db, p);.  sqlit
25360 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
25370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
25380 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
25390 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
253a0 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
253b0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
253c0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
253d0 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
253e0 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77  pWInfo) ){.    w
253f0 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
25400 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
25410 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
25420 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20  ->pLoops ){.    
25430 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d    WhereLoop *p =
25440 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b   pWInfo->pLoops;
25450 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
25460 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
25470 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72  Loop;.      wher
25480 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
25490 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
254a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
254b0 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
254c0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20  /*.** Insert or 
254d0 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c  replace a WhereL
254e0 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20  oop entry using 
254f0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70  the template sup
25500 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  plied..**.** An 
25510 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
25520 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62  op entry might b
25530 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
25540 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
25550 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61  e.** is better a
25560 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70  nd has fewer dep
25570 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74  endencies.  Or t
25580 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c  he template will
25590 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61   be ignored.** a
255a0 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c  nd no insert wil
255b0 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78  l occur if an ex
255c0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
255d0 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68   is faster and h
255e0 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65  as.** fewer depe
255f0 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
25600 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68  e template.  Oth
25610 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65  erwise a new Whe
25620 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64  reLoop is.** add
25630 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
25640 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  template..**.** 
25650 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65  If pBuilder->pBe
25660 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  st is not NULL t
25670 68 65 6e 20 77 65 20 6f 6e 6c 79 20 63 61 72 65  hen we only care
25680 20 61 62 6f 75 74 20 74 68 65 20 76 65 72 79 0a   about the very.
25690 2a 2a 20 62 65 73 74 20 74 65 6d 70 6c 61 74 65  ** best template
256a0 20 61 6e 64 20 74 68 61 74 20 74 65 6d 70 6c 61   and that templa
256b0 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  te should be sto
256c0 72 65 64 20 69 6e 20 70 42 75 69 6c 64 65 72 2d  red in pBuilder-
256d0 3e 70 42 65 73 74 2e 0a 2a 2a 20 49 66 20 70 42  >pBest..** If pB
256e0 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73  uilder->pBest is
256f0 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 6c 69 73   NULL then a lis
25700 74 20 6f 66 20 74 68 65 20 62 65 73 74 20 74 65  t of the best te
25710 6d 70 6c 61 74 65 73 20 61 72 65 20 73 74 6f 72  mplates are stor
25720 65 64 0a 2a 2a 20 69 6e 20 70 42 75 69 6c 64 65  ed.** in pBuilde
25730 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  r->pWInfo->pLoop
25740 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63  s..**.** When ac
25750 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69  cumulating multi
25760 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20  ple loops (when 
25770 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20  pBuilder->pBest 
25780 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73  is NULL) we.** s
25790 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77  till might overw
257a0 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f  rite similar loo
257b0 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ps with the new 
257c0 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a  template if the.
257d0 2a 2a 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62  ** template is b
257e0 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61  etter.  Loops ma
257f0 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  y be overwritten
25800 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
25810 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  g .** conditions
25820 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
25830 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76     (1)  They hav
25840 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e  e the same iTab.
25850 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79  .**    (2)  They
25860 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
25870 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28  SortIdx..**    (
25880 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  3)  The template
25890 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77   has same or few
258a0 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
258b0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
258c0 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20   loop.**    (4) 
258d0 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
258e0 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
258f0 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68  wer cost than th
25900 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
25910 2a 20 20 20 20 28 35 29 20 20 54 68 65 20 74 65  *    (5)  The te
25920 6d 70 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65  mplate uses more
25930 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61   terms of the sa
25940 6d 65 20 69 6e 64 65 78 20 62 75 74 20 68 61 73  me index but has
25950 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a   no additional.*
25960 2a 20 20 20 20 20 20 20 20 20 64 65 70 65 6e 64  *         depend
25970 65 6e 63 69 65 73 20 20 20 20 20 20 20 20 20 20  encies          
25980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
25990 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
259a0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
259b0 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
259c0 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
259d0 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
259e0 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65  ppPrev, *p, *pNe
259f0 78 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 49  xt = 0;.  WhereI
25a00 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
25a10 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
25a20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
25a30 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
25a40 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75  db;..  /* If pBu
25a50 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73 20  ilder->pBest is 
25a60 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
25a70 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
25a80 20 74 68 65 20 73 69 6e 67 6c 65 0a 20 20 2a 2a   the single.  **
25a90 20 62 65 73 74 20 57 68 65 72 65 4c 6f 6f 70 2e   best WhereLoop.
25aa0 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73    pBuilder->pBes
25ab0 74 2d 3e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 69  t->maskSelf==0 i
25ac0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 6e 6f  ndicates that no
25ad0 0a 20 20 2a 2a 20 70 72 69 6f 72 20 57 68 65 72  .  ** prior Wher
25ae0 65 4c 6f 6f 70 73 20 68 61 76 65 20 62 65 65 6e  eLoops have been
25af0 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74   evaluated and t
25b00 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
25b10 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2a 20 69  pTemplate.  ** i
25b20 73 20 74 68 65 72 65 66 6f 72 65 20 74 68 65 20  s therefore the 
25b30 66 69 72 73 74 20 61 6e 64 20 68 65 6e 63 65 20  first and hence 
25b40 74 68 65 20 62 65 73 74 20 61 6e 64 20 73 68 6f  the best and sho
25b50 75 6c 64 20 62 65 20 72 65 74 61 69 6e 65 64 2e  uld be retained.
25b60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 20 3d  .  */.  if( (p =
25b70 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74   pBuilder->pBest
25b80 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
25b90 70 2d 3e 6d 61 73 6b 53 65 6c 66 21 3d 30 20 29  p->maskSelf!=0 )
25ba0 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6f 73  {.      WhereCos
25bb0 74 20 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43  t rCost = whereC
25bc0 6f 73 74 41 64 64 28 70 2d 3e 72 52 75 6e 2c 70  ostAdd(p->rRun,p
25bd0 2d 3e 72 53 65 74 75 70 29 3b 0a 20 20 20 20 20  ->rSetup);.     
25be0 20 57 68 65 72 65 43 6f 73 74 20 72 54 65 6d 70   WhereCost rTemp
25bf0 6c 61 74 65 20 3d 20 77 68 65 72 65 43 6f 73 74  late = whereCost
25c00 41 64 64 28 70 54 65 6d 70 6c 61 74 65 2d 3e 72  Add(pTemplate->r
25c10 52 75 6e 2c 70 54 65 6d 70 6c 61 74 65 2d 3e 72  Run,pTemplate->r
25c20 53 65 74 75 70 29 3b 0a 20 20 20 20 20 20 69 66  Setup);.      if
25c30 28 20 72 43 6f 73 74 20 3c 20 72 54 65 6d 70 6c  ( rCost < rTempl
25c40 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 74  ate ){.        t
25c50 65 73 74 63 61 73 65 28 20 72 43 6f 73 74 3d 3d  estcase( rCost==
25c60 72 54 65 6d 70 6c 61 74 65 2d 31 20 29 3b 0a 20  rTemplate-1 );. 
25c70 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72         goto wher
25c80 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70  eLoopInsert_noop
25c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25ca0 69 66 28 20 72 43 6f 73 74 3d 3d 72 54 65 6d 70  if( rCost==rTemp
25cb0 6c 61 74 65 20 26 26 20 28 70 2d 3e 70 72 65 72  late && (p->prer
25cc0 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
25cd0 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72  prereq)==p->prer
25ce0 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  eq ){.        go
25cf0 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  to whereLoopInse
25d00 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d  rt_noop;.      }
25d10 0a 20 20 20 20 7d 0a 23 69 66 20 57 48 45 52 45  .    }.#if WHERE
25d20 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
25d30 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
25d40 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
25d50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
25d60 62 75 67 50 72 69 6e 74 66 28 70 2d 3e 6d 61 73  bugPrintf(p->mas
25d70 6b 53 65 6c 66 3d 3d 30 20 3f 20 22 69 6e 73 2d  kSelf==0 ? "ins-
25d80 69 6e 69 74 3a 20 22 20 3a 20 22 69 6e 73 2d 62  init: " : "ins-b
25d90 65 73 74 3a 20 22 29 3b 0a 20 20 20 20 20 20 77  est: ");.      w
25da0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
25db0 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d  emplate, pWInfo-
25dc0 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20  >pTabList);.    
25dd0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65  }.#endif.    whe
25de0 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70  reLoopXfer(db, p
25df0 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
25e00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25e10 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  OK;.  }..  /* Se
25e20 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
25e30 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74  ting WhereLoop t
25e40 6f 20 6f 76 65 72 77 72 69 74 65 2c 20 6f 72 20  o overwrite, or 
25e50 77 68 69 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a  which takes.  **
25e60 20 70 72 69 6f 72 69 74 79 20 6f 76 65 72 20 70   priority over p
25e70 54 65 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20  Template..  */. 
25e80 20 66 6f 72 28 70 70 50 72 65 76 3d 26 70 57 49   for(ppPrev=&pWI
25e90 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a  nfo->pLoops, p=*
25ea0 70 70 50 72 65 76 3b 20 70 3b 20 70 70 50 72 65  ppPrev; p; ppPre
25eb0 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c  v=&p->pNextLoop,
25ec0 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20   p=*ppPrev){.   
25ed0 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
25ee0 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c  emplate->iTab ||
25ef0 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54   p->iSortIdx!=pT
25f00 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64  emplate->iSortId
25f10 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  x ){.      /* If
25f20 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62   either the iTab
25f30 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c   or iSortIdx val
25f40 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72  ues for two Wher
25f50 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72  eLoop are differ
25f60 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ent.      ** the
25f70 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f  n those WhereLoo
25f80 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ps need to be co
25f90 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74  nsidered separat
25fa0 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73  ely.  Neither is
25fb0 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64  .      ** a cand
25fc0 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65  idate to replace
25fd0 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20   the other. */. 
25fe0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
25ff0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74     }.    /* In t
26000 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
26010 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72  mentation, the r
26020 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65  Setup value is e
26030 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a  ither zero.    *
26040 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66  * or the cost of
26050 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74   building an aut
26060 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c  omatic index (Nl
26070 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f  ogN) and the Nlo
26080 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  gN.    ** is the
26090 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74   same for compat
260a0 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e  ible WhereLoops.
260b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
260c0 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20  p->rSetup==0 || 
260d0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
260e0 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  p==0 .          
260f0 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65         || p->rSe
26100 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
26110 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f  rSetup );..    /
26120 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  * whereLoopAddBt
26130 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e  ree() always gen
26140 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72  erates and inser
26150 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ts the automatic
26160 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61   index.    ** ca
26170 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65  se first.  Hence
26180 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64   compatible cand
26190 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73  idate WhereLoops
261a0 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61   never have a la
261b0 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74  rger.    ** rSet
261c0 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45  up. Call this SE
261d0 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f  TUP-INVARIANT */
261e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
261f0 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
26200 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
26210 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
26220 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
26230 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
26240 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74  .     && p->rSet
26250 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up<=pTemplate->r
26260 53 65 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d  Setup.     && p-
26270 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65  >rRun<=pTemplate
26280 2d 3e 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20  ->rRun.    ){.  
26290 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
262a0 63 68 20 74 61 6b 65 6e 20 77 68 65 6e 20 70 20  ch taken when p 
262b0 69 73 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74  is equal or bett
262c0 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  er than pTemplat
262d0 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61  e in .      ** a
262e0 6c 6c 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64  ll of (1) depend
262f0 65 6e 63 65 73 20 28 32 29 20 73 65 74 75 70 2d  ences (2) setup-
26300 63 6f 73 74 2c 20 61 6e 64 20 28 33 29 20 72 75  cost, and (3) ru
26310 6e 2d 63 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20  n-cost. */.     
26320 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
26330 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up==pTemplate->r
26340 53 65 74 75 70 20 29 3b 0a 20 20 20 20 20 20 69  Setup );.      i
26350 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65  f( p->nLTerm<pTe
26360 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20  mplate->nLTerm. 
26370 20 20 20 20 20 20 26 26 20 28 70 2d 3e 77 73 46        && (p->wsF
26380 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
26390 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
263a0 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  && (pTemplate->w
263b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
263c0 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
263d0 20 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e    && p->u.btree.
263e0 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74  pIndex==pTemplat
263f0 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  e->u.btree.pInde
26400 78 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 70  x.       && p->p
26410 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65  rereq==pTemplate
26420 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 20 29  ->prereq.      )
26430 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65  {.        /* Ove
26440 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
26450 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74  ng WhereLoop wit
26460 68 20 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65  h an similar one
26470 20 74 68 61 74 20 75 73 65 73 0a 20 20 20 20 20   that uses.     
26480 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65 72 6d 73     ** more terms
26490 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
264a0 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d  .        pNext =
264b0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
264c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
264d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
264e0 20 20 20 2f 2a 20 70 54 65 6d 70 6c 61 74 65 20     /* pTemplate 
264f0 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a  is not helpful..
26500 20 20 20 20 20 20 20 20 2a 2a 20 52 65 74 75 72          ** Retur
26510 6e 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  n without changi
26520 6e 67 20 6f 72 20 61 64 64 69 6e 67 20 61 6e 79  ng or adding any
26530 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  thing */.       
26540 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49   goto whereLoopI
26550 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20  nsert_noop;.    
26560 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
26570 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
26580 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
26590 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
265a0 65 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e  ereq.     && p->
265b0 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  rRun>=pTemplate-
265c0 3e 72 52 75 6e 0a 20 20 20 20 20 26 26 20 41 4c  >rRun.     && AL
265d0 57 41 59 53 28 70 2d 3e 72 53 65 74 75 70 3e 3d  WAYS(p->rSetup>=
265e0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
265f0 70 29 20 2f 2a 20 53 65 65 20 53 45 54 55 50 2d  p) /* See SETUP-
26600 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20  INVARIANT above 
26610 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
26620 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20  /* Overwrite an 
26630 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
26640 6f 70 20 77 69 74 68 20 61 20 62 65 74 74 65 72  op with a better
26650 20 6f 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20 69   one: one that i
26660 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  s.      ** bette
26670 72 20 61 74 20 6f 6e 65 20 6f 66 20 28 31 29 20  r at one of (1) 
26680 64 65 70 65 6e 64 65 6e 63 65 73 2c 20 28 32 29  dependences, (2)
26690 20 73 65 74 75 70 2d 63 6f 73 74 2c 20 6f 72 20   setup-cost, or 
266a0 28 33 29 20 72 75 6e 2d 63 6f 73 74 0a 20 20 20  (3) run-cost.   
266b0 20 20 20 2a 2a 20 61 6e 64 20 69 73 20 6e 6f 20     ** and is no 
266c0 77 6f 72 73 65 20 69 6e 20 61 6e 79 20 6f 66 20  worse in any of 
266d0 74 68 6f 73 65 20 63 61 74 65 67 6f 72 69 65 73  those categories
266e0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74  . */.      pNext
266f0 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
26700 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26710 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
26720 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
26730 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
26740 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
26750 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
26760 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
26770 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
26780 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
26790 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
267a0 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
267b0 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
267c0 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
267d0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
267e0 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
267f0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
26800 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
26810 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
26820 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26830 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20  ins-del:  ");.  
26840 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
26850 6e 74 28 70 2c 20 70 57 49 6e 66 6f 2d 3e 70 54  nt(p, pWInfo->pT
26860 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  abList);.    }. 
26870 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
26880 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20  rintf("ins-new: 
26890 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f   ");.    whereLo
268a0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
268b0 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  e, pWInfo->pTabL
268c0 69 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ist);.  }.#endif
268d0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
268e0 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
268f0 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
26900 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
26910 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
26920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
26930 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c  OMEM;.    whereL
26940 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a  oopInit(p);.  }.
26950 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28    whereLoopXfer(
26960 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65  db, p, pTemplate
26970 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  );.  p->pNextLoo
26980 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70  p = pNext;.  *pp
26990 50 72 65 76 20 3d 20 70 3b 0a 20 20 69 66 28 20  Prev = p;.  if( 
269a0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
269b0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
269c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65  )==0 ){.    Inde
269d0 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75  x *pIndex = p->u
269e0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
269f0 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26     if( pIndex &&
26a00 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30   pIndex->tnum==0
26a10 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62   ){.      p->u.b
26a20 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
26a30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
26a40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
26a50 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
26a60 66 20 74 68 65 20 69 6e 73 65 72 74 20 69 73 20  f the insert is 
26a70 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65  a no-op */.where
26a80 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a  LoopInsert_noop:
26a90 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
26aa0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
26ab0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
26ac0 26 20 30 78 38 20 29 7b 0a 20 20 20 20 73 71 6c  & 0x8 ){.    sql
26ad0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26ae0 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20  pBuilder->pBest 
26af0 3f 20 22 69 6e 73 2d 73 6b 69 70 3a 20 22 20 3a  ? "ins-skip: " :
26b00 20 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a   "ins-noop: ");.
26b10 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
26b20 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57  nt(pTemplate, pW
26b30 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b  Info->pTabList);
26b40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
26b50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
26b60 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61   .}../*.** We ha
26b70 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65  ve so far matche
26b80 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  d pBuilder->pNew
26b90 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65  ->u.btree.nEq te
26ba0 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
26bb0 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20   pIndex..** Try 
26bc0 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72  to match one mor
26bd0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  e..**.** If pPro
26be0 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
26bf0 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
26c00 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
26c10 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
26c20 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
26c30 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
26c40 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
26c50 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
26c60 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
26c70 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
26c80 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
26c90 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
26ca0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
26cb0 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
26cc0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
26cd0 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
26ce0 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
26cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d00 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
26d10 20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65   pSrc */.  Where
26d20 43 6f 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20  Cost nInMul     
26d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
26d40 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
26d50 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
26d60 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
26d70 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
26d80 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
26d90 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
26da0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
26db0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
26dc0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
26dd0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
26de0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
26df0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
26e00 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
26e10 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
26e20 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
26e30 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
26e40 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
26e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
26e60 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
26e70 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
26e80 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
26e90 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
26ea0 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
26eb0 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
26ec0 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
26ed0 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26ef0 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
26f00 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
26f10 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
26f20 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
26f30 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
26f40 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
26f50 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
26f60 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
26f70 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
26f80 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
26f90 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
26fa0 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
26fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26fc0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
26fd0 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
26fe0 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 5f   */.  int saved_
26ff0 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
27000 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
27010 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
27020 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
27030 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c    u32 saved_wsFl
27040 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
27050 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
27060 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46  lue of pNew->wsF
27070 6c 61 67 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  lags */.  WhereC
27080 6f 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20  ost saved_nOut; 
27090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
270a0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
270b0 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69  New->nOut */.  i
270c0 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
270d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
270e0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
270f0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
27100 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  le */.  int rc =
27110 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
27120 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
27130 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72  n code */.  Wher
27140 65 43 6f 73 74 20 6e 52 6f 77 45 73 74 3b 20 20  eCost nRowEst;  
27150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
27160 73 74 69 6d 61 74 65 64 20 69 6e 64 65 78 20 73  stimated index s
27170 65 6c 65 63 74 69 76 69 74 79 20 2a 2f 0a 20 20  electivity */.  
27180 57 68 65 72 65 43 6f 73 74 20 72 4c 6f 67 53 69  WhereCost rLogSi
27190 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
271a0 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
271b0 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20  table size */.  
271c0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20  WhereTerm *pTop 
271d0 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20  = 0, *pBtm = 0; 
271e0 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f  /* Top and botto
271f0 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  m range constrai
27200 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d  nts */..  pNew =
27210 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
27220 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
27230 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
27240 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
27250 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
27260 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27270 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
27280 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
27290 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
272a0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
272b0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ==0 );.  if( pNe
272c0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
272d0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
272e0 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
272f0 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
27300 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e  e if( pProbe->tn
27310 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e  um<=0 || (pSrc->
27320 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
27330 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70  FT)!=0 ){.    op
27340 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
27350 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  IN|WO_GT|WO_GE|W
27360 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65  O_LT|WO_LE;.  }e
27370 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  lse{.    opMask 
27380 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
27390 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f  _ISNULL|WO_GT|WO
273a0 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
273b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62  .  }.  if( pProb
273c0 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  e->bUnordered ) 
273d0 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47  opMask &= ~(WO_G
273e0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
273f0 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  _LE);..  assert(
27400 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
27410 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq<=pProbe->nCol
27420 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  umn );.  if( pNe
27430 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3c  w->u.btree.nEq <
27440 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e   pProbe->nColumn
27450 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
27460 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
27470 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
27480 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  q];.    nRowEst 
27490 3d 20 77 68 65 72 65 43 6f 73 74 28 70 50 72 6f  = whereCost(pPro
274a0 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65  be->aiRowEst[pNe
274b0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 31  w->u.btree.nEq+1
274c0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77  ]);.    if( nRow
274d0 45 73 74 3d 3d 30 20 26 26 20 70 50 72 6f 62 65  Est==0 && pProbe
274e0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
274f0 6e 65 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 31  ne ) nRowEst = 1
27500 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
27510 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 52  Col = -1;.    nR
27520 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  owEst = 0;.  }. 
27530 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
27540 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42  anInit(&scan, pB
27550 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72  uilder->pWC, pSr
27560 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c  c->iCursor, iCol
27570 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27580 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b            opMask
27590 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76  , pProbe);.  sav
275a0 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75  ed_nEq = pNew->u
275b0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61  .btree.nEq;.  sa
275c0 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
275d0 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
275e0 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
275f0 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
27600 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
27610 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
27620 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
27630 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  nOut;.  pNew->rS
27640 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67  etup = 0;.  rLog
27650 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 77 68  Size = estLog(wh
27660 65 72 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e  ereCost(pProbe->
27670 61 69 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 20  aiRowEst[0]));. 
27680 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
27690 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30  E_OK && pTerm!=0
276a0 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53  ; pTerm = whereS
276b0 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b  canNext(&scan)){
276c0 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30  .    int nIn = 0
276d0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
276e0 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
276f0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
27700 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 4e  continue;.    pN
27710 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
27720 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20  ved_wsFlags;.   
27730 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
27740 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
27750 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
27760 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
27770 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f  .    if( whereLo
27780 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
27790 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  w, pNew->nLTerm+
277a0 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f  1) ) break; /* O
277b0 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  OM */.    pNew->
277c0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
277d0 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm++] = pTerm;.
277e0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
277f0 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65 71   = (saved_prereq
27800 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
27810 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e  Right) & ~pNew->
27820 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4e  maskSelf;.    pN
27830 65 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53  ew->rRun = rLogS
27840 69 7a 65 3b 20 2f 2a 20 42 61 73 65 6c 69 6e 65  ize; /* Baseline
27850 20 63 6f 73 74 20 69 73 20 6c 6f 67 32 28 4e 29   cost is log2(N)
27860 2e 20 20 41 64 6a 75 73 74 6d 65 6e 74 73 20 62  .  Adjustments b
27870 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66 28 20  elow */.    if( 
27880 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
27890 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
278a0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
278b0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
278c0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
278d0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
278e0 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  N_IN;.      if( 
278f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
27900 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
27910 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
27920 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
27930 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a   ...)":  TUNING:
27940 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
27950 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
27960 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b         nIn = 46;
27970 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77 68    assert( 46==wh
27980 65 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a 20  ereCost(25) );. 
27990 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
279a0 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
279b0 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
279c0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
279d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
279e0 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
279f0 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
27a00 20 20 20 6e 49 6e 20 3d 20 77 68 65 72 65 43 6f     nIn = whereCo
27a10 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  st(pExpr->x.pLis
27a20 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
27a30 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72   }.      pNew->r
27a40 52 75 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20  Run += nIn;.    
27a50 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
27a60 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65  nEq++;.      pNe
27a70 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73  w->nOut = nRowEs
27a80 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e  t + nInMul + nIn
27a90 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
27aa0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
27ab0 20 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20   & (WO_EQ) ){.  
27ac0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4e 65      assert( (pNe
27ad0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  w->wsFlags & (WH
27ae0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c  ERE_COLUMN_NULL|
27af0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
27b00 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
27b10 20 20 20 20 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c         || nInMul
27b20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
27b30 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
27b40 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
27b50 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
27b60 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72   .       || (pPr
27b70 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  obe->onError!=OE
27b80 5f 4e 6f 6e 65 20 26 26 20 6e 49 6e 4d 75 6c 3d  _None && nInMul=
27b90 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
27ba0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
27bb0 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq==pProbe->nCol
27bc0 75 6d 6e 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a  umn-1).      ){.
27bd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27be0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
27bf0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
27c00 29 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30 20 29  )==0 || iCol<0 )
27c10 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
27c20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
27c30 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d  _ONEROW;.      }
27c40 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
27c50 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
27c60 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
27c70 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b  RowEst + nInMul;
27c80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
27c90 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27ca0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b  & (WO_ISNULL) ){
27cb0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
27cc0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
27cd0 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  LUMN_NULL;.     
27ce0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
27cf0 45 71 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 54  Eq++;.      /* T
27d00 55 4e 49 4e 47 3a 20 49 53 20 4e 55 4c 4c 20 73  UNING: IS NULL s
27d10 65 6c 65 63 74 73 20 32 20 72 6f 77 73 20 2a 2f  elects 2 rows */
27d20 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 31 30 3b  .      nIn = 10;
27d30 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 77 68    assert( 10==wh
27d40 65 72 65 43 6f 73 74 28 32 29 20 29 3b 0a 20 20  ereCost(2) );.  
27d50 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
27d60 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75   nRowEst + nInMu
27d70 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c  l + nIn;.    }el
27d80 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f  se if( pTerm->eO
27d90 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54  perator & (WO_GT
27da0 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20  |WO_GE) ){.     
27db0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
27dc0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
27dd0 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
27de0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
27df0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20  perator & WO_GE 
27e00 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
27e10 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
27e20 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
27e30 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
27e40 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d      pBtm = pTerm
27e50 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30  ;.      pTop = 0
27e60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27e70 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
27e80 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
27e90 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20  O_LT|WO_LE) );. 
27ea0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
27eb0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27ec0 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20  & WO_LT );.     
27ed0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
27ee0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
27ef0 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  _LE );.      pNe
27f00 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
27f10 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
27f20 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
27f30 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70  ;.      pTop = p
27f40 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d  Term;.      pBtm
27f50 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67   = (pNew->wsFlag
27f60 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
27f70 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  MIT)!=0 ?.      
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
27f90 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
27fa0 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b  ->nLTerm-2] : 0;
27fb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
27fc0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
27fd0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
27fe0 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  E ){.      /* Ad
27ff0 6a 75 73 74 20 6e 4f 75 74 20 61 6e 64 20 72 52  just nOut and rR
28000 75 6e 20 66 6f 72 20 53 54 41 54 33 20 72 61 6e  un for STAT3 ran
28010 67 65 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20  ge values */.   
28020 20 20 20 57 68 65 72 65 43 6f 73 74 20 72 44 69     WhereCost rDi
28030 76 3b 0a 20 20 20 20 20 20 77 68 65 72 65 52 61  v;.      whereRa
28040 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73  ngeScanEst(pPars
28050 65 2c 20 70 50 72 6f 62 65 2c 20 70 4e 65 77 2d  e, pProbe, pNew-
28060 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2c 0a 20 20  >u.btree.nEq,.  
28070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28080 20 20 20 20 20 20 70 42 74 6d 2c 20 70 54 6f 70        pBtm, pTop
28090 2c 20 26 72 44 69 76 29 3b 0a 20 20 20 20 20 20  , &rDiv);.      
280a0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
280b0 65 64 5f 6e 4f 75 74 3e 72 44 69 76 2b 31 30 20  ed_nOut>rDiv+10 
280c0 3f 20 73 61 76 65 64 5f 6e 4f 75 74 20 2d 20 72  ? saved_nOut - r
280d0 44 69 76 20 3a 20 31 30 3b 0a 20 20 20 20 7d 0a  Div : 10;.    }.
280e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
280f0 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 69  ABLE_STAT3.    i
28100 66 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  f( pNew->u.btree
28110 2e 6e 45 71 3d 3d 31 20 26 26 20 70 50 72 6f 62  .nEq==1 && pProb
28120 65 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20  e->nSample ){.  
28130 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74      tRowcnt nOut
28140 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
28150 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
28160 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
28170 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20  NULL))!=0 ){.   
28180 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
28190 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
281a0 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
281b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
281c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
281d0 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
281e0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45       rc = whereE
281f0 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
28200 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 54 65 72  se, pProbe, pTer
28210 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
28220 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
28230 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
28240 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
28250 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20 20 20  _IN).           
28260 20 20 26 26 20 20 21 45 78 70 72 48 61 73 50 72    &&  !ExprHasPr
28270 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
28280 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
28290 74 29 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72  t)  ){.        r
282a0 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45  c = whereInScanE
282b0 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62  st(pParse, pProb
282c0 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e, pTerm->pExpr-
282d0 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29  >x.pList, &nOut)
282e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
282f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28300 4b 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  K ) pNew->nOut =
28310 20 77 68 65 72 65 43 6f 73 74 28 6e 4f 75 74 29   whereCost(nOut)
28320 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
28330 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73     if( (pNew->ws
28340 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
28350 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50  DX_ONLY|WHERE_IP
28360 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  K))==0 ){.      
28370 2f 2a 20 45 61 63 68 20 72 6f 77 20 69 6e 76 6f  /* Each row invo
28380 6c 76 65 73 20 61 20 73 74 65 70 20 6f 66 20 74  lves a step of t
28390 68 65 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 61  he index, then a
283a0 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f   binary search o
283b0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d  f.      ** the m
283c0 61 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ain table */.   
283d0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
283e0 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 70 4e   whereCostAdd(pN
283f0 65 77 2d 3e 72 52 75 6e 2c 20 72 4c 6f 67 53 69  ew->rRun, rLogSi
28400 7a 65 3e 32 37 20 3f 20 72 4c 6f 67 53 69 7a 65  ze>27 ? rLogSize
28410 2d 31 37 20 3a 20 31 30 29 3b 0a 20 20 20 20 7d  -17 : 10);.    }
28420 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 63 6f 73  .    /* Step cos
28430 74 20 66 6f 72 20 65 61 63 68 20 6f 75 74 70 75  t for each outpu
28440 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 70 4e 65  t row */.    pNe
28450 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43  w->rRun = whereC
28460 6f 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  ostAdd(pNew->rRu
28470 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a  n, pNew->nOut);.
28480 20 20 20 20 2f 2a 20 54 42 44 3a 20 41 64 6a 75      /* TBD: Adju
28490 73 74 20 6e 4f 75 74 20 66 6f 72 20 61 64 64 69  st nOut for addi
284a0 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e  tional constrain
284b0 74 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77  ts */.    rc = w
284c0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
284d0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
284e0 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
284f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
28500 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20  OP_LIMIT)==0.   
28510 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
28520 65 65 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e  ee.nEq<(pProbe->
28530 6e 43 6f 6c 75 6d 6e 20 2b 20 28 70 50 72 6f 62  nColumn + (pProb
28540 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20  e->zName!=0)).  
28550 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65    ){.      where
28560 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
28570 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
28580 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c  , pProbe, nInMul
28590 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  +nIn);.    }.  }
285a0 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
285b0 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
285c0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
285d0 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
285e0 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
285f0 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
28600 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  ;.  pNew->nOut =
28610 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70   saved_nOut;.  p
28620 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61  New->nLTerm = sa
28630 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65  ved_nLTerm;.  re
28640 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28650 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66  * Return True if
28660 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
28670 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68  that pIndex migh
28680 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a  t be useful in.*
28690 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  * implementing t
286a0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
286b0 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a  se in pBuilder..
286c0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c  **.** Return Fal
286d0 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64  se if pBuilder d
286e0 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
286f0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
28700 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72  se or.** if ther
28710 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20  e is no way for 
28720 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65  pIndex to be use
28730 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74  ful in implement
28740 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45  ing that.** ORDE
28750 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  R BY clause..*/.
28760 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78  static int index
28770 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
28780 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f  erBy(.  WhereLoo
28790 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
287a0 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  er,.  Index *pIn
287b0 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73  dex,.  int iCurs
287c0 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  or.){.  ExprList
287d0 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c   *pOB;.  int ii,
287e0 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64   jj;..  if( pInd
287f0 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
28800 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
28810 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72   (pOB = pBuilder
28820 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ->pWInfo->pOrder
28830 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  By)==0 ) return 
28840 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
28850 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69  i<pOB->nExpr; ii
28860 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
28870 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
28880 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
28890 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  B->a[ii].pExpr);
288a0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
288b0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
288c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
288d0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
288e0 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
288f0 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70    for(jj=0; jj<p
28900 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
28910 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  jj++){.        i
28920 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
28930 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  n==pIndex->aiCol
28940 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e  umn[jj] ) return
28950 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
28960 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
28970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
28980 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72  n a bitmask wher
28990 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68  e 1s indicate th
289a0 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  at the correspon
289b0 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  ding column of.*
289c0 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75  * the table is u
289d0 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e  sed by an index.
289e0 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
289f0 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20   63 columns are 
28a00 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73  considered..*/.s
28a10 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
28a20 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64  lumnsInIndex(Ind
28a30 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
28a40 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
28a50 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64  t j;.  for(j=pId
28a60 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e  x->nColumn-1; j>
28a70 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; j--){.    in
28a80 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
28a90 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 74 65 73  lumn[j];.    tes
28aa0 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20  tcase( x==BMS-1 
28ab0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
28ac0 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20   x==BMS-2 );.   
28ad0 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d   if( x<BMS-1 ) m
28ae0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a   |= MASKBIT(x);.
28af0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a    }.  return m;.
28b00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  }.../*.** Add al
28b10 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
28b20 63 74 73 20 61 20 73 69 6e 67 6c 65 20 74 61 62  cts a single tab
28b30 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77  le of the join w
28b40 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  ere the table.**
28b50 20 69 73 20 69 64 65 6e 66 69 65 64 20 62 79 20   is idenfied by 
28b60 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
28b70 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c  iTab.  That tabl
28b80 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
28b90 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65  to be.** a b-tre
28ba0 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76  e table, not a v
28bb0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
28bc0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
28bd0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20  eLoopAddBtree(. 
28be0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
28bf0 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20  r *pBuilder, /* 
28c00 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
28c10 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  ormation */.  Bi
28c20 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20  tmask mExtra    
28c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
28c40 72 61 20 70 72 65 72 65 71 75 65 73 69 74 65 73  ra prerequesites
28c50 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20   for using this 
28c60 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68  table */.){.  Wh
28c70 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
28c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
28c90 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
28ca0 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
28cb0 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
28cc0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
28cd0 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
28ce0 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50  ng */.  Index sP
28cf0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
28d00 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e      /* A fake in
28d10 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  dex object for t
28d20 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a  he primary key *
28d30 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 69 52 6f  /.  tRowcnt aiRo
28d40 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20  wEstPk[2];      
28d50 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74 5b  /* The aiRowEst[
28d60 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
28d70 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  sPk index */.  i
28d80 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20  nt aiColumnPk = 
28d90 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  -1;        /* Th
28da0 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75  e aColumn[] valu
28db0 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
28dc0 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  dex */.  SrcList
28dd0 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
28de0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
28df0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
28e00 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
28e10 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20   *pSrc;  /* The 
28e20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65  FROM clause btre
28e30 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f  e term to add */
28e40 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
28e50 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
28e60 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65  * Template Where
28e70 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
28e80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28e90 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
28ea0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
28eb0 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20   int iSortIdx = 
28ec0 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
28ed0 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  Index number */.
28ee0 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20    int b;        
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28f00 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   A boolean value
28f10 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
28f20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
28f30 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    /* number of r
28f40 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
28f50 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
28f60 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
28f70 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f    /* Logarithm o
28f80 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
28f90 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
28fa0 65 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d  e */.  .  pNew =
28fb0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
28fc0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
28fd0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
28fe0 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
28ff0 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70  o->pTabList;.  p
29000 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Src = pTabList->
29010 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
29020 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72    assert( !IsVir
29030 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
29040 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d   );..  if( pSrc-
29050 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f  >pIndex ){.    /
29060 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * An INDEXED BY 
29070 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
29080 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
29090 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  dex to use */.  
290a0 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
290b0 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65  >pIndex;.  }else
290c0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69  {.    /* There i
290d0 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20  s no INDEXED BY 
290e0 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20  clause.  Create 
290f0 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a  a fake Index obj
29100 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20  ect in local.   
29110 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b   ** variable sPk
29120 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68   to represent th
29130 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20  e rowid primary 
29140 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  key index.  Make
29150 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b   this.    ** fak
29160 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73  e index the firs
29170 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20  t in a chain of 
29180 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69  Index objects wi
29190 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65  th all of the re
291a0 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  al.    ** indice
291b0 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20  s to follow */. 
291c0 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74     Index *pFirst
291d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
291e0 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72     /* First of r
291f0 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74  eal indices on t
29200 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
29210 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20  memset(&sPk, 0, 
29220 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
29230 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
29240 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
29250 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
29260 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
29270 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74  owEst = aiRowEst
29280 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72  Pk;.    sPk.onEr
29290 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65  ror = OE_Replace
292a0 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65  ;.    sPk.pTable
292b0 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
292c0 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
292d0 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e   = pSrc->pTab->n
292e0 52 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f  RowEst;.    aiRo
292f0 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20  wEstPk[1] = 1;. 
29300 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63     pFirst = pSrc
29310 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
29320 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f      if( pSrc->no
29330 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20  tIndexed==0 ){. 
29340 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c       /* The real
29350 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20   indices of the 
29360 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63  table are only c
29370 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65  onsidered if the
29380 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e  .      ** NOT IN
29390 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20  DEXED qualifier 
293a0 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
293b0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
293c0 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65  */.      sPk.pNe
293d0 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
293e0 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20   }.    pProbe = 
293f0 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a  &sPk;.  }.  rSiz
29400 65 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70 53  e = whereCost(pS
29410 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73  rc->pTab->nRowEs
29420 74 29 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  t);.  rLogSize =
29430 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
29440 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20  .  /* Automatic 
29450 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28  indexes */.  if(
29460 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73   !pBuilder->pBes
29470 74 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  t.   && (pWInfo-
29480 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  >pParse->db->fla
29490 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f  gs & SQLITE_Auto
294a0 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20  Index)!=0.   && 
294b0 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pSrc->pIndex==0.
294c0 20 20 20 26 26 20 21 70 53 72 63 2d 3e 76 69 61     && !pSrc->via
294d0 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20 26 26 20  Coroutine.   && 
294e0 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65  !pSrc->notIndexe
294f0 64 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69  d.   && !pSrc->i
29500 73 43 6f 72 72 65 6c 61 74 65 64 0a 20 20 29 7b  sCorrelated.  ){
29510 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
29520 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72   auto-index Wher
29530 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68  eLoops */.    Wh
29540 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d  ereClause *pWC =
29550 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
29560 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
29570 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54  Term;.    WhereT
29580 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57  erm *pWCEnd = pW
29590 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
295a0 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  m;.    for(pTerm
295b0 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c  =pWC->a; rc==SQL
295c0 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c  ITE_OK && pTerm<
295d0 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
295e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
295f0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
29600 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
29610 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
29620 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
29630 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
29640 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Src, 0) ){.     
29650 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
29660 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  .nEq = 1;.      
29670 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
29680 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
29690 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
296a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
296b0 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  ew->aLTerm[0] = 
296c0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f  pTerm;.        /
296d0 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69  * TUNING: One-ti
296e0 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70  me cost for comp
296f0 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61  uting the automa
29700 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20  tic index is.   
29710 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 78 69 6d       ** approxim
29720 61 74 65 6c 79 20 36 2a 4e 2a 6c 6f 67 32 28 4e  ately 6*N*log2(N
29730 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  ) where N is the
29740 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
29750 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  in.        ** th
29760 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e  e table being in
29770 64 65 78 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  dexed. */.      
29780 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
29790 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a   rLogSize + rSiz
297a0 65 20 2b 20 32 36 3b 20 20 61 73 73 65 72 74 28  e + 26;  assert(
297b0 20 32 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 36   26==whereCost(6
297c0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) );.        /* 
297d0 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64  TUNING: Each ind
297e0 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73  ex lookup yields
297f0 20 31 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20   10 rows in the 
29800 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
29810 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 33 33   pNew->nOut = 33
29820 3b 20 20 61 73 73 65 72 74 28 20 33 33 3d 3d 77  ;  assert( 33==w
29830 68 65 72 65 43 6f 73 74 28 31 30 29 20 29 3b 0a  hereCost(10) );.
29840 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
29850 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64  un = whereCostAd
29860 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d  d(rLogSize,pNew-
29870 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  >nOut);.        
29880 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
29890 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
298a0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
298b0 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20  prereq = mExtra 
298c0 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  | pTerm->prereqR
298d0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63  ight;.        rc
298e0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
298f0 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
29900 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
29910 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  }.  }..  /* Loop
29920 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65   over all indice
29930 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72  s.  */.  for(; r
29940 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29950 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70  pProbe; pProbe=p
29960 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53  Probe->pNext, iS
29970 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 70  ortIdx++){.    p
29980 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
29990 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
299a0 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  nLTerm = 0;.    
299b0 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
299c0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53   0;.    pNew->rS
299d0 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  etup = 0;.    pN
299e0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
299f0 74 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  tra;.    pNew->u
29a00 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
29a10 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20  pProbe;.    b = 
29a20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
29a30 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64  thOrderBy(pBuild
29a40 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63  er, pProbe, pSrc
29a50 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
29a60 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44  /* The ONEPASS_D
29a70 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76  ESIRED flags nev
29a80 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68  er occurs togeth
29a90 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59  er with ORDER BY
29aa0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
29ab0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
29ac0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
29ad0 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
29ae0 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  || b==0 );.    i
29af0 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
29b00 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
29b10 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
29b20 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ey index */.    
29b30 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
29b40 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20  = WHERE_IPK;..  
29b50 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c      /* Full tabl
29b60 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  e scan */.      
29b70 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
29b80 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
29b90 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  0;.      pNew->n
29ba0 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
29bb0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
29bc0 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65  st of full table
29bd0 20 73 63 61 6e 20 69 73 20 33 2a 28 4e 20 2b 20   scan is 3*(N + 
29be0 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20 20 20  log2(N))..      
29bf0 2a 2a 20 20 2b 20 20 54 68 65 20 65 78 74 72 61  **  +  The extra
29c00 20 33 20 66 61 63 74 6f 72 20 69 73 20 74 6f 20   3 factor is to 
29c10 65 6e 63 6f 75 72 61 67 65 20 74 68 65 20 75 73  encourage the us
29c20 65 20 6f 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f  e of indexed loo
29c30 6b 75 70 73 0a 20 20 20 20 20 20 2a 2a 20 20 20  kups.      **   
29c40 20 20 6f 76 65 72 20 66 75 6c 6c 20 73 63 61 6e    over full scan
29c50 73 2e 20 20 41 20 73 6d 61 6c 6c 65 72 20 63 6f  s.  A smaller co
29c60 6e 73 74 61 6e 74 20 32 20 69 73 20 75 73 65 64  nstant 2 is used
29c70 20 66 6f 72 20 63 6f 76 65 72 69 6e 67 0a 20 20   for covering.  
29c80 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
29c90 20 73 63 61 6e 73 20 73 6f 20 74 68 61 74 20 61   scans so that a
29ca0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
29cb0 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 66 61 76  scan will be fav
29cc0 6f 72 65 64 20 6f 76 65 72 0a 20 20 20 20 20 20  ored over.      
29cd0 2a 2a 20 20 20 20 20 61 20 74 61 62 6c 65 20 73  **     a table s
29ce0 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  can. */.      pN
29cf0 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65 72 65  ew->rRun = where
29d00 43 6f 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c  CostAdd(rSize,rL
29d10 6f 67 53 69 7a 65 29 20 2b 20 31 36 3b 0a 20 20  ogSize) + 16;.  
29d20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
29d30 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
29d40 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
29d50 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
29d60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29d70 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72   Bitmask m = pSr
29d80 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f  c->colUsed & ~co
29d90 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72  lumnsInIndex(pPr
29da0 6f 62 65 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  obe);.      pNew
29db0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d  ->wsFlags = (m==
29dc0 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f  0) ? (WHERE_IDX_
29dd0 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58  ONLY|WHERE_INDEX
29de0 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45  ED) : WHERE_INDE
29df0 58 45 44 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46  XED;..      /* F
29e00 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64  ull scan via ind
29e10 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
29e20 62 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d  b.       || ( m=
29e30 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =0.         && p
29e40 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
29e50 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  d==0.         &&
29e60 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
29e70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
29e80 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
29e90 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
29ea0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
29eb0 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20 20  .bUseCis.       
29ec0 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
29ed0 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d  nEnabled(pWInfo-
29ee0 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  >pParse->db, SQL
29ef0 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e  ITE_CoverIdxScan
29f00 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20 20  ).          ).  
29f10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
29f20 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
29f30 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
29f40 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
29f50 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
29f60 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29        if( m==0 )
29f70 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
29f80 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
29f90 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
29fa0 73 63 61 6e 20 69 73 20 32 2a 28 4e 20 2b 20 6c  scan is 2*(N + l
29fb0 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20 20 20 20  og2(N))..       
29fc0 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20 65 78     **  +  The ex
29fd0 74 72 61 20 32 20 66 61 63 74 6f 72 20 69 73 20  tra 2 factor is 
29fe0 74 6f 20 65 6e 63 6f 75 72 61 67 65 20 74 68 65  to encourage the
29ff0 20 75 73 65 20 6f 66 20 69 6e 64 65 78 65 64 20   use of indexed 
2a000 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20 20 20 20  lookups.        
2a010 20 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 69 6e    **     over in
2a020 64 65 78 20 73 63 61 6e 73 2e 20 20 41 20 74 61  dex scans.  A ta
2a030 62 6c 65 20 73 63 61 6e 20 75 73 65 73 20 61 20  ble scan uses a 
2a040 66 61 63 74 6f 72 20 6f 66 20 33 20 73 6f 20 74  factor of 3 so t
2a050 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
2a060 20 20 20 20 20 69 6e 64 65 78 20 73 63 61 6e 73       index scans
2a070 20 61 72 65 20 66 61 76 6f 72 65 64 20 6f 76 65   are favored ove
2a080 72 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 0a 20  r table scans.. 
2a090 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 20           **  +  
2a0a0 49 66 20 74 68 69 73 20 63 6f 76 65 72 69 6e 67  If this covering
2a0b0 20 69 6e 64 65 78 20 6d 69 67 68 74 20 61 6c 73   index might als
2a0c0 6f 20 68 65 6c 70 20 73 61 74 69 73 66 79 20 74  o help satisfy t
2a0d0 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20  he ORDER BY.    
2a0e0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 63 6c 61        **     cla
2a0f0 75 73 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  use, then the co
2a100 73 74 20 69 73 20 66 75 64 67 65 64 20 64 6f 77  st is fudged dow
2a110 6e 20 73 6c 69 67 68 74 6c 79 20 73 6f 20 74 68  n slightly so th
2a120 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  at this.        
2a130 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 69    **     index i
2a140 73 20 66 61 76 6f 72 65 64 20 61 62 6f 76 65 20  s favored above 
2a150 6f 74 68 65 72 20 69 6e 64 69 63 65 73 20 74 68  other indices th
2a160 61 74 20 68 61 76 65 20 6e 6f 20 68 6f 70 65 20  at have no hope 
2a170 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  of.          ** 
2a180 20 20 20 20 68 65 6c 70 69 6e 67 20 77 69 74 68      helping with
2a190 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 20 2a   the ORDER BY. *
2a1a0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  /.          pNew
2a1b0 2d 3e 72 52 75 6e 20 3d 20 31 30 20 2b 20 77 68  ->rRun = 10 + wh
2a1c0 65 72 65 43 6f 73 74 41 64 64 28 72 53 69 7a 65  ereCostAdd(rSize
2a1d0 2c 72 4c 6f 67 53 69 7a 65 29 20 2d 20 62 3b 0a  ,rLogSize) - b;.
2a1e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2a1f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2a200 20 62 21 3d 30 20 29 3b 20 0a 20 20 20 20 20 20   b!=0 ); .      
2a210 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
2a220 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20  ost of scanning 
2a230 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
2a240 6e 64 65 78 20 69 73 20 28 4e 2b 31 29 2a 6c 6f  ndex is (N+1)*lo
2a250 67 32 28 4e 29 0a 20 20 20 20 20 20 20 20 20 20  g2(N).          
2a260 2a 2a 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c  ** which we will
2a270 20 73 69 6d 70 6c 69 66 79 20 74 6f 20 6a 75 73   simplify to jus
2a280 74 20 4e 2a 6c 6f 67 32 28 4e 29 20 2a 2f 0a 20  t N*log2(N) */. 
2a290 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
2a2a0 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 72 4c  Run = rSize + rL
2a2b0 6f 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ogSize;.        
2a2c0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  }.        rc = w
2a2d0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2a2e0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2a2f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2a300 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2a310 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 77      }.    rc = w
2a320 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
2a330 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20  Index(pBuilder, 
2a340 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29  pSrc, pProbe, 0)
2a350 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2a360 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
2a370 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
2a380 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20  n only that one 
2a390 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20  index is.    ** 
2a3a0 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20  considered. */. 
2a3b0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e     if( pSrc->pIn
2a3c0 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  dex ) break;.  }
2a3d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a3e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2a3f0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2a400 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  E./*.** Add all 
2a410 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
2a420 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66  s for a table of
2a430 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69   the join identi
2a440 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c  fied by.** pBuil
2a450 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
2a460 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
2a470 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2a480 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
2a490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a4a0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
2a4b0 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ual(.  WhereLoop
2a4c0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
2a4d0 72 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  r   /* WHERE cla
2a4e0 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
2a4f0 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
2a500 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
2a510 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
2a520 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
2a530 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
2a540 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2a550 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
2a560 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
2a570 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
2a580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a590 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
2a5a0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2a5b0 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20  t_item *pSrc;   
2a5c0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
2a5d0 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
2a5e0 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  h */.  Table *pT
2a5f0 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ab;.  sqlite3 *d
2a600 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b;.  sqlite3_ind
2a610 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
2a620 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  o;.  struct sqli
2a630 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
2a640 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
2a650 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
2a660 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
2a670 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
2a680 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
2a690 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  erm;.  int i, j;
2a6a0 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78  .  int iTerm, mx
2a6b0 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e  Term;.  int nCon
2a6c0 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73  straint;.  int s
2a6d0 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20  eenIn = 0;      
2a6e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a6f0 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  if an IN operato
2a700 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  r is seen */.  i
2a710 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20  nt seenVar = 0; 
2a720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a730 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e  rue if a non-con
2a740 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  stant constraint
2a750 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
2a760 74 20 69 50 68 61 73 65 3b 20 20 20 20 20 20 20  t iPhase;       
2a770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
2a780 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31   const w/o IN, 1
2a790 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49  : const, 2: no I
2a7a0 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57  N,  2: IN */.  W
2a7b0 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
2a7c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a7d0 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20  E_OK;..  pWInfo 
2a7e0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
2a7f0 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  fo;.  pParse = p
2a800 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
2a810 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2a820 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64  ;.  pWC = pBuild
2a830 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20  er->pWC;.  pNew 
2a840 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2a850 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e  ;.  pSrc = &pWIn
2a860 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
2a870 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70  pNew->iTab];.  p
2a880 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  Tab = pSrc->pTab
2a890 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69  ;.  assert( IsVi
2a8a0 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20  rtual(pTab) );. 
2a8b0 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f   pIdxInfo = allo
2a8c0 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50  cateIndexInfo(pP
2a8d0 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c  arse, pWC, pSrc,
2a8e0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65   pBuilder->pOrde
2a8f0 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78  rBy);.  if( pIdx
2a900 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
2a910 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2a920 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
2a930 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  0;.  pNew->rSetu
2a940 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77  p = 0;.  pNew->w
2a950 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56  sFlags = WHERE_V
2a960 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70  IRTUALTABLE;.  p
2a970 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
2a980 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
2a990 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
2a9a0 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
2a9b0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
2a9c0 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69  age;.  nConstrai
2a9d0 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt = pIdxInfo->n
2a9e0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66  Constraint;.  if
2a9f0 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
2aa00 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e  e(db, pNew, nCon
2aa10 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20  straint) ){.    
2aa20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2aa30 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20  , pIdxInfo);.   
2aa40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2aa50 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  OMEM;.  }..  for
2aa60 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73  (iPhase=0; iPhas
2aa70 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b  e<=3; iPhase++){
2aa80 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e  .    if( !seenIn
2aa90 20 26 26 20 28 69 50 68 61 73 65 26 31 29 21 3d   && (iPhase&1)!=
2aaa0 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73  0 ){.      iPhas
2aab0 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e++;.      if( i
2aac0 50 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b  Phase>3 ) break;
2aad0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
2aae0 73 65 65 6e 56 61 72 20 26 26 20 69 50 68 61 73  seenVar && iPhas
2aaf0 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e>1 ) break;.   
2ab00 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
2ab10 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2ab20 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
2ab30 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
2ab40 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28  traint;.    for(
2ab50 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
2ab60 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
2ab70 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
2ab80 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f        j = pIdxCo
2ab90 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
2aba0 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
2abb0 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20  pWC->a[j];.     
2abc0 20 73 77 69 74 63 68 28 20 69 50 68 61 73 65 20   switch( iPhase 
2abd0 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
2abe0 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e  0:    /* Constan
2abf0 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70  ts without IN op
2ac00 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
2ac10 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
2ac20 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  able = 0;.      
2ac30 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2ac40 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
2ac50 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
2ac60 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b       seenIn = 1;
2ac70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ac80 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
2ac90 2d 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d 30  ->prereqRight!=0
2aca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2acb0 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20  seenVar = 1;.   
2acc0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2acd0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2ace0 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29  or & WO_IN)==0 )
2acf0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
2ad00 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2ad10 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
2ad20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2ad30 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a  .        case 1:
2ad40 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73      /* Constants
2ad50 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f   with IN operato
2ad60 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  rs */.          
2ad70 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29  assert( seenIn )
2ad80 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
2ad90 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
2ada0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2adb0 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ht==0);.        
2adc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2add0 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56   case 2:    /* V
2ade0 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74  ariables without
2adf0 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   IN */.         
2ae00 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72   assert( seenVar
2ae10 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
2ae20 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2ae30 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2ae40 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a  or & WO_IN)==0;.
2ae50 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2ae60 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
2ae70 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  :   /* Variables
2ae80 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20   with IN */.    
2ae90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
2aea0 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20  enVar && seenIn 
2aeb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
2aec0 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2aed0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
2aee0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2aef0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73  }.    memset(pUs
2af00 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
2af10 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e  Usage[0])*pIdxIn
2af20 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29  fo->nConstraint)
2af30 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e  ;.    if( pIdxIn
2af40 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2af50 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
2af60 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
2af70 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49  xStr);.    pIdxI
2af80 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b  nfo->idxStr = 0;
2af90 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
2afa0 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70  dxNum = 0;.    p
2afb0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2afc0 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
2afd0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
2afe0 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
2aff0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
2b000 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
2b010 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
2b020 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20   (double)2;.    
2b030 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64  rc = vtabBestInd
2b040 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ex(pParse, pTab,
2b050 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20   pIdxInfo);.    
2b060 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
2b070 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
2b080 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  xit;.    pIdxCon
2b090 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
2b0a0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
2b0b0 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
2b0c0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
2b0d0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2b0e0 20 3d 20 30 3b 0a 20 20 20 20 6d 78 54 65 72 6d   = 0;.    mxTerm
2b0f0 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
2b100 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
2b110 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a  =nConstraint );.
2b120 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2b130 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
2b140 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
2b150 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
2b160 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
2b170 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
2b180 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
2b190 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
2b1a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54  ){.      if( (iT
2b1b0 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
2b1c0 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
2b1d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
2b1e0 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
2b1f0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
2b200 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
2b210 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20  traint.         
2b220 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20  || j<0.         
2b230 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
2b240 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  .         || pNe
2b250 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
2b260 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
2b270 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2b280 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2b290 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2b2a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
2b2b0 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  s.xBestIndex() m
2b2c0 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61  alfunction", pTa
2b2d0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
2b2e0 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c       goto whereL
2b2f0 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
2b300 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b310 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
2b320 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
2b330 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
2b340 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20  tcase( j==0 );. 
2b350 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2b360 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31   j==pWC->nTerm-1
2b370 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72   );.        pTer
2b380 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
2b390 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
2b3a0 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  ereq |= pTerm->p
2b3b0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
2b3c0 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72      assert( iTer
2b3d0 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  m<pNew->nLSlot )
2b3e0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2b3f0 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
2b400 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
2b410 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20  f( iTerm>mxTerm 
2b420 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d  ) mxTerm = iTerm
2b430 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2b440 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
2b450 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2b460 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a  e( iTerm==16 );.
2b470 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
2b480 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69  m<16 && pUsage[i
2b490 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75  ].omit ) pNew->u
2b4a0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c  .vtab.omitMask |
2b4b0 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20  = 1<<iTerm;.    
2b4c0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2b4d0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
2b4e0 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
2b4f0 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d     if( pUsage[i]
2b500 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  .omit==0 ){.    
2b510 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2b520 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  t attempt to use
2b530 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
2b540 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c  t if the virtual
2b550 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
2b560 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20     ** says that 
2b570 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45  the equivalent E
2b580 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Q constraint can
2b590 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d  not be safely om
2b5a0 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  itted..         
2b5b0 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61     ** If we do a
2b5c0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75  ttempt to use su
2b5d0 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  ch a constraint,
2b5e0 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74   some rows might
2b5f0 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20 20   be.            
2b600 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20 74  ** repeated in t
2b610 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20  he output. */.  
2b620 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2b630 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b640 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
2b650 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
2b660 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
2b670 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
2b680 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20  y not.          
2b690 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f  ** consume the O
2b6a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62  RDER BY clause b
2b6b0 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f  ecause (1) the o
2b6c0 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73  rder of IN terms
2b6d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
2b6e0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
2b6f0 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
2b700 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
2b710 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
2b720 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69      ** (2) Multi
2b730 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d  ple outputs from
2b740 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c   a single IN val
2b750 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67  ue will not merg
2b760 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
2b770 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20  ogether.  */.   
2b780 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
2b790 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
2b7a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
2b7b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b7c0 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72    if( i>=nConstr
2b7d0 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e  aint ){.      pN
2b7e0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54  ew->nLTerm = mxT
2b7f0 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  erm+1;.      ass
2b800 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  ert( pNew->nLTer
2b810 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  m<=pNew->nLSlot 
2b820 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  );.      pNew->u
2b830 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70  .vtab.idxNum = p
2b840 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b  IdxInfo->idxNum;
2b850 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
2b860 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70  tab.needFree = p
2b870 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2b880 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20  reeIdxStr;.     
2b890 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
2b8a0 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
2b8b0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
2b8c0 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64  tab.idxStr = pId
2b8d0 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20  xInfo->idxStr;. 
2b8e0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2b8f0 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 75  b.isOrdered = (u
2b900 38 29 28 28 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  8)((pIdxInfo->nO
2b910 72 64 65 72 42 79 21 3d 30 29 0a 20 20 20 20 20  rderBy!=0).     
2b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b940 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  && pIdxInfo->ord
2b950 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20  erByConsumed);. 
2b960 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
2b970 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
2b980 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43  w->rRun = whereC
2b990 6f 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49  ostFromDouble(pI
2b9a0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
2b9b0 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 2f 2a  dCost);.      /*
2b9c0 20 54 55 4e 49 4e 47 3a 20 45 76 65 72 79 20 76   TUNING: Every v
2b9d0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 71 75 65  irtual table que
2b9e0 72 79 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f  ry returns 25 ro
2b9f0 77 73 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ws */.      pNew
2ba00 2d 3e 6e 4f 75 74 20 3d 20 34 36 3b 20 20 61 73  ->nOut = 46;  as
2ba10 73 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43  sert( 46==whereC
2ba20 6f 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20  ost(25) );.     
2ba30 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
2ba40 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
2ba50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
2ba60 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2ba70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
2ba80 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
2ba90 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
2baa0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
2bab0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
2bac0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
2bad0 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f  .  }  ..whereLoo
2bae0 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a 20  pAddVtab_exit:. 
2baf0 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
2bb00 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
2bb10 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
2bb20 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
2bb30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2bb40 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  e(db, pIdxInfo);
2bb50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bb60 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2bb70 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2bb80 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  LE */../*.** Add
2bb90 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69   WhereLoop entri
2bba0 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20  es to handle OR 
2bbb0 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72  terms.  This wor
2bbc0 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a  ks for either.**
2bbd0 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74 75   btrees or virtu
2bbe0 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  al tables..*/.st
2bbf0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
2bc00 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f 6f  opAddOr(WhereLoo
2bc10 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
2bc20 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  er, Bitmask mExt
2bc30 72 61 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  ra){.  WhereInfo
2bc40 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
2bc50 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57  der->pWInfo;.  W
2bc60 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
2bc70 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
2bc80 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ew;.  WhereTerm 
2bc90 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b  *pTerm, *pWCEnd;
2bca0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2bcb0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75  TE_OK;.  int iCu
2bcc0 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  r;.  WhereClause
2bcd0 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65   tempWC;.  Where
2bce0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62  LoopBuilder sSub
2bcf0 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4c 6f  Build;.  WhereLo
2bd00 6f 70 20 73 42 65 73 74 3b 0a 20 20 73 74 72 75  op sBest;.  stru
2bd10 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2bd20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43  *pItem;.  .  pWC
2bd30 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
2bd40 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
2bd50 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2bd60 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65  RE_AND_ONLY ) re
2bd70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bd80 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e    pWCEnd = pWC->
2bd90 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
2bda0 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65    pNew = pBuilde
2bdb0 72 2d 3e 70 4e 65 77 3b 0a 0a 20 20 66 6f 72 28  r->pNew;..  for(
2bdc0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
2bdd0 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63  erm<pWCEnd && rc
2bde0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65  ==SQLITE_OK; pTe
2bdf0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
2be00 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2be10 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20   & WO_OR)!=0.   
2be20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70    && (pTerm->u.p
2be30 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
2be40 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  e & pNew->maskSe
2be50 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  lf)!=0 .    ){. 
2be60 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
2be70 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
2be80 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
2be90 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
2bea0 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
2beb0 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
2bec0 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
2bed0 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
2bee0 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
2bef0 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 72 54      WhereCost rT
2bf00 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
2bf10 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 20 3d  WhereCost nRow =
2bf20 20 30 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   0;.      Bitmas
2bf30 6b 20 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  k prereq = mExtr
2bf40 61 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 77 68  a;.    .      wh
2bf50 65 72 65 4c 6f 6f 70 49 6e 69 74 28 26 73 42 65  ereLoopInit(&sBe
2bf60 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  st);.      pItem
2bf70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2bf80 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
2bf90 54 61 62 3b 0a 20 20 20 20 20 20 69 43 75 72 20  Tab;.      iCur 
2bfa0 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
2bfb0 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
2bfc0 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20  d = *pBuilder;. 
2bfd0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
2bfe0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2bff0 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 42 65     sSubBuild.pBe
2c000 73 74 20 3d 20 26 73 42 65 73 74 3b 0a 0a 20 20  st = &sBest;..  
2c010 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d      for(pOrTerm=
2c020 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72  pOrWC->a; pOrTer
2c030 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54  m<pOrWCEnd; pOrT
2c040 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
2c050 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
2c060 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44  perator & WO_AND
2c070 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2c080 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
2c090 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41  = &pOrTerm->u.pA
2c0a0 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
2c0b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
2c0c0 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
2c0d0 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20  r==iCur ){.     
2c0e0 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e       tempWC.pWIn
2c0f0 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
2c100 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
2c110 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  WC.pOuter = pWC;
2c120 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
2c130 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  C.op = TK_AND;. 
2c140 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
2c150 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  nTerm = 1;.     
2c160 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20       tempWC.a = 
2c170 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  pOrTerm;.       
2c180 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43     sSubBuild.pWC
2c190 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20   = &tempWC;.    
2c1a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c1b0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2c1c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c1d0 20 73 42 65 73 74 2e 6d 61 73 6b 53 65 6c 66 20   sBest.maskSelf 
2c1e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 42 65  = 0;.        sBe
2c1f0 73 74 2e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  st.rSetup = 0;. 
2c200 20 20 20 20 20 20 20 73 42 65 73 74 2e 72 52 75         sBest.rRu
2c210 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  n = 0;.#ifndef S
2c220 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2c230 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
2c240 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
2c250 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
2c260 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2c270 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
2c280 28 26 73 53 75 62 42 75 69 6c 64 29 3b 0a 20 20  (&sSubBuild);.  
2c290 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
2c2a0 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
2c2b0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2c2c0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73  eLoopAddBtree(&s
2c2d0 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61  SubBuild, mExtra
2c2e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2c2f0 20 20 20 20 20 2f 2a 20 73 42 65 73 74 2e 6d 61       /* sBest.ma
2c300 73 6b 53 65 6c 66 20 69 73 20 61 6c 77 61 79 73  skSelf is always
2c310 20 7a 65 72 6f 20 69 66 20 61 6e 20 65 72 72 6f   zero if an erro
2c320 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 20 20  r occurs */.    
2c330 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2c340 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 42 65  SQLITE_OK || sBe
2c350 73 74 2e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 29  st.maskSelf==0 )
2c360 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 42  ;.        if( sB
2c370 65 73 74 2e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20  est.maskSelf==0 
2c380 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2c390 20 61 73 73 65 72 74 28 20 73 42 65 73 74 2e 72   assert( sBest.r
2c3a0 53 65 74 75 70 3d 3d 30 20 29 3b 0a 20 20 20 20  Setup==0 );.    
2c3b0 20 20 20 20 72 54 6f 74 61 6c 20 3d 20 77 68 65      rTotal = whe
2c3c0 72 65 43 6f 73 74 41 64 64 28 72 54 6f 74 61 6c  reCostAdd(rTotal
2c3d0 2c 20 73 42 65 73 74 2e 72 52 75 6e 29 3b 0a 20  , sBest.rRun);. 
2c3e0 20 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 77 68         nRow = wh
2c3f0 65 72 65 43 6f 73 74 41 64 64 28 6e 52 6f 77 2c  ereCostAdd(nRow,
2c400 20 73 42 65 73 74 2e 6e 4f 75 74 29 3b 0a 20 20   sBest.nOut);.  
2c410 20 20 20 20 20 20 70 72 65 72 65 71 20 7c 3d 20        prereq |= 
2c420 73 42 65 73 74 2e 70 72 65 72 65 71 3b 0a 20 20  sBest.prereq;.  
2c430 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2c440 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rt( pNew->nLSlot
2c450 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=1 );.      if(
2c460 20 73 42 65 73 74 2e 6d 61 73 6b 53 65 6c 66 20   sBest.maskSelf 
2c470 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
2c480 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
2c490 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
2c4a0 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
2c4b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2c4c0 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54  ags = WHERE_MULT
2c4d0 49 5f 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 4e  I_OR;.        pN
2c4e0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2c4f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2c500 75 6e 20 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20  un = rTotal;.   
2c510 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2c520 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  = nRow;.        
2c530 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 70  pNew->prereq = p
2c540 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 6d  rereq;.        m
2c550 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20  emset(&pNew->u, 
2c560 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e  0, sizeof(pNew->
2c570 75 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  u));.        rc 
2c580 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
2c590 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
2c5a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2c5b0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
2c5c0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
2c5d0 64 62 2c 20 26 73 42 65 73 74 29 3b 0a 20 20 20  db, &sBest);.   
2c5e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2c5f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
2c600 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
2c610 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74  bjects for all t
2c620 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63  ables .*/.static
2c630 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2c640 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75  dAll(WhereLoopBu
2c650 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
2c660 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2c670 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
2c680 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d  ->pWInfo;.  Bitm
2c690 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a  ask mExtra = 0;.
2c6a0 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72    Bitmask mPrior
2c6b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
2c6c0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
2c6d0 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
2c6e0 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
2c6f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2c700 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
2c710 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
2c720 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
2c730 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70 57 49  t nTabList = pWI
2c740 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69  nfo->nLevel;.  i
2c750 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c760 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  K;.  u8 priorJoi
2c770 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57 68 65  nType = 0;.  Whe
2c780 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20  reLoop *pNew;.. 
2c790 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
2c7a0 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
2c7b0 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
2c7c0 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
2c7d0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
2c7e0 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
2c7f0 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f  Init(pNew);.  fo
2c800 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
2c810 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61  pTabList->a; iTa
2c820 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54 61 62  b<nTabList; iTab
2c830 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2c840 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69    pNew->iTab = i
2c850 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d  Tab;.    pNew->m
2c860 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
2c870 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
2c880 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Set, pItem->iCur
2c890 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28  sor);.    if( ((
2c8a0 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c  pItem->jointype|
2c8b0 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26  priorJoinType) &
2c8c0 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
2c8d0 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  SS))!=0 ){.     
2c8e0 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69 6f 72   mExtra = mPrior
2c8f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f  ;.    }.    prio
2c900 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49 74 65  rJoinType = pIte
2c910 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
2c920 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2c930 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
2c940 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2c950 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42  oopAddVirtual(pB
2c960 75 69 6c 64 65 72 29 3b 0a 20 20 20 20 7d 65 6c  uilder);.    }el
2c970 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  se{.      rc = w
2c980 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
2c990 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
2c9a0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
2c9b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c9c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
2c9d0 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75  ereLoopAddOr(pBu
2c9e0 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
2c9f0 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72      }.    mPrior
2ca00 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   |= pNew->maskSe
2ca10 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  lf;.    if( rc |
2ca20 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2ca30 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ed ) break;.  }.
2ca40 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
2ca50 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  (db, pNew);.  re
2ca60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2ca70 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72  * Examine a Wher
2ca80 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20  ePath (with the 
2ca90 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  addition of the 
2caa0 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20  extra WhereLoop 
2cab0 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61  of the 5th.** pa
2cac0 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65  rameters) to see
2cad0 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72   if it outputs r
2cae0 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65  ows in the reque
2caf0 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a  sted ORDER BY.**
2cb00 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77   (or GROUP BY) w
2cb10 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67  ithout requiring
2cb20 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 75 72   a separate sour
2cb30 63 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52  ce operation.  R
2cb40 65 74 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  eturn:.** .**   
2cb50 20 30 3a 20 20 4f 52 44 45 52 20 42 59 20 69 73   0:  ORDER BY is
2cb60 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2e 20   not satisfied. 
2cb70 20 53 6f 72 74 69 6e 67 20 72 65 71 75 69 72 65   Sorting require
2cb80 64 0a 2a 2a 20 20 20 20 31 3a 20 20 4f 52 44 45  d.**    1:  ORDE
2cb90 52 20 42 59 20 69 73 20 73 61 74 69 73 66 69 65  R BY is satisfie
2cba0 64 2e 20 20 20 20 20 20 4f 6d 69 74 20 73 6f 72  d.      Omit sor
2cbb0 74 69 6e 67 0a 2a 2a 20 20 20 2d 31 3a 20 20 55  ting.**   -1:  U
2cbc0 6e 6b 6e 6f 77 6e 20 61 74 20 74 68 69 73 20 74  nknown at this t
2cbd0 69 6d 65 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ime.**.*/.static
2cbe0 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 61   int wherePathSa
2cbf0 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a  tisfiesOrderBy(.
2cc00 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2cc10 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57  nfo,    /* The W
2cc20 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2cc30 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2cc40 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20  rBy,   /* ORDER 
2cc50 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f  BY or GROUP BY o
2cc60 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73  r DISTINCT claus
2cc70 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
2cc80 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
2cc90 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
2cca0 72 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20  rePath to check 
2ccb0 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
2ccc0 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69  ags,       /* Mi
2ccd0 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  ght contain WHER
2cce0 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48 45  E_GROUPBY or WHE
2ccf0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a 2f  RE_DISTINCTBY */
2cd00 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20  .  u16 nLoop,   
2cd10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2cd20 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
2cd30 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
2cd40 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
2cd50 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64  pLast,     /* Ad
2cd60 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  d this WhereLoop
2cd70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70   to the end of p
2cd80 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f  Path->aLoop[] */
2cd90 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76  .  Bitmask *pRev
2cda0 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a  Mask     /* OUT:
2cdb0 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f   Mask of WhereLo
2cdc0 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65  ops to run in re
2cdd0 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29  verse order */.)
2cde0 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20  {.  u8 revSet;  
2cdf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2ce00 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77  e if rev is know
2ce10 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20  n */.  u8 rev;  
2ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ce30 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f  Composite sort o
2ce40 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76  rder */.  u8 rev
2ce50 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
2ce60 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72  /* Index sort or
2ce70 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72  der */.  u8 isOr
2ce80 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f  derDistinct;   /
2ce90 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72  * All prior Wher
2cea0 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72  eLoops are order
2ceb0 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75  -distinct */.  u
2cec0 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  8 distinctColumn
2ced0 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  s;   /* True if 
2cee0 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49  the loop has UNI
2cef0 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  QUE NOT NULL col
2cf00 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d  umns */.  u8 isM
2cf10 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
2cf20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68  /* iColumn match
2cf30 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  es a term of the
2cf40 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2cf50 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d   */.  u16 nColum
2cf60 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  n;          /* N
2cf70 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
2cf80 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20   in pIndex */.  
2cf90 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  u16 nOrderBy;   
2cfa0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2cfb0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
2cfc0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2cfd0 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
2cfe0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2cff0 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e   of WhereLoop in
2d000 20 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f   pPath being pro
2d010 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  cessed */.  int 
2d020 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
2d030 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2d040 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
2d050 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d060 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
2d070 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65  or current Where
2d080 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43  Loop */.  int iC
2d090 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
2d0a0 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  /* A column numb
2d0b0 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20  er within table 
2d0c0 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  iCur */.  WhereL
2d0d0 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20  oop *pLoop = 0; 
2d0e0 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65  /* Current Where
2d0f0 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65  Loop being proce
2d100 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65  ssed. */.  Where
2d110 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
2d120 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
2d130 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
2d140 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
2d150 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20  *pOBExpr;       
2d160 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
2d170 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52  n from the ORDER
2d180 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2d190 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
2d1a0 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45        /* COLLATE
2d1b0 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61   function from a
2d1c0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2d1d0 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65  e term */.  Inde
2d1e0 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
2d1f0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61    /* The index a
2d200 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2d210 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Loop */.  sqlite
2d220 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
2d230 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
2d240 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
2d250 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
2d260 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f   obSat = 0;    /
2d270 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20  * Mask of ORDER 
2d280 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69  BY terms satisfi
2d290 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42  ed so far */.  B
2d2a0 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20  itmask obDone;  
2d2b0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2d2c0 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72  all ORDER BY ter
2d2d0 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
2d2e0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2d2f0 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61  k;  /* Mask of a
2d300 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20  ll well-ordered 
2d310 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61  loops */.  Bitma
2d320 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20  sk ready;       
2d330 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2d340 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f  f inner loops */
2d350 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  /*.  ** We s
2d360 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
2d370 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66   is "one-row" if
2d380 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f   it generates no
2d390 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20   more than one. 
2d3a0 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75   ** row of outpu
2d3b0 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  t.  A WhereLoop 
2d3c0 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c  is one-row if al
2d3d0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
2d3e0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a  ng are true:.  *
2d3f0 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78  *  (a) All index
2d400 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77   columns match w
2d410 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ith WHERE_COLUMN
2d420 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54  _EQ..  **  (b) T
2d430 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71  he index is uniq
2d440 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72  ue.  ** Any Wher
2d450 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48  eLoop with an WH
2d460 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f  ERE_COLUMN_EQ co
2d470 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
2d480 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77  rowid is one-row
2d490 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65  ..  ** Every one
2d4a0 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77  -row WhereLoop w
2d4b0 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45  ill have the WHE
2d4c0 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65  RE_ONEROW bit se
2d4d0 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20  t in wsFlags..  
2d4e0 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  **.  ** We say t
2d4f0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
2d500 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22  "order-distinct"
2d510 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63   if the set of c
2d520 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a  olumns from.  **
2d530 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20   that WhereLoop 
2d540 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20  that are in the 
2d550 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2d560 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f  are different fo
2d570 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77  r every.  ** row
2d580 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
2d590 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f  p.  Every one-ro
2d5a0 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61  w WhereLoop is a
2d5b0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a  utomatically.  *
2d5c0 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  * order-distinct
2d5d0 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  .   A WhereLoop 
2d5e0 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75  that has no colu
2d5f0 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  mns in the ORDER
2d600 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   BY clause.  ** 
2d610 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73  is not order-dis
2d620 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64  tinct. To be ord
2d630 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e  er-distinct is n
2d640 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d  ot quite the sam
2d650 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20  e as being.  ** 
2d660 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55  UNIQUE since a U
2d670 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20  NIQUE column or 
2d680 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d  index can have m
2d690 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61  ultiple rows tha
2d6a0 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  t .  ** are NULL
2d6b0 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73   and NULL values
2d6c0 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20   are equivalent 
2d6d0 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20  for the purpose 
2d6e0 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  of order-distinc
2d6f0 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72  t..  ** To be or
2d700 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68  der-distinct, th
2d710 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62  e columns must b
2d720 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54  e UNIQUE and NOT
2d730 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   NULL..  **.  **
2d740 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61   The rowid for a
2d750 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73   table is always
2d760 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
2d770 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72  NULL so whenever
2d780 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20   the.  ** rowid 
2d790 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f  appears in the O
2d7a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2d7b0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2d7c0 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20  g WhereLoop is. 
2d7d0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
2d7e0 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  y order-distinct
2d7f0 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ..  */..  assert
2d800 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ( pOrderBy!=0 );
2d810 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69  ..  /* Sortabili
2d820 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61  ty of virtual ta
2d830 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d 69 6e  bles is determin
2d840 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
2d850 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a  ndex method.  **
2d860 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
2d870 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a  table itself */.
2d880 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77 73 46    if( pLast->wsF
2d890 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2d8a0 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
2d8b0 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70   testcase( nLoop
2d8c0 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65 20 77  >0 );  /* True w
2d8d0 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20  hen outer loops 
2d8e0 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20  are one-row and 
2d8f0 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20 20 20  match .         
2d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d910 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   ** no ORDER BY 
2d920 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74  terms */.    ret
2d930 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61  urn pLast->u.vta
2d940 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d  b.isOrdered;.  }
2d950 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20  .  if( nLoop && 
2d960 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
2d970 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2d980 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20  OrderByIdxJoin) 
2d990 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e  ) return 0;..  n
2d9a0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
2d9b0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73  By->nExpr;.  tes
2d9c0 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d  tcase( nOrderBy=
2d9d0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20  =BMS-1 );.  if( 
2d9e0 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29  nOrderBy>BMS-1 )
2d9f0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
2da00 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f  annot optimize o
2da10 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45  verly large ORDE
2da20 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64  R BYs */.  isOrd
2da30 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
2da40 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42    obDone = MASKB
2da50 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a  IT(nOrderBy)-1;.
2da60 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d    orderDistinctM
2da70 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79  ask = 0;.  ready
2da80 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f   = 0;.  for(iLoo
2da90 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74  p=0; isOrderDist
2daa0 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62  inct && obSat<ob
2dab0 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e  Done && iLoop<=n
2dac0 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a  Loop; iLoop++){.
2dad0 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20      if( iLoop>0 
2dae0 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70  ) ready |= pLoop
2daf0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2db00 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c  pLoop = iLoop<nL
2db10 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f  oop ? pPath->aLo
2db20 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73  op[iLoop] : pLas
2db30 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  t;.    assert( (
2db40 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2db50 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2db60 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  BLE)==0 );.    i
2db70 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Cur = pWInfo->pT
2db80 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d  abList->a[pLoop-
2db90 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a  >iTab].iCursor;.
2dba0 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
2dbb0 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65   any ORDER BY te
2dbc0 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20 63  rm X that is a c
2dbd0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
2dbe0 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  le of.    ** the
2dbf0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f   current loop fo
2dc00 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73  r which there is
2dc10 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
2dc20 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  RE.    ** clause
2dc30 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49   of the form X I
2dc40 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68  S NULL or X=? th
2dc50 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  at reference onl
2dc60 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c  y outer.    ** l
2dc70 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oops..    */.   
2dc80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
2dc90 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
2dca0 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
2dcb0 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
2dcc0 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78  nue;.      pOBEx
2dcd0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2dce0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
2dcf0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2dd00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  );.      if( pOB
2dd10 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
2dd20 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
2dd30 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2dd40 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
2dd50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2dd60 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
2dd70 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  rm(&pWInfo->sWC,
2dd80 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e   iCur, pOBExpr->
2dd90 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
2dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddb0 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  ~ready, WO_EQ|WO
2ddc0 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20  _ISNULL, 0);.   
2ddd0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
2dde0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ddf0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2de00 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d  perator&WO_EQ)!=
2de10 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43  0 && pOBExpr->iC
2de20 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
2de30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2de40 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  z1, *z2;.       
2de50 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2de60 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
2de70 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
2de80 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2de90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
2dea0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
2deb0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2dec0 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c         z1 = pCol
2ded0 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
2dee0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2def0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
2df00 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65  nfo->pParse, pTe
2df10 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  rm->pExpr);.    
2df20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2df30 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
2df40 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
2df50 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  z2 = pColl->zNam
2df60 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
2df70 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
2df80 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69  , z2)!=0 ) conti
2df90 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2dfa0 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
2dfb0 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20  BIT(i);.    }.. 
2dfc0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
2dfd0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
2dfe0 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20  NEROW)==0 ){.   
2dff0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
2e000 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
2e010 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  K ){.        pIn
2e020 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
2e030 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20   nColumn = 0;.  
2e040 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
2e050 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
2e060 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d  .btree.pIndex)==
2e070 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e  0 || pIndex->bUn
2e080 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20  ordered ){.     
2e090 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2e0a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e0b0 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
2e0c0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
2e0d0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
2e0e0 69 6e 63 74 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  inct = pIndex->o
2e0f0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
2e100 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2e110 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
2e120 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
2e130 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
2e140 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
2e150 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
2e160 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
2e170 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
2e180 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
2e190 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
2e1a0 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
2e1b0 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
2e1c0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 3d 6e 43 6f   for(j=0; j<=nCo
2e1d0 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
2e1e0 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20      u8 bOnce;   
2e1f0 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74  /* True to run t
2e200 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72  he ORDER BY sear
2e210 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  ch loop */..    
2e220 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72      /* Skip over
2e230 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20   == and IS NULL 
2e240 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20  terms */.       
2e250 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e   if( j<pLoop->u.
2e260 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
2e270 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f     && ((i = pLoo
2e280 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f  p->aLTerm[j]->eO
2e290 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45  perator) & (WO_E
2e2a0 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30  Q|WO_ISNULL))!=0
2e2b0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2e2c0 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
2e2d0 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
2e2e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2e2f0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2e300 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2e310 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2e320 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
2e330 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
2e340 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d  nue;  .        }
2e350 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
2e360 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
2e370 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
2e380 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
2e390 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
2e3a0 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
2e3b0 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
2e3c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
2e3d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2e3e0 20 20 69 66 28 20 6a 3c 6e 43 6f 6c 75 6d 6e 20    if( j<nColumn 
2e3f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2e400 4e 6f 72 6d 61 6c 20 69 6e 64 65 78 20 63 6f 6c  Normal index col
2e410 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  umns */.        
2e420 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
2e430 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
2e440 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
2e450 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
2e460 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
2e470 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
2e480 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ==pIndex->pTable
2e490 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d  ->iPKey ) iColum
2e4a0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2e4b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2e4c0 20 2f 2a 20 54 68 65 20 52 4f 57 49 44 20 63 6f   /* The ROWID co
2e4d0 6c 75 6d 6e 20 61 74 20 74 68 65 20 65 6e 64 20  lumn at the end 
2e4e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
2e4f0 65 72 74 28 20 6a 3d 3d 6e 43 6f 6c 75 6d 6e 20  ert( j==nColumn 
2e500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  );.          iCo
2e510 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
2e520 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b       revIdx = 0;
2e530 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2e540 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73      /* An uncons
2e550 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74  trained column t
2e560 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  hat might be NUL
2e570 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  L means that thi
2e580 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65  s.        ** Whe
2e590 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65  reLoop is not we
2e5a0 6c 6c 2d 6f 72 64 65 72 65 64 20 0a 20 20 20 20  ll-ordered .    
2e5b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2e5c0 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
2e5d0 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ct.         && i
2e5e0 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20  Column>=0.      
2e5f0 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e     && j>=pLoop->
2e600 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20  u.btree.nEq.    
2e610 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e       && pIndex->
2e620 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
2e630 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
2e640 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2e650 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
2e660 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
2e670 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2e680 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20   Find the ORDER 
2e690 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72  BY term that cor
2e6a0 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
2e6b0 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20  j-th column.    
2e6c0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e      ** of the in
2e6d0 64 65 78 20 61 6e 64 20 61 6e 64 20 6d 61 72 6b  dex and and mark
2e6e0 20 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74   that ORDER BY t
2e6f0 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20  erm off .       
2e700 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63   */.        bOnc
2e710 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  e = 1;.        i
2e720 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
2e730 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e      for(i=0; bOn
2e740 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79  ce && i<nOrderBy
2e750 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2e760 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
2e770 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
2e780 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nue;.          p
2e790 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
2e7a0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2e7b0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2e7c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2e7d0 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
2e7e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
2e7f0 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20  OUPBY );.       
2e800 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
2e810 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2e820 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20  DISTINCTBY );.  
2e830 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74          if( (wct
2e840 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  rlFlags & (WHERE
2e850 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44  _GROUPBY|WHERE_D
2e860 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29  ISTINCTBY))==0 )
2e870 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20   bOnce = 0;.    
2e880 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2e890 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
2e8a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2e8b0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
2e8c0 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
2e8d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2e8e0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
2e8f0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f  pr->iColumn!=iCo
2e900 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
2e910 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2e920 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
2e930 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
2e940 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2e950 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
2e960 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
2e970 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
2e980 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
2e990 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
2e9a0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2e9b0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2e9c0 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
2e9d0 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e  >zName, pIndex->
2e9e0 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20  azColl[j])!=0 ) 
2e9f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2ea00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ea10 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20  isMatch = 1;.   
2ea20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2ea30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ea40 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20  if( isMatch ){. 
2ea50 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
2ea60 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
2ea70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ea80 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d  distinctColumns=
2ea90 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2eaa0 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
2eab0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
2eac0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53   }.          obS
2ead0 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
2eae0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2eaf0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2eb00 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
2eb10 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PBY)==0 ){.     
2eb20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
2eb30 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  ure the sort ord
2eb40 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  er is compatible
2eb50 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
2eb60 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20  clause..        
2eb70 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65      ** Sort orde
2eb80 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20  r is irrelevant 
2eb90 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63  for a GROUP BY c
2eba0 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  lause. */.      
2ebb0 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
2ebc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ebd0 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76    if( (rev ^ rev
2ebe0 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e  Idx)!=pOrderBy->
2ebf0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[i].sortOrder )
2ec00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
2ec10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
2ec30 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
2ec40 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
2ec50 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
2ec60 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52     if( rev ) *pR
2ec70 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  evMask |= MASKBI
2ec80 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  T(iLoop);.      
2ec90 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
2eca0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2ecb0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2ecc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ecd0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74         /* No mat
2ece0 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  ch found */.    
2ecf0 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c        if( j==0 |
2ed00 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  | j<nColumn ){. 
2ed10 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2ed20 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
2ed30 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  inct!=0 );.     
2ed40 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2ed50 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2ed60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ed70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2ed80 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e   }.      } /* en
2ed90 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  d Loop over all 
2eda0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f  index columns */
2edb0 0a 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69  .      if( disti
2edc0 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20  nctColumns ){.  
2edd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ede0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d  isOrderDistinct=
2edf0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73  =0 );.        is
2ee00 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2ee10 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2ee20 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f   /* end-if not o
2ee30 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f  ne-row */..    /
2ee40 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f  * Mark off any o
2ee50 74 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65  ther ORDER BY te
2ee60 72 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e  rms that referen
2ee70 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20  ce pLoop */.    
2ee80 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
2ee90 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  nct ){.      ord
2eea0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c  erDistinctMask |
2eeb0 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
2eec0 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  f;.      for(i=0
2eed0 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
2eee0 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
2eef0 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28   *p;.        if(
2ef00 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
2ef10 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
2ef20 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64          p = pOrd
2ef30 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2ef40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65  ;.        if( (e
2ef50 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 26 70  xprTableUsage(&p
2ef60 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
2ef70 20 70 29 26 7e 6f 72 64 65 72 44 69 73 74 69 6e   p)&~orderDistin
2ef80 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  ctMask)==0 ){.  
2ef90 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
2efa0 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
2efb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2efc0 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20     }.  } /* End 
2efd0 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c  the loop over al
2efe0 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f  l WhereLoops fro
2eff0 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77  m outer-most dow
2f000 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20  n to inner-most 
2f010 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d  */.  if( obSat==
2f020 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20  obDone ) return 
2f030 31 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65  1;.  if( !isOrde
2f040 72 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75  rDistinct ) retu
2f050 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d  rn 0;.  return -
2f060 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45  1;.}..#ifdef WHE
2f070 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
2f080 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67  /* For debugging
2f090 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74   use only: */.st
2f0a0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2f0b0 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57  *wherePathName(W
2f0c0 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
2f0d0 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72   int nLoop, Wher
2f0e0 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20  eLoop *pLast){. 
2f0f0 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61   static char zNa
2f100 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b  me[65];.  int i;
2f110 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c  .  for(i=0; i<nL
2f120 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65  oop; i++){ zName
2f130 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f  [i] = pPath->aLo
2f140 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20  op[i]->cId; }.  
2f150 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d  if( pLast ) zNam
2f160 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e  e[i++] = pLast->
2f170 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20  cId;.  zName[i] 
2f180 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e  = 0;.  return zN
2f190 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ame;.}.#endif...
2f1a0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
2f1b0 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
2f1c0 70 20 6f 62 6a 65 63 74 73 20 6f 6e 20 70 57 49  p objects on pWI
2f1d0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69  nfo->pLoops, thi
2f1e0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74  s routine.** att
2f1f0 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68  empts to find th
2f200 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
2f210 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65  th that visits e
2f220 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a  ach WhereLoop.**
2f230 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74   once.  This pat
2f240 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64  h is then loaded
2f250 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f   into the pWInfo
2f260 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65  ->a[].pWLoop fie
2f270 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d  lds..**.** Assum
2f280 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c  e that the total
2f290 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
2f2a0 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  t rows that will
2f2b0 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74   need to be sort
2f2c0 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52  ed.** will be nR
2f2d0 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30  owEst (in the 10
2f2e0 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61  *log2 representa
2f2f0 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f  tion).  Or, igno
2f300 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f  re sorting.** co
2f310 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d  sts if nRowEst==
2f320 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0..**.** Return 
2f330 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
2f340 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e  cess or SQLITE_N
2f350 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79  OMEM of a memory
2f360 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65   allocation.** e
2f370 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
2f380 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2f390 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65  PathSolver(Where
2f3a0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 57 68  Info *pWInfo, Wh
2f3b0 65 72 65 43 6f 73 74 20 6e 52 6f 77 45 73 74 29  ereCost nRowEst)
2f3c0 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65  {.  int mxChoice
2f3d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f3e0 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
2f3f0 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  of simultaneous 
2f400 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f  paths tracked */
2f410 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20  .  int nLoop;   
2f420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f430 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
2f440 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  in the join */. 
2f450 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
2f460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2f470 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2f480 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
2f490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f4a0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
2f4b0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
2f4c0 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
2f4d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2f4e0 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20  ounter over the 
2f4f0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69  terms of the joi
2f500 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a  n */.  int ii, j
2f510 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
2f520 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2f530 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  s */.  WhereCost
2f540 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20   rCost;         
2f550 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 61      /* Cost of a
2f560 20 70 61 74 68 20 2a 2f 0a 20 20 57 68 65 72 65   path */.  Where
2f570 43 6f 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b  Cost mxCost = 0;
2f580 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2f590 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  um cost of a set
2f5a0 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 57   of paths */.  W
2f5b0 68 65 72 65 43 6f 73 74 20 72 53 6f 72 74 43 6f  hereCost rSortCo
2f5c0 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
2f5d0 6f 73 74 20 74 6f 20 64 6f 20 61 20 73 6f 72 74  ost to do a sort
2f5e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e   */.  int nTo, n
2f5f0 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
2f600 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
2f610 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54  id entries in aT
2f620 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20  o[] and aFrom[] 
2f630 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
2f640 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  aFrom;         /
2f650 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68  * All nFrom path
2f660 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75  s at the previou
2f670 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65  s level */.  Whe
2f680 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20  rePath *aTo;    
2f690 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54         /* The nT
2f6a0 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  o best paths at 
2f6b0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65  the current leve
2f6c0 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
2f6d0 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *pFrom;        
2f6e0 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
2f6f0 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77  f aFrom[] that w
2f700 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
2f710 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
2f720 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *pTo;           
2f730 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
2f740 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61   aTo[] that we a
2f750 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
2f760 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57  .  WhereLoop *pW
2f770 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Loop;        /* 
2f780 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65  One of the Where
2f790 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
2f7a0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58    WhereLoop **pX
2f7b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ;           /* U
2f7c0 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74  sed to divy up t
2f7d0 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79  he pSpace memory
2f7e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
2f7f0 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
2f800 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
2f810 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
2f820 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 70   routine */..  p
2f830 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
2f840 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
2f850 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f  Parse->db;.  nLo
2f860 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  op = pWInfo->nLe
2f870 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  vel;.  /* TUNING
2f880 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65  : For simple que
2f890 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62  ries, only the b
2f8a0 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63  est path is trac
2f8b0 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d  ked..  ** For 2-
2f8c0 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35  way joins, the 5
2f8d0 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20   best paths are 
2f8e0 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46  followed..  ** F
2f8f0 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72  or joins of 3 or
2f900 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72   more tables, tr
2f910 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20  ack the 10 best 
2f920 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f  paths */.  mxCho
2f930 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29  ice = (nLoop==1)
2f940 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32   ? 1 : (nLoop==2
2f950 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73   ? 5 : 10);.  as
2f960 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49  sert( nLoop<=pWI
2f970 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
2f980 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52  Src );.  WHERETR
2f990 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d  ACE(0x002, ("---
2f9a0 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 5c 6e  - begin solver\n
2f9b0 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  "));..  /* Alloc
2f9c0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
2f9d0 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f  ze space for aTo
2f9e0 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20   and aFrom */.  
2f9f0 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65  ii = (sizeof(Whe
2fa00 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57  rePath)+sizeof(W
2fa10 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70  hereLoop*)*nLoop
2fa20 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20  )*mxChoice*2;.  
2fa30 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
2fa40 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
2fa50 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63  ii);.  if( pSpac
2fa60 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
2fa70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54  LITE_NOMEM;.  aT
2fa80 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29  o = (WherePath*)
2fa90 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20  pSpace;.  aFrom 
2faa0 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a  = aTo+mxChoice;.
2fab0 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20    memset(aFrom, 
2fac0 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b  0, sizeof(aFrom[
2fad0 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68  0]));.  pX = (Wh
2fae0 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d  ereLoop**)(aFrom
2faf0 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f  +mxChoice);.  fo
2fb00 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c  r(ii=mxChoice*2,
2fb10 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30   pFrom=aTo; ii>0
2fb20 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c  ; ii--, pFrom++,
2fb30 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20   pX += nLoop){. 
2fb40 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20     pFrom->aLoop 
2fb50 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = pX;.  }..  /* 
2fb60 53 65 65 64 20 74 68 65 20 73 65 61 72 63 68 20  Seed the search 
2fb70 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68  with a single Wh
2fb80 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69  erePath containi
2fb90 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f  ng zero WhereLoo
2fba0 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55  ps..  **.  ** TU
2fbb0 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74  NING: Do not let
2fbc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
2fbd0 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f  terations go abo
2fbe0 76 65 20 32 35 2e 20 20 49 66 20 74 68 65 20 63  ve 25.  If the c
2fbf0 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70  ost.  ** of comp
2fc00 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  uting an automat
2fc10 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ic index is not 
2fc20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e  paid back within
2fc30 20 74 68 65 20 66 69 72 73 74 20 32 35 0a 20 20   the first 25.  
2fc40 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f  ** rows, then do
2fc50 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75 74   not use the aut
2fc60 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f  omatic index. */
2fc70 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77  .  aFrom[0].nRow
2fc80 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e   = MIN(pParse->n
2fc90 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20  QueryLoop, 46); 
2fca0 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77 68 65   assert( 46==whe
2fcb0 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a 20 20  reCost(25) );.  
2fcc0 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a  nFrom = 1;..  /*
2fcd0 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20   Precompute the 
2fce0 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
2fcf0 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74  the final result
2fd00 20 73 65 74 2c 20 69 66 20 74 68 65 20 63 61 6c   set, if the cal
2fd10 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  ler.  ** to sqli
2fd20 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
2fd30 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20 61 62  was concerned ab
2fd40 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20  out sorting */. 
2fd50 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 0a   rSortCost = 0;.
2fd60 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f    if( pWInfo->pO
2fd70 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f  rderBy==0 || nRo
2fd80 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  wEst==0 ){.    a
2fd90 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
2fda0 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 65  dValid = 1;.  }e
2fdb0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 55 4e 49  lse{.    /* TUNI
2fdc0 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f  NG: Estimated co
2fdd0 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 73  st of sorting is
2fde0 20 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65   N*log2(N) where
2fdf0 20 4e 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a   N is the.    **
2fe00 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
2fe10 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 72  t rows. */.    r
2fe20 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45  SortCost = nRowE
2fe30 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77  st + estLog(nRow
2fe40 45 73 74 29 3b 0a 20 20 20 20 57 48 45 52 45 54  Est);.    WHERET
2fe50 52 41 43 45 28 30 78 30 30 32 2c 28 22 2d 2d 2d  RACE(0x002,("---
2fe60 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64  - sort cost=%-3d
2fe70 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73 74 29 29  \n", rSortCost))
2fe80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
2fe90 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79  ute successively
2fea0 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74   longer WherePat
2feb0 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65  hs using the pre
2fec0 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e  vious generation
2fed0 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61  .  ** of WherePa
2fee0 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73  ths as the basis
2fef0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20   for the next.  
2ff00 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
2ff10 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20  e mxChoice.  ** 
2ff20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61  best paths at ea
2ff30 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  ch generation */
2ff40 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
2ff50 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
2ff60 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d  op++){.    nTo =
2ff70 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
2ff80 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69  , pFrom=aFrom; i
2ff90 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70  i<nFrom; ii++, p
2ffa0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66  From++){.      f
2ffb0 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f  or(pWLoop=pWInfo
2ffc0 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70  ->pLoops; pWLoop
2ffd0 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d  ; pWLoop=pWLoop-
2ffe0 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
2fff0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73       Bitmask mas
30000 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 42 69  kNew;.        Bi
30010 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20  tmask revMask = 
30020 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73  0;.        u8 is
30030 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 70  OrderedValid = p
30040 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 56  From->isOrderedV
30050 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 75 38  alid;.        u8
30060 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72   isOrdered = pFr
30070 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20  om->isOrdered;. 
30080 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
30090 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46  op->prereq & ~pF
300a0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
300b0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
300c0 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
300d0 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46  p->maskSelf & pF
300e0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
300f0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
30100 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
30110 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69   point, pWLoop i
30120 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
30130 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f   be the next loo
30140 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43  p. .        ** C
30150 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20  ompute its cost 
30160 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74  */.        rCost
30170 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
30180 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70  pWLoop->rSetup,p
30190 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46  WLoop->rRun + pF
301a0 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20  rom->nRow);.    
301b0 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68 65 72      rCost = wher
301c0 65 43 6f 73 74 41 64 64 28 72 43 6f 73 74 2c 20  eCostAdd(rCost, 
301d0 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20  pFrom->rCost);. 
301e0 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d         maskNew =
301f0 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
30200 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
30210 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  elf;.        if(
30220 20 21 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64   !isOrderedValid
30230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 77   ){.          sw
30240 69 74 63 68 28 20 77 68 65 72 65 50 61 74 68 53  itch( wherePathS
30250 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
30260 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  pWInfo,.        
30270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
30280 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
30290 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e   pFrom, pWInfo->
302a0 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20  wctrlFlags,.    
302b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302c0 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70     iLoop, pWLoop
302d0 2c 20 26 72 65 76 4d 61 73 6b 29 20 29 7b 0a 20  , &revMask) ){. 
302e0 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
302f0 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70 46 72  1:  /* Yes.  pFr
30300 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73  om+pWLoop does s
30310 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
30320 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
30330 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
30340 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  dered = 1;.     
30350 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
30360 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  edValid = 1;.   
30370 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
30380 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ;.            ca
30390 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70  se 0:  /* No.  p
303a0 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c  From+pWLoop will
303b0 20 72 65 71 75 69 72 65 20 61 20 73 65 70 61 72   require a separ
303c0 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20  ate sort */.    
303d0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
303e0 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  red = 0;.       
303f0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
30400 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Valid = 1;.     
30410 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
30420 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 43   whereCostAdd(rC
30430 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73 74 29 3b  ost, rSortCost);
30440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
30450 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
30460 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20 43 61    default: /* Ca
30470 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74 2e 20 20  nnot tell yet.  
30480 54 72 79 20 61 67 61 69 6e 20 6f 6e 20 74 68 65  Try again on the
30490 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
304a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
304b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
304c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
304d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  e{.          rev
304e0 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
304f0 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  vLoop;.        }
30500 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
30510 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
30520 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
30530 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68 6f 69  ed to the mxChoi
30540 63 65 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  ce best so far *
30550 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  /.        for(jj
30560 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c  =0, pTo=aTo; jj<
30570 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b  nTo; jj++, pTo++
30580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
30590 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d   pTo->maskLoop==
305a0 6d 61 73 6b 4e 65 77 20 26 26 20 70 54 6f 2d 3e  maskNew && pTo->
305b0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3d 3d  isOrderedValid==
305c0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29  isOrderedValid )
305d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
305e0 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d  stcase( jj==nTo-
305f0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
30600 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
30610 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
30620 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54        if( jj>=nT
30630 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  o ){.          i
30640 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65  f( nTo>=mxChoice
30650 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43 6f 73   && rCost>=mxCos
30660 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52  t ){.#ifdef WHER
30670 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
30680 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
30690 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
306a0 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
306b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
306c0 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20  ugPrintf("Skip  
306d0 20 25 73 20 63 6f 73 74 3d 25 33 64 20 6f 72 64   %s cost=%3d ord
306e0 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
306f0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
30700 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
30710 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
30720 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20   rCost,.        
30730 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
30740 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72  redValid ? (isOr
30750 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e  dered ? 'Y' : 'N
30760 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  ') : '?');.     
30770 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
30780 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
30790 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
307a0 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  }.          /* A
307b0 64 64 20 61 20 6e 65 77 20 50 61 74 68 20 74 6f  dd a new Path to
307c0 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74 20 2a   the aTo[] set *
307d0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
307e0 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a  nTo<mxChoice ){.
307f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
30800 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
30810 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20   of the aTo set 
30820 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  by one */.      
30830 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b        jj = nTo++
30840 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
30850 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
30860 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61  * New path repla
30870 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f  ces the prior wo
30880 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e  rst to keep coun
30890 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65  t below mxChoice
308a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
308b0 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31 3b 20 61 54  for(jj=nTo-1; aT
308c0 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c 6d 78 43 6f  o[jj].rCost<mxCo
308d0 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61 73 73 65 72  st; jj--){ asser
308e0 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20 20 20 20 20  t(jj>0); }.     
308f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30900 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b   pTo = &aTo[jj];
30910 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
30920 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
30930 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
30940 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
30950 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
30960 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
30970 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74  ("New    %s cost
30980 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  =%-3d order=%c\n
30990 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
309a0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
309b0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
309c0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20  WLoop), rCost,. 
309d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
309e0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
309f0 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  (isOrdered ? 'Y'
30a00 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
30a10 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
30a20 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  if.        }else
30a30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
30a40 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73  pTo->rCost<=rCos
30a50 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52  t ){.#ifdef WHER
30a60 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
30a70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
30a80 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
30a90 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
30aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
30ab0 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
30ac0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69              "Ski
30ad0 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  p   %s cost=%-3d
30ae0 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
30af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
30b00 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
30b10 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
30b20 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20  ), rCost,.      
30b30 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
30b40 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
30b50 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
30b60 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
30b70 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30b80 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
30b90 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33    vs %s cost=%-3
30ba0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
30bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bc0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
30bd0 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
30be0 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20 20   pTo->rCost,.   
30bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
30c00 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
30c10 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  id ? (pTo->isOrd
30c20 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
30c30 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
30c40 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
30c50 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
30c60 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d  ase( pTo->rCost=
30c70 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20  =rCost );.      
30c80 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
30c90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30ca0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
30cb0 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73  pTo->rCost==rCos
30cc0 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  t+1 );.         
30cd0 20 2f 2a 20 41 20 6e 65 77 20 61 6e 64 20 62 65   /* A new and be
30ce0 74 74 65 72 20 73 63 6f 72 65 20 66 6f 72 20 61  tter score for a
30cf0 20 70 72 65 76 69 6f 75 73 6c 79 20 63 72 65 61   previously crea
30d00 74 65 64 20 65 71 75 69 76 61 6c 65 6e 74 20 70  ted equivalent p
30d10 61 74 68 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  ath */.#ifdef WH
30d20 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
30d30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
30d40 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
30d50 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
30d60 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
30d70 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
30d80 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20          "Update 
30d90 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64  %s cost=%-3d ord
30da0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
30db0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
30dc0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
30dd0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
30de0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
30df0 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c      isOrderedVal
30e00 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20  id ? (isOrdered 
30e10 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27  ? 'Y' : 'N') : '
30e20 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
30e30 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
30e40 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f  ntf("  was %s co
30e50 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63  st=%-3d order=%c
30e60 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
30e70 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
30e80 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
30e90 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
30ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30eb0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56   pTo->isOrderedV
30ec0 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f  alid ? (pTo->isO
30ed0 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
30ee0 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
30ef0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
30f00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30f10 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20   /* pWLoop is a 
30f20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20  winner.  Add it 
30f30 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65  to the set of be
30f40 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
30f50 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f       pTo->maskLo
30f60 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  op = pFrom->mask
30f70 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
30f80 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
30f90 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20   pTo->revLoop = 
30fa0 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  revMask;.       
30fb0 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 70 46 72   pTo->nRow = pFr
30fc0 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f  om->nRow + pWLoo
30fd0 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  p->nOut;.       
30fe0 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43   pTo->rCost = rC
30ff0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ost;.        pTo
31000 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
31010 20 3d 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69   = isOrderedVali
31020 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  d;.        pTo->
31030 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
31040 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
31050 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
31060 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
31070 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
31080 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
31090 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
310a0 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
310b0 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
310c0 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
310d0 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61        mxCost = a
310e0 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20  To[0].rCost;.   
310f0 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c         for(jj=1,
31100 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a   pTo=&aTo[1]; jj
31110 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c  <mxChoice; jj++,
31120 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
31130 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43       if( pTo->rC
31140 6f 73 74 3e 6d 78 43 6f 73 74 20 29 20 6d 78 43  ost>mxCost ) mxC
31150 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74  ost = pTo->rCost
31160 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
31180 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48      }..#ifdef WH
31190 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
311a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
311b0 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b  WhereTrace>=2 ){
311c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
311d0 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
311e0 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d  after round %d -
311f0 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a  ---\n", iLoop);.
31200 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20        for(ii=0, 
31210 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b  pTo=aTo; ii<nTo;
31220 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   ii++, pTo++){. 
31230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
31240 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63  bugPrintf(" %s c
31250 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d  ost=%-3d nrow=%-
31260 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
31270 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
31280 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
31290 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
312a0 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
312b0 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
312c0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
312d0 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
312e0 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
312f0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66  '?');.        if
31300 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ( pTo->isOrdered
31310 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e 69 73  Valid && pTo->is
31320 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20  Ordered ){.     
31330 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
31340 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78  gPrintf(" rev=0x
31350 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65  %llx\n", pTo->re
31360 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  vLoop);.        
31370 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31380 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
31390 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ntf("\n");.     
313a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
313b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
313c0 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73  * Swap the roles
313d0 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54   of aFrom and aT
313e0 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67  o for the next g
313f0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  eneration */.   
31400 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20   pFrom = aTo;.  
31410 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20    aTo = aFrom;. 
31420 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d     aFrom = pFrom
31430 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54  ;.    nFrom = nT
31440 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46  o;.  }..  if( nF
31450 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  rom==0 ){.    sq
31460 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
31470 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20  arse, "no query 
31480 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20  solution");.    
31490 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
314a0 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72  , pSpace);.    r
314b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
314c0 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OR;.  }.  .  /* 
314d0 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  Find the lowest 
314e0 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f  cost path.  pFro
314f0 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70  m will be left p
31500 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20  ointing to that 
31510 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20  path */.  pFrom 
31520 3d 20 61 46 72 6f 6d 3b 0a 20 20 61 73 73 65 72  = aFrom;.  asser
31530 74 28 20 6e 46 72 6f 6d 3d 3d 31 20 29 3b 0a 23  t( nFrom==1 );.#
31540 69 66 20 30 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  if 0 /* The foll
31550 6f 77 69 6e 67 20 69 73 20 6e 65 65 64 65 64 20  owing is needed 
31560 69 66 20 6e 46 72 6f 6d 20 69 73 20 65 76 65 72  if nFrom is ever
31570 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 2a 2f 0a   more than 1 */.
31580 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
31590 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  From; ii++){.   
315a0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73   if( pFrom->rCos
315b0 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73  t>aFrom[ii].rCos
315c0 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72  t ) pFrom = &aFr
315d0 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 23 65 6e 64  om[ii];.  }.#end
315e0 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  if.  assert( pWI
315f0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f  nfo->nLevel==nLo
31600 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20  op );.  /* Load 
31610 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
31620 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f  path into pWInfo
31630 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
31640 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
31650 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68  iLoop++){.    Wh
31660 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
31670 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69   = pWInfo->a + i
31680 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Loop;.    pLevel
31690 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f  ->pWLoop = pWLoo
316a0 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  p = pFrom->aLoop
316b0 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65  [iLoop];.    pLe
316c0 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c  vel->iFrom = pWL
316d0 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70  oop->iTab;.    p
316e0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
316f0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
31700 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
31710 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d  om].iCursor;.  }
31720 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e  .  if( (pWInfo->
31730 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
31740 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d  RE_DISTINCTBY)==
31750 30 20 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  0 .   && pWInfo-
31760 3e 70 44 69 73 74 69 6e 63 74 0a 20 20 20 26 26  >pDistinct.   &&
31770 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20   nRowEst.  ){.  
31780 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65    Bitmask notUse
31790 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  d;.    int rc = 
317a0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
317b0 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
317c0 2c 20 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69  , pWInfo->pDisti
317d0 6e 63 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20  nct, pFrom,.    
317e0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
317f0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e  RE_DISTINCTBY, n
31800 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
31810 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
31820 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
31830 28 20 72 63 3d 3d 31 20 29 20 70 57 49 6e 66 6f  ( rc==1 ) pWInfo
31840 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
31850 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
31860 45 52 45 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ERED;.  }.  if( 
31870 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
31880 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   ){.    if( pWIn
31890 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
318a0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
318b0 59 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  Y ){.      pWInf
318c0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
318d0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
318e0 44 45 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  DERED;.    }else
318f0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
31900 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20 20 20  bOBSat = 1;.    
31910 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
31920 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
31930 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  op;.    }.  }.  
31940 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
31950 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a  = pFrom->nRow;..
31960 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72    /* Free tempor
31970 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72  ary memory and r
31980 65 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f  eturn success */
31990 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
319a0 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20  (db, pSpace);.  
319b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
319c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20  ;.}../*.** Most 
319d0 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79  queries use only
319e0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
319f0 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f  (they are not jo
31a00 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a  ins) and have.**
31a10 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74   simple == const
31a20 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69  raints against i
31a30 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20  ndexed fields.  
31a40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
31a50 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e  empts.** to plan
31a60 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61   those simple ca
31a70 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c  ses using much l
31a80 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61  ess ceremony tha
31a90 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c  n the.** general
31aa0 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
31ab0 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72  lanner, and ther
31ac0 65 62 79 20 79 69 65 6c 64 20 66 61 73 74 65 72  eby yield faster
31ad0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
31ae0 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20  ().** times for 
31af0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
31b00 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  .**.** Return no
31b10 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n-zero on succes
31b20 73 2c 20 69 66 20 74 68 69 73 20 71 75 65 72 79  s, if this query
31b30 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20   can be handled 
31b40 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72  by this.** no-fr
31b50 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e  ills query plann
31b60 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  er.  Return zero
31b70 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 6e   if this query n
31b80 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e  eeds the .** gen
31b90 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
31ba0 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73  ry planner..*/.s
31bb0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 53  tatic int whereS
31bc0 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f  hortCut(WhereLoo
31bd0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
31be0 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
31bf0 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75   *pWInfo;.  stru
31c00 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
31c10 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43  *pItem;.  WhereC
31c20 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
31c30 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
31c40 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
31c50 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  op;.  int iCur;.
31c60 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65    int j;.  Table
31c70 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
31c80 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e  *pIdx;.  .  pWIn
31c90 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
31ca0 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49  WInfo;.  if( pWI
31cb0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
31cc0 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41  & WHERE_FORCE_TA
31cd0 42 4c 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  BLE ) return 0;.
31ce0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
31cf0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
31d00 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d  >=1 );.  pItem =
31d10 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
31d20 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70  t->a;.  pTab = p
31d30 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66  Item->pTab;.  if
31d40 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
31d50 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
31d60 69 66 28 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65  if( pItem->zInde
31d70 78 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  x ) return 0;.  
31d80 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43  iCur = pItem->iC
31d90 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26  ursor;.  pWC = &
31da0 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70  pWInfo->sWC;.  p
31db0 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  Loop = pBuilder-
31dc0 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  >pNew;.  pLoop->
31dd0 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70  wsFlags = 0;.  p
31de0 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
31df0 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30  pWC, iCur, -1, 0
31e00 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 69  , WO_EQ, 0);.  i
31e10 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
31e20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
31e30 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
31e40 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  |WHERE_IPK|WHERE
31e50 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f  _ONEROW;.    pLo
31e60 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  op->aLTerm[0] = 
31e70 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70  pTerm;.    pLoop
31e80 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
31e90 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
31ea0 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a  .nEq = 1;.    /*
31eb0 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
31ec0 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20   a rowid lookup 
31ed0 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f  is 10 */.    pLo
31ee0 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20  op->rRun = 33;  
31ef0 2f 2a 20 33 33 3d 3d 77 68 65 72 65 43 6f 73 74  /* 33==whereCost
31f00 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  (10) */.  }else{
31f10 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
31f20 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
31f30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
31f40 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
31f50 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
31f60 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65  _None ) continue
31f70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
31f80 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
31f90 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
31fa0 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
31fb0 28 70 57 43 2c 20 69 43 75 72 2c 20 70 49 64 78  (pWC, iCur, pIdx
31fc0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30  ->aiColumn[j], 0
31fd0 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 3b 0a  , WO_EQ, pIdx);.
31fe0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
31ff0 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
32000 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 52        whereLoopR
32010 65 73 69 7a 65 28 70 57 49 6e 66 6f 2d 3e 70 50  esize(pWInfo->pP
32020 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
32030 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f   j);.        pLo
32040 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20  op->aLTerm[j] = 
32050 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
32060 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78       if( j!=pIdx
32070 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->nColumn ) cont
32080 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  inue;.      pLoo
32090 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
320a0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
320b0 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f  RE_ONEROW|WHERE_
320c0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69  INDEXED;.      i
320d0 66 28 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73  f( (pItem->colUs
320e0 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49  ed & ~columnsInI
320f0 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29  ndex(pIdx))==0 )
32100 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
32110 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
32120 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
32130 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d    }.      pLoop-
32140 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20  >nLTerm = j;.   
32150 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
32160 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20  e.nEq = j;.     
32170 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
32180 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
32190 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
321a0 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65  Cost of a unique
321b0 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73   index lookup is
321c0 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f   15 */.      pLo
321d0 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20  op->rRun = 39;  
321e0 2f 2a 20 33 39 3d 3d 77 68 65 72 65 43 6f 73 74  /* 39==whereCost
321f0 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72  (15) */.      br
32200 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
32210 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
32220 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70  ags ){.    pLoop
32230 2d 3e 6e 4f 75 74 20 3d 20 28 57 68 65 72 65 43  ->nOut = (WhereC
32240 6f 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66  ost)1;.    pWInf
32250 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d  o->a[0].pWLoop =
32260 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f   pLoop;.    pLoo
32270 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65  p->maskSelf = ge
32280 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
32290 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
322a0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
322b0 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b  .iTabCur = iCur;
322c0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  .    pWInfo->nRo
322d0 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  wOut = 1;.    if
322e0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
322f0 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42  By ) pWInfo->bOB
32300 53 61 74 20 3d 20 20 31 3b 0a 20 20 20 20 69 66  Sat =  1;.    if
32310 28 20 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69  ( pWInfo->pDisti
32320 6e 63 74 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44  nct ) pWInfo->eD
32330 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
32340 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
32350 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
32360 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  EBUG.    pLoop->
32370 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69  cId = '0';.#endi
32380 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  f.    return 1;.
32390 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
323a0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
323b0 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
323c0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
323d0 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
323e0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
323f0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
32400 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
32410 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
32420 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
32430 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
32440 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
32450 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
32460 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
32470 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
32480 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
32490 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
324a0 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
324b0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
324c0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
324d0 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
324e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
324f0 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
32500 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
32510 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
32520 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
32530 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
32540 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
32550 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
32560 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
32570 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
32580 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
32590 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
325a0 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
325b0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
325c0 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
325d0 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
325e0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
325f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
32600 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
32610 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
32620 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
32630 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
32640 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
32650 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
32660 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
32670 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
32680 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
32690 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
326a0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
326b0 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
326c0 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
326d0 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
326e0 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
326f0 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
32700 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
32710 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
32720 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
32730 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
32740 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
32750 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
32760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32770 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
32780 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
32790 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
327a0 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
327b0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
327c0 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
327d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327e0 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
327f0 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
32800 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
32810 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
32820 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
32830 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
32840 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
32850 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
32860 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
32870 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
32880 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
32890 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
328a0 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
328b0 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
328c0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
328d0 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
328e0 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
328f0 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
32900 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
32910 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
32920 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
32930 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
32940 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
32950 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
32960 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
32970 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
32980 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
32990 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
329a0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
329b0 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
329c0 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
329d0 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
329e0 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
329f0 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
32a00 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
32a10 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
32a20 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
32a30 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
32a40 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
32a50 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
32a60 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
32a70 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
32a80 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
32a90 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
32aa0 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
32ab0 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
32ac0 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
32ad0 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
32ae0 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
32af0 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
32b00 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
32b10 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
32b20 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
32b30 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
32b40 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
32b50 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
32b60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
32b70 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
32b80 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
32b90 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
32ba0 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
32bb0 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
32bc0 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
32bd0 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
32be0 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
32bf0 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
32c00 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
32c10 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
32c20 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
32c30 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
32c40 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
32c50 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
32c60 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
32c70 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
32c80 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
32c90 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
32ca0 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
32cb0 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
32cc0 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
32cd0 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
32ce0 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
32cf0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
32d00 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
32d10 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
32d20 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
32d30 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
32d40 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
32d50 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
32d60 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
32d70 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
32d80 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
32d90 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
32da0 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
32db0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
32dc0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
32dd0 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
32de0 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
32df0 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
32e00 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
32e10 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
32e20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
32e30 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
32e40 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
32e50 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
32e60 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
32e70 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
32e80 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
32e90 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
32ea0 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
32eb0 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
32ec0 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
32ed0 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
32ee0 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
32ef0 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
32f00 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
32f10 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
32f20 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
32f30 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
32f40 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
32f50 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
32f60 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
32f70 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
32f80 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
32f90 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
32fa0 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
32fb0 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
32fc0 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
32fd0 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
32fe0 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
32ff0 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
33000 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
33010 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69  **.** pOrderBy i
33020 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
33030 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
33040 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
33050 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20  tatement,.** if 
33060 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49  there is one.  I
33070 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  f there is no OR
33080 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
33090 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
330a0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72  .** is called fr
330b0 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  om an UPDATE or 
330c0 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
330d0 2c 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20  , then pOrderBy 
330e0 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 57 68 65 72  is NULL..*/.Wher
330f0 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68  eInfo *sqlite3Wh
33100 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73  ereBegin(.  Pars
33110 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
33120 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
33130 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
33140 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
33150 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
33160 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65  all tables to be
33170 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78   scanned */.  Ex
33180 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
33190 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
331a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
331b0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
331c0 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42     /* An ORDER B
331d0 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  Y clause, or NUL
331e0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
331f0 2a 70 44 69 73 74 69 6e 63 74 2c 20 20 2f 2a 20  *pDistinct,  /* 
33200 54 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  The select-list 
33210 66 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65  for DISTINCT que
33220 72 69 65 73 20 2d 20 6f 72 20 4e 55 4c 4c 20 2a  ries - or NULL *
33230 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
33240 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs,       /* One
33250 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
33260 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
33270 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
33280 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 20 20    int iIdxCur   
33290 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48          /* If WH
332a0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
332b0 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20  Y is set, index 
332c0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f  cursor number */
332d0 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
332e0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
332f0 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
33300 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
33310 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
33320 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
33330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33340 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
33350 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
33360 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
33370 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
33380 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
33390 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
333a0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
333b0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
333c0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
333d0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
333e0 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
333f0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
33400 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
33410 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
33420 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
33430 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
33440 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
33450 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
33460 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
33470 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
33480 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
33490 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
334a0 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
334b0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
334c0 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
334d0 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
334e0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
334f0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
33500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
33510 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
33520 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
33530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
33540 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
33550 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
33560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33570 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
33580 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72 69  e */...  /* Vari
33590 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  able initializat
335a0 69 6f 6e 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ion */.  memset(
335b0 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66  &sWLB, 0, sizeof
335c0 28 73 57 4c 42 29 29 3b 0a 20 20 73 57 4c 42 2e  (sWLB));.  sWLB.
335d0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
335e0 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  rBy;..  /* The n
335f0 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
33600 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
33610 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
33620 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
33630 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
33640 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65  tmask .  */.  te
33650 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74  stcase( pTabList
33660 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20  ->nSrc==BMS );. 
33670 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
33680 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73  Src>BMS ){.    s
33690 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
336a0 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20  Parse, "at most 
336b0 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  %d tables in a j
336c0 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20  oin", BMS);.    
336d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
336e0 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
336f0 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72  n normally gener
33700 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f  ates a nested lo
33710 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  op for all table
33720 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c  s in .  ** pTabL
33730 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65  ist.  But if the
33740 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
33750 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
33760 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64  , then we should
33770 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72  .  ** only gener
33780 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
33790 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20   first table in 
337a0 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73  pTabList and ass
337b0 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e  ume that.  ** an
337c0 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  y cursors associ
337d0 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71  ated with subseq
337e0 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20  uent tables are 
337f0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
33800 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d   */.  nTabList =
33810 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
33820 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
33830 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69  LY) ? 1 : pTabLi
33840 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20  st->nSrc;..  /* 
33850 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
33860 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
33870 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
33880 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
33890 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
338a0 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65   value. A single
338b0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75   allocation is u
338c0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
338d0 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20   WhereInfo.  ** 
338e0 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74  struct, the cont
338f0 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66  ents of WhereInf
33900 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65  o.a[], the Where
33910 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
33920 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  .  ** and the Wh
33930 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63  ereMaskSet struc
33940 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72  ture. Since Wher
33950 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73  eClause contains
33960 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20   an 8-byte.  ** 
33970 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d  field (type Bitm
33980 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20  ask) it must be 
33990 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d  aligned on an 8-
339a0 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e  byte boundary on
339b0 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69  .  ** some archi
339c0 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20  tectures. Hence 
339d0 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c  the ROUND8() bel
339e0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20  ow..  */.  db = 
339f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42  pParse->db;.  nB
33a00 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44  yteWInfo = ROUND
33a10 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  8(sizeof(WhereIn
33a20 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29  fo)+(nTabList-1)
33a30 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
33a40 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  el));.  pWInfo =
33a50 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
33a60 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49  Zero(db, nByteWI
33a70 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65  nfo + sizeof(Whe
33a80 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20  reLoop));.  if( 
33a90 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
33aa0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
33ab0 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
33ac0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
33ad0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  0;.    goto wher
33ae0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
33af0 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  .  pWInfo->nLeve
33b00 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20  l = nTabList;.  
33b10 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
33b20 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
33b30 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
33b40 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
33b50 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
33b60 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d  derBy;.  pWInfo-
33b70 3e 70 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69  >pDistinct = pDi
33b80 73 74 69 6e 63 74 3b 0a 20 20 70 57 49 6e 66 6f  stinct;.  pWInfo
33b90 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ->iBreak = sqlit
33ba0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
33bb0 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  v);.  pWInfo->wc
33bc0 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
33bd0 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d  Flags;.  pWInfo-
33be0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
33bf0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
33c00 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65  yLoop;.  pMaskSe
33c10 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
33c20 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57  skSet;.  sWLB.pW
33c30 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20  Info = pWInfo;. 
33c40 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49   sWLB.pWC = &pWI
33c50 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42  nfo->sWC;.  sWLB
33c60 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f  .pNew = (WhereLo
33c70 6f 70 2a 29 26 70 57 49 6e 66 6f 2d 3e 61 5b 6e  op*)&pWInfo->a[n
33c80 54 61 62 4c 69 73 74 5d 3b 0a 20 20 77 68 65 72  TabList];.  wher
33c90 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70  eLoopInit(sWLB.p
33ca0 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  New);.#ifdef SQL
33cb0 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42  ITE_DEBUG.  sWLB
33cc0 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27  .pNew->cId = '*'
33cd0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  ;.#endif..  /* D
33ce0 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49  isable the DISTI
33cf0 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  NCT optimization
33d00 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69   if SQLITE_Disti
33d10 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69  nctOpt is set vi
33d20 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74  a.  ** sqlite3_t
33d30 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f  est_ctrl(SQLITE_
33d40 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
33d50 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20  ATIONS,...) */. 
33d60 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
33d70 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
33d80 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
33d90 29 20 29 20 70 44 69 73 74 69 6e 63 74 20 3d 20  ) ) pDistinct = 
33da0 30 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74  0;..  /* Split t
33db0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
33dc0 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75  into separate su
33dd0 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65  bexpressions whe
33de0 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62  re each.  ** sub
33df0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
33e00 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e  parated by an AN
33e10 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  D operator..  */
33e20 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70  .  initMaskSet(p
33e30 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72  MaskSet);.  wher
33e40 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49  eClauseInit(&pWI
33e50 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f  nfo->sWC, pWInfo
33e60 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
33e70 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50  CodeConstants(pP
33e80 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  arse, pWhere);. 
33e90 20 77 68 65 72 65 53 70 6c 69 74 28 26 70 57 49   whereSplit(&pWI
33ea0 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72 65  nfo->sWC, pWhere
33eb0 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a 20  , TK_AND);   /* 
33ec0 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35 33 32  IMP: R-15842-532
33ed0 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20  96 */.    .  /* 
33ee0 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20  Special case: a 
33ef0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
33f00 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t is constant.  
33f10 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a  Evaluate the.  *
33f20 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
33f30 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65   either jump ove
33f40 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64  r all of the cod
33f50 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a  e or fall thru..
33f60 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72    */.  if( pWher
33f70 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d  e && (nTabList==
33f80 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
33f90 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
33fa0 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20  n(pWhere)) ){.  
33fb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
33fc0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68  alse(pParse, pWh
33fd0 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  ere, pWInfo->iBr
33fe0 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  eak, SQLITE_JUMP
33ff0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68  IFNULL);.    pWh
34000 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ere = 0;.  }..  
34010 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
34020 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a   No FROM clause.
34030 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c    */.  if( nTabL
34040 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ist==0 ){.    if
34050 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ( pOrderBy ) pWI
34060 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b  nfo->bOBSat = 1;
34070 0a 20 20 20 20 69 66 28 20 70 44 69 73 74 69 6e  .    if( pDistin
34080 63 74 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44 69  ct ) pWInfo->eDi
34090 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
340a0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
340b0 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e    }..  /* Assign
340c0 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20   a bit from the 
340d0 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79  bitmask to every
340e0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
340f0 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
34100 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69   ** When assigni
34110 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65  ng bitmask value
34120 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  s to FROM clause
34130 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73   cursors, it mus
34140 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61  t be.  ** the ca
34150 73 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20  se that if X is 
34160 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
34170 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c  the N-th FROM cl
34180 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20  ause term then. 
34190 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20   ** the bitmask 
341a0 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61  for all FROM cla
341b0 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65  use terms to the
341c0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74   left of the N-t
341d0 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28  h term.  ** is (
341e0 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65  X-1).   An expre
341f0 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
34200 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
34210 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a  FT JOIN can use.
34220 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52    ** its Expr.iR
34230 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61  ightJoinTable va
34240 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  lue to find the 
34250 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72  bitmask of the r
34260 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ight table.  ** 
34270 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75  of the join.  Su
34280 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72  btracting one fr
34290 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62  om the right tab
342a0 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73  le bitmask gives
342b0 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20   a.  ** bitmask 
342c0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
342d0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
342e0 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67  e join.  Knowing
342f0 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a   the bitmask.  *
34300 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  * for all tables
34310 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
34320 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69  a left join is i
34330 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65  mportant.  Ticke
34340 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20  t #3015..  **.  
34350 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74  ** Note that bit
34360 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65  masks are create
34370 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69  d for all pTabLi
34380 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20  st->nSrc tables 
34390 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  in.  ** pTabList
343a0 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66  , not just the f
343b0 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61  irst nTabList ta
343c0 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20  bles.  nTabList 
343d0 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a  is normally.  **
343e0 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69   equal to pTabLi
343f0 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67  st->nSrc but mig
34400 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20  ht be shortened 
34410 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a  to 1 if the.  **
34420 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
34430 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
34440 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
34450 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
34460 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
34470 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
34480 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
34490 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
344a0 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
344b0 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61  UG.  {.    Bitma
344c0 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30  sk toTheLeft = 0
344d0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
344e0 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ii<pTabList->nSr
344f0 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
34500 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d  Bitmask m = getM
34510 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
34520 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
34530 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73  ursor);.      as
34540 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54  sert( (m-1)==toT
34550 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  heLeft );.      
34560 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a  toTheLeft |= m;.
34570 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
34580 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ..  /* Analyze a
34590 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70  ll of the subexp
345a0 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20  ressions.  Note 
345b0 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65  that exprAnalyze
345c0 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64  () might.  ** ad
345d0 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  d new virtual te
345e0 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  rms onto the end
345f0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
34600 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ause.  We do not
34610 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e  .  ** want to an
34620 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74  alyze these virt
34630 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74  ual terms, so st
34640 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74  art analyzing at
34650 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e   the end.  ** an
34660 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73  d work forward s
34670 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64  o that the added
34680 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61   virtual terms a
34690 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73  re never process
346a0 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41  ed..  */.  exprA
346b0 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69  nalyzeAll(pTabLi
346c0 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  st, &pWInfo->sWC
346d0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
346e0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
346f0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
34700 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Error;.  }..  /*
34710 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
34720 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63   (or GROUP BY) c
34730 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 72  lause contains r
34740 65 66 65 72 65 6e 63 65 73 20 74 6f 20 67 65 6e  eferences to gen
34750 65 72 61 6c 0a 20 20 2a 2a 20 65 78 70 72 65 73  eral.  ** expres
34760 73 69 6f 6e 73 2c 20 74 68 65 6e 20 77 65 20 77  sions, then we w
34770 6f 6e 27 74 20 62 65 20 61 62 6c 65 20 74 6f 20  on't be able to 
34780 73 61 74 69 73 66 79 20 69 74 20 75 73 69 6e 67  satisfy it using
34790 20 69 6e 64 69 63 65 73 2c 20 73 6f 0a 20 20 2a   indices, so.  *
347a0 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  * go ahead and d
347b0 69 73 61 62 6c 65 20 69 74 20 6e 6f 77 2e 0a 20  isable it now.. 
347c0 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
347d0 42 79 20 26 26 20 70 44 69 73 74 69 6e 63 74 20  By && pDistinct 
347e0 29 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ){.    for(ii=0;
347f0 20 69 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45   ii<pOrderBy->nE
34800 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
34810 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
34820 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
34830 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
34840 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20  >a[ii].pExpr);. 
34850 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
34860 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
34870 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
34880 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
34890 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
348a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
348b0 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
348c0 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
348d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
348e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
348f0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
34900 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
34910 69 65 72 2c 20 69 66 20 74 68 65 72 65 20 69 73  ier, if there is
34920 20 6f 6e 65 2c 20 69 73 20 72 65 64 75 6e 64 61   one, is redunda
34930 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20 69 74 20  nt. .  ** If it 
34940 69 73 2c 20 74 68 65 6e 20 73 65 74 20 70 44 69  is, then set pDi
34950 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c 4c 20 61  stinct to NULL a
34960 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e 65 44 69  nd WhereInfo.eDi
34970 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a 2a 20 57  stinct to.  ** W
34980 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
34990 49 51 55 45 20 74 6f 20 74 65 6c 6c 20 74 68 65  IQUE to tell the
349a0 20 63 61 6c 6c 65 72 20 74 6f 20 69 67 6e 6f 72   caller to ignor
349b0 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 2e 0a  e the DISTINCT..
349c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 69 73 74    */.  if( pDist
349d0 69 6e 63 74 20 29 7b 0a 20 20 20 20 69 66 28 20  inct ){.    if( 
349e0 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
349f0 61 6e 74 28 70 50 61 72 73 65 2c 70 54 61 62 4c  ant(pParse,pTabL
34a00 69 73 74 2c 26 70 57 49 6e 66 6f 2d 3e 73 57 43  ist,&pWInfo->sWC
34a10 2c 70 44 69 73 74 69 6e 63 74 29 20 29 7b 0a 20  ,pDistinct) ){. 
34a20 20 20 20 20 20 70 44 69 73 74 69 6e 63 74 20 3d       pDistinct =
34a30 20 30 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   0;.      pWInfo
34a40 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
34a50 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
34a60 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  QUE;.    }else i
34a70 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
34a80 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
34a90 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48  wctrlFlags |= WH
34aa0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a  ERE_DISTINCTBY;.
34ab0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
34ac0 72 64 65 72 42 79 20 3d 20 70 44 69 73 74 69 6e  rderBy = pDistin
34ad0 63 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ct;.    }.  }.. 
34ae0 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
34af0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
34b00 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45 54 52  cts */.  WHERETR
34b10 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a  ACE(0xffff,("***
34b20 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74   Optimizer Start
34b30 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66 28   ***\n"));.  if(
34b40 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20   nTabList!=1 || 
34b50 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73  whereShortCut(&s
34b60 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  WLB)==0 ){.    r
34b70 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
34b80 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20  All(&sWLB);.    
34b90 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
34ba0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
34bb0 20 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79   .    /* Display
34bc0 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72   all of the Wher
34bd0 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 66  eLoop objects if
34be0 20 77 68 65 72 65 74 72 61 63 65 20 69 73 20 65   wheretrace is e
34bf0 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64 65 66  nabled */.#ifdef
34c00 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
34c10 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
34c20 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
34c30 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  .      WhereLoop
34c40 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   *p;.      int i
34c50 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 74   = 0;.      stat
34c60 69 63 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d  ic char zLabel[]
34c70 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62   = "0123456789ab
34c80 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
34c90 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20  stuvwyxz".      
34ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34cc0 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
34cd0 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20  OPQRSTUVWYXZ";. 
34ce0 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66       for(p=pWInf
34cf0 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 3b 20 70 3d  o->pLoops; p; p=
34d00 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
34d10 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20         p->cId = 
34d20 7a 4c 61 62 65 6c 5b 28 69 2b 2b 29 25 73 69 7a  zLabel[(i++)%siz
34d30 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20  eof(zLabel)];.  
34d40 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
34d50 72 69 6e 74 28 70 2c 20 70 54 61 62 4c 69 73 74  rint(p, pTabList
34d60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
34d70 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77  .#endif.  .    w
34d80 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70  herePathSolver(p
34d90 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69  WInfo, 0);.    i
34da0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
34db0 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
34dc0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
34dd0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
34de0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77  erBy ){.       w
34df0 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70  herePathSolver(p
34e00 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e  WInfo, pWInfo->n
34e10 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20  RowOut+1);.     
34e20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
34e30 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
34e40 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
34e50 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
34e60 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d  WInfo->pOrderBy=
34e70 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73  =0 && (db->flags
34e80 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73   & SQLITE_Revers
34e90 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20  eOrder)!=0 ){.  
34ea0 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
34eb0 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d  sk = (Bitmask)(-
34ec0 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  1);.  }.  if( pP
34ed0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45  arse->nErr || NE
34ee0 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  VER(db->mallocFa
34ef0 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  iled) ){.    got
34f00 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
34f10 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48  r;.  }.#ifdef WH
34f20 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
34f30 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
34f40 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ereTrace ){.    
34f50 69 6e 74 20 69 69 3b 0a 20 20 20 20 73 71 6c 69  int ii;.    sqli
34f60 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
34f70 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52  ---- Solution nR
34f80 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e  ow=%d", pWInfo->
34f90 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69 66  nRowOut);.    if
34fa0 28 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74  ( pWInfo->bOBSat
34fb0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
34fc0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f  3DebugPrintf(" O
34fd0 52 44 45 52 42 59 3d 30 78 25 6c 6c 78 22 2c 20  RDERBY=0x%llx", 
34fe0 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29  pWInfo->revMask)
34ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
35000 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  ch( pWInfo->eDis
35010 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63  tinct ){.      c
35020 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
35030 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20  CT_UNIQUE: {.   
35040 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
35050 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49  gPrintf("  DISTI
35060 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20  NCT=unique");.  
35070 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35080 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
35090 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
350a0 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
350b0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
350c0 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
350d0 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  =ordered");.    
350e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
350f0 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
35100 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
35110 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
35120 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
35130 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
35140 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  =unordered");.  
35150 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35160 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
35170 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
35180 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  f("\n");.    for
35190 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69  (ii=0; ii<nTabLi
351a0 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  st; ii++){.     
351b0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
351c0 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57  pWInfo->a[ii].pW
351d0 4c 6f 6f 70 2c 20 70 54 61 62 4c 69 73 74 29 3b  Loop, pTabList);
351e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
351f0 66 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  f.  WHERETRACE(0
35200 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69  xffff,("*** Opti
35210 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a  mizer Finished *
35220 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66  **\n"));.  pWInf
35230 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  o->pParse->nQuer
35240 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d  yLoop += pWInfo-
35250 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20  >nRowOut;..  /* 
35260 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
35270 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
35280 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
35290 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
352a0 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
352b0 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
352c0 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
352d0 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
352e0 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f  iate..  ** The o
352f0 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
35300 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  m only works if 
35310 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
35320 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
35330 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
35340 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67  to update a sing
35350 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61  le row..  */.  a
35360 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
35370 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
35380 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
35390 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
353a0 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
353b0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
353c0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
353d0 29 21 3d 30 20 0a 20 20 20 26 26 20 28 70 57 49  )!=0 .   && (pWI
353e0 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
353f0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
35400 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 20 29 7b 0a  E_ONEROW)!=0 ){.
35410 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e      pWInfo->okOn
35420 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70  ePass = 1;.    p
35430 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
35440 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e  op->wsFlags &= ~
35450 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
35460 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
35470 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
35480 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e   pTabList and an
35490 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74  y indices select
354a0 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72  ed for.  ** sear
354b0 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c  ching those tabl
354c0 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
354d0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
354e0 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20  ma(pParse, -1); 
354f0 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f  /* Insert the co
35500 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f  okie verifier Go
35510 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  to */.  notReady
35520 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
35530 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76    for(ii=0, pLev
35540 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69  el=pWInfo->a; ii
35550 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c  <nTabList; ii++,
35560 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
35570 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
35580 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
35590 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
355a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
355b0 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
355c0 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
355d0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72  index */.    str
355e0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
355f0 20 2a 70 54 61 62 49 74 65 6d 3b 0a 20 20 20 20   *pTabItem;.    
35600 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
35610 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  ;..    pTabItem 
35620 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
35630 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
35640 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74     pTab = pTabIt
35650 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44  em->pTab;.    iD
35660 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
35670 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
35680 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
35690 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
356a0 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  >pWLoop;.    if(
356b0 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
356c0 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
356d0 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
356e0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lect ){.      /*
356f0 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
35700 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66     }else.#ifndef
35710 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
35720 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
35730 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
35740 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
35750 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
35760 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
35770 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
35780 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
35790 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
357a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  ;.      int iCur
357b0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
357c0 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
357d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
357e0 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
357f0 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34   0, 0, pVTab, P4
35800 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
35810 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
35820 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  pTab) ){.      /
35830 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65  * noop */.    }e
35840 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
35850 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
35860 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
35870 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
35880 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
35890 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
358a0 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20  N_CLOSE)==0 ){. 
358b0 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57       int op = pW
358c0 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
358d0 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a  ? OP_OpenWrite :
358e0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20   OP_OpenRead;.  
358f0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
35900 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
35910 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
35920 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a  iDb, pTab, op);.
35930 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
35940 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
35950 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
35960 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
35970 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49 6e   testcase( !pWIn
35980 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
35990 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
359a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
359b0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
359c0 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42   && pTab->nCol<B
359d0 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69  MS ){.        Bi
359e0 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74  tmask b = pTabIt
359f0 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  em->colUsed;.   
35a00 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
35a10 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b          for(; b;
35a20 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a   b=b>>1, n++){}.
35a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
35a40 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73  dbeChangeP4(v, s
35a50 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
35a60 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20  tAddr(v)-1, .   
35a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a80 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
35a90 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50  INT_TO_PTR(n), P
35aa0 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
35ab0 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
35ac0 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
35ad0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
35ae0 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
35af0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
35b00 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
35b10 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
35b20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
35b30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
35b40 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28  IC_INDEX.    if(
35b50 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
35b60 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
35b70 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
35b80 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
35b90 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
35ba0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70   &pWInfo->sWC, p
35bb0 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64  TabItem, notRead
35bc0 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  y, pLevel);.    
35bd0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
35be0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
35bf0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
35c00 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  XED ){.      Ind
35c10 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d  ex *pIx = pLoop-
35c20 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
35c30 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
35c40 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
35c50 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
35c60 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 2f  e, pIx);.      /
35c70 2a 20 46 49 58 4d 45 3a 20 20 41 73 20 61 6e 20  * FIXME:  As an 
35c80 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 65  optimization use
35c90 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
35ca0 6f 72 20 69 66 20 57 48 45 52 45 5f 49 44 58 5f  or if WHERE_IDX_
35cb0 4f 4e 4c 59 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ONLY */.      in
35cc0 74 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c  t iIndexCur = pL
35cd0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
35ce0 69 49 64 78 43 75 72 20 3f 20 69 49 64 78 43 75  iIdxCur ? iIdxCu
35cf0 72 20 3a 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r : pParse->nTab
35d00 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
35d10 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
35d20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
35d30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
35d40 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
35d50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35d60 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
35d70 6e 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75 72  nRead, iIndexCur
35d80 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  , pIx->tnum, iDb
35d90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35da0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
35db0 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
35dc0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
35dd0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
35de0 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61  , "%s", pIx->zNa
35df0 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  me));.    }.    
35e00 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
35e10 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
35e20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  iDb);.    notRea
35e30 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26  dy &= ~getMask(&
35e40 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
35e50 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
35e60 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  sor);.  }.  pWIn
35e70 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
35e80 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
35e90 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
35ea0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
35eb0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
35ec0 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
35ed0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
35ee0 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
35ef0 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
35f00 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
35f10 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
35f20 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
35f30 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
35f40 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
35f50 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
35f60 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
35f70 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
35f80 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
35f90 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65  ; ii++){.    pLe
35fa0 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
35fb0 5b 69 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69  [ii];.    explai
35fc0 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c  nOneScan(pParse,
35fd0 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
35fe0 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  l, ii, pLevel->i
35ff0 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73  From, wctrlFlags
36000 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
36010 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  = codeOneLoopSta
36020 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e  rt(pWInfo, ii, n
36030 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
36040 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
36050 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
36060 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  nt;.  }..  /* Do
36070 6e 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ne. */.  return 
36080 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
36090 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
360a0 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
360b0 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
360c0 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
360d0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
360e0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
360f0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
36100 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
36110 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
36120 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
36130 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
36140 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
36150 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
36160 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
36170 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
36180 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
36190 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
361a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
361b0 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
361c0 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
361d0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
361e0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
361f0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
36200 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
36210 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
36220 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f  Level;.  WhereLo
36230 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63  op *pLoop;.  Src
36240 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
36250 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
36260 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
36270 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
36280 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
36290 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
362a0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ode..  */.  sqli
362b0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
362c0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
362d0 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  (i=pWInfo->nLeve
362e0 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
362f0 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
36300 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
36310 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
36320 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c  >pWLoop;.    sql
36330 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
36340 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
36350 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69  addrCont);.    i
36360 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f  f( pLevel->op!=O
36370 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
36380 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36390 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  2(v, pLevel->op,
363a0 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
363b0 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20  vel->p2);.      
363c0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
363d0 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
363e0 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  5);.    }.    if
363f0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
36400 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
36410 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   && pLevel->u.in
36420 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  .nIn>0 ){.      
36430 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
36440 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  In;.      int j;
36450 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36460 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
36470 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  , pLevel->addrNx
36480 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
36490 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
364a0 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75  , pIn=&pLevel->u
364b0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d  .in.aInLoop[j-1]
364c0 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d  ; j>0; j--, pIn-
364d0 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -){.        sqli
364e0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
364f0 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
36500 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  p+1);.        sq
36510 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
36520 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
36530 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  Op, pIn->iCur, p
36540 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
36550 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
36560 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
36570 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
36580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36590 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
365a0 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
365b0 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
365c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
365d0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
365e0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
365f0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
36600 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
36610 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
36620 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
36630 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
36640 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d  P_IfPos, pLevel-
36650 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
36660 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
36670 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
36680 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
36690 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
366a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
366b0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
366c0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
366d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
366e0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
366f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
36700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
36710 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
36720 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
36730 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
36740 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
36750 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
36760 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
36770 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36780 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
36790 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
367a0 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
367b0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
367c0 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20  ->op==OP_Return 
367d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
367e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
367f0 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c  OP_Gosub, pLevel
36800 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  ->p1, pLevel->ad
36810 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
36820 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
36830 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
36840 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
36850 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
36860 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
36870 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
36880 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
36890 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
368a0 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e  The "break" poin
368b0 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20  t is here, just 
368c0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
368d0 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
368e0 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a    ** Set it..  *
368f0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
36900 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
36910 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
36920 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
36930 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
36940 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20  hat were opened 
36950 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
36960 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  egin..  */.  ass
36970 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ert( pWInfo->nLe
36980 76 65 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f  vel==1 || pWInfo
36990 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69  ->nLevel==pTabLi
369a0 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f  st->nSrc );.  fo
369b0 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
369c0 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66  Info->a; i<pWInf
369d0 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20  o->nLevel; i++, 
369e0 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49  pLevel++){.    I
369f0 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a  ndex *pIdx = 0;.
36a00 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
36a10 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
36a20 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
36a30 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
36a40 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
36a50 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
36a60 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
36a70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c  Tab!=0 );.    pL
36a80 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
36a90 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70  Loop;.    if( (p
36aa0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
36ab0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
36ac0 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70  .     && pTab->p
36ad0 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26  Select==0.     &
36ae0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
36af0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
36b00 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
36b10 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
36b20 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  nt ws = pLoop->w
36b30 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66  sFlags;.      if
36b40 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
36b50 50 61 73 73 20 26 26 20 28 77 73 20 26 20 57 48  Pass && (ws & WH
36b60 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
36b70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
36b80 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
36b90 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49   OP_Close, pTabI
36ba0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
36bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
36bc0 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44   (ws & WHERE_IND
36bd0 45 58 45 44 29 21 3d 30 20 26 26 20 28 77 73 20  EXED)!=0 && (ws 
36be0 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  & (WHERE_IPK|WHE
36bf0 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 29 3d  RE_TEMP_INDEX))=
36c00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
36c10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
36c20 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65  v, OP_Close, pLe
36c30 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
36c40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
36c50 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61    /* If this sca
36c60 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c  n uses an index,
36c70 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65 20   make VDBE code 
36c80 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f  substitutions to
36c90 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a   read data.    *
36ca0 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  * from the index
36cb0 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f 6d   instead of from
36cc0 20 74 68 65 20 74 61 62 6c 65 20 77 68 65 72 65   the table where
36cd0 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20 73   possible.  In s
36ce0 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a 2a  ome cases.    **
36cf0 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
36d00 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  on prevents the 
36d10 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72 20  table from ever 
36d20 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69 63  being read, whic
36d30 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65  h can.    ** yie
36d40 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74  ld a significant
36d50 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
36d60 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  st..    ** .    
36d70 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20  ** Calls to the 
36d80 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
36d90 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65  n between sqlite
36da0 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a  3WhereBegin and.
36db0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68      ** sqlite3Wh
36dc0 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65  ereEnd will have
36dd0 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68   created code th
36de0 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  at references th
36df0 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64  e table.    ** d
36e00 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c  irectly.  This l
36e10 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68  oop scans all th
36e20 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20  at code looking 
36e30 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20  for opcodes.    
36e40 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ** that referenc
36e50 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  e the table and 
36e60 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e  converts them in
36e70 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a  to opcodes that.
36e80 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
36e90 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
36ea0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  */.    if( pLoop
36eb0 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
36ec0 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45  RE_INDEXED|WHERE
36ed0 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20  _IDX_ONLY) ){.  
36ee0 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70      pIdx = pLoop
36ef0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
36f00 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
36f10 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
36f20 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
36f30 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  ){.      pIdx = 
36f40 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
36f50 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
36f60 20 70 49 64 78 20 26 26 20 21 64 62 2d 3e 6d 61   pIdx && !db->ma
36f70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
36f80 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61      int k, j, la
36f90 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  st;.      VdbeOp
36fa0 20 2a 70 4f 70 3b 0a 0a 20 20 20 20 20 20 70 4f   *pOp;..      pO
36fb0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
36fc0 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  etOp(v, pWInfo->
36fd0 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73  iTop);.      las
36fe0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
36ff0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
37000 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66       for(k=pWInf
37010 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b  o->iTop; k<last;
37020 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   k++, pOp++){.  
37030 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
37040 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  1!=pLevel->iTabC
37050 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
37060 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
37070 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
37080 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  n ){.          f
37090 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
370a0 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
370b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
370c0 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69  Op->p2==pIdx->ai
370d0 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20  Column[j] ){.   
370e0 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
370f0 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  p2 = j;.        
37100 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
37110 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
37120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
37130 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
37140 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
37150 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
37160 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
37170 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
37180 4c 59 29 3d 3d 30 20 7c 7c 20 6a 3c 70 49 64 78  LY)==0 || j<pIdx
37190 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ->nColumn );.   
371a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
371b0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
371c0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
371d0 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
371e0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
371f0 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
37200 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
37210 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37220 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
37230 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75   /* Final cleanu
37240 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  p.  */.  pParse-
37250 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
37260 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
37270 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e  yLoop;.  whereIn
37280 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
37290 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  o);.  return;.}.