/ Hex Artifact Content
Login

Artifact 85b7b80a350951444c8e3e45bf2f7e6cc6d34683:


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 57 43 20 3d 20 70 53 63  .      pWC = pSc
8930: 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d  an->pWC = pScan-
8940: 3e 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20  >pWC->pOuter;.  
8950: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d      k = 0;.    }
8960: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  .    pScan->pWC 
8970: 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43  = pScan->pOrigWC
8980: 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20  ;.    k = 0;.   
8990: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b   pScan->iEquiv +
89a0: 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 2;.  }.  retur
89b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
89c0: 69 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45  itialize a WHERE
89d0: 20 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20   clause scanner 
89e0: 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20  object.  Return 
89f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8a00: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e  .** first match.
8a10: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
8a20: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61   there are no ma
8a30: 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tches..**.** The
8a40: 20 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65   scanner will be
8a50: 20 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57   searching the W
8a60: 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e  HERE clause pWC.
8a70: 20 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a    It will look.*
8a80: 2a 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74  * for terms of t
8a90: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
8aa0: 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20  <expr>" where X 
8ab0: 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d  is column iColum
8ac0: 6e 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43  n of table.** iC
8ad0: 75 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75  ur.  The <op> mu
8ae0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  st be one of the
8af0: 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72   operators descr
8b00: 69 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a  ibed by opMask..
8b10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61  **.** If the sea
8b20: 72 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64  rch is for X and
8b30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
8b40: 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73  e contains terms
8b50: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
8b60: 58 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f  X=Y then this ro
8b70: 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f  utine might also
8b80: 20 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66   return terms of
8b90: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20   the form.** "Y 
8ba0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54  <op> <expr>".  T
8bb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  he number of lev
8bc0: 65 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76  els of transitiv
8bd0: 69 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a  ity is limited,.
8be0: 2a 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68  ** but is enough
8bf0: 20 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20   to handle most 
8c00: 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69  commonly occurri
8c10: 6e 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ng SQL statement
8c20: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73  s..**.** If X is
8c30: 20 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52   not the INTEGER
8c40: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65   PRIMARY KEY the
8c50: 6e 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70  n X must be comp
8c60: 61 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69  atible with.** i
8c70: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 57 68  ndex pIdx..*/.Wh
8c80: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
8c90: 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53  anInit(.  WhereS
8ca0: 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20  can *pScan,     
8cb0: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63    /* The WhereSc
8cc0: 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  an object being 
8cd0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
8ce0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
8cf0: 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C,       /* The 
8d00: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
8d10: 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
8d20: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
8d30: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
8d40: 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  r to scan for */
8d50: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
8d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
8d70: 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72  lumn to scan for
8d80: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b   */.  u32 opMask
8d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
8da0: 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20   Operator(s) to 
8db0: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e  scan for */.  In
8dc0: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
8dd0: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
8de0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
8df0: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29   this index */.)
8e00: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a  {.  int j;..  /*
8e10: 20 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30   memset(pScan, 0
8e20: 2c 20 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29  , sizeof(*pScan)
8e30: 29 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70  ); */.  pScan->p
8e40: 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20  OrigWC = pWC;.  
8e50: 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43  pScan->pWC = pWC
8e60: 3b 0a 20 20 69 66 28 20 70 49 64 78 20 26 26 20  ;.  if( pIdx && 
8e70: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
8e80: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
8e90: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
8ea0: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
8eb0: 66 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28  finity;.    for(
8ec0: 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c  j=0; pIdx->aiCol
8ed0: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
8ee0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
8ef0: 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e   NEVER(j>=pIdx->
8f00: 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72  nColumn) ) retur
8f10: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
8f20: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
8f30: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  = pIdx->azColl[j
8f40: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
8f50: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
8f60: 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43  0;.    pScan->zC
8f70: 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ollName = 0;.  }
8f80: 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b  .  pScan->opMask
8f90: 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63   = opMask;.  pSc
8fa0: 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63  an->k = 0;.  pSc
8fb0: 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20  an->aEquiv[0] = 
8fc0: 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61  iCur;.  pScan->a
8fd0: 45 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75  Equiv[1] = iColu
8fe0: 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71  mn;.  pScan->nEq
8ff0: 75 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e  uiv = 2;.  pScan
9000: 2d 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->iEquiv = 2;.  
9010: 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e  return whereScan
9020: 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a  Next(pScan);.}..
9030: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
9040: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
9050: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
9060: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
9070: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
9080: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
9090: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
90a0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
90b0: 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20  e iCur and <op> 
90c0: 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65  is one of.** the
90d0: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
90e0: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
90f0: 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  by the op parame
9100: 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ter..** Return a
9110: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
9120: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
9130: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
9140: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74  .** The term ret
9150: 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59  urned might by Y
9160: 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65  =<expr> if there
9170: 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73   is another cons
9180: 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  traint in.** the
9190: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
91a0: 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61  at specifies tha
91b0: 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68  t X=Y.  Any such
91c0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c   constraints wil
91d0: 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69  l be.** identifi
91e0: 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55  ed by the WO_EQU
91f0: 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54  IV bit in the pT
9200: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66  erm->eOperator f
9210: 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45  ield.  The.** aE
9220: 71 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c  quiv[] array hol
9230: 64 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73  ds X and all its
9240: 20 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69   equivalents, wi
9250: 74 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69  th each SQL vari
9260: 61 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75  able.** taking u
9270: 70 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61  p two slots in a
9280: 45 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69  Equiv[].  The fi
9290: 72 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20  rst slot is for 
92a0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
92b0: 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63  r.** and the sec
92c0: 6f 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63  ond is for the c
92d0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54  olumn number.  T
92e0: 68 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74  here are 22 slot
92f0: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a  s in aEquiv[].**
9300: 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77   so that means w
9310: 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58  e can look for X
9320: 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f   plus up to 10 o
9330: 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ther equivalent 
9340: 76 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65  values..** Hence
9350: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20   a search for X 
9360: 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70  will return <exp
9370: 72 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41  r> if X=A1 and A
9380: 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a  1=A2 and A2=A3.*
9390: 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39  * and ... and A9
93a0: 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78  =A10 and A10=<ex
93b0: 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pr>..**.** If th
93c0: 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65  ere are multiple
93d0: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
93e0: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
93f0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
9400: 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74  expr>".** then t
9410: 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77  ry for the one w
9420: 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63  ith no dependenc
9430: 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20  ies on <expr> - 
9440: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77  in other words w
9450: 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69  here.** <expr> i
9460: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  s a constant exp
9470: 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20  ression of some 
9480: 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75  kind.  Only retu
9490: 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a  rn entries of.**
94a0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
94b0: 3e 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20  > Y" where Y is 
94c0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74  a column in anot
94d0: 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20  her table if no 
94e0: 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20  terms of.** the 
94f0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f  form "X <op> <co
9500: 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74  nst-expr>" exist
9510: 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20  .   If no terms 
9520: 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
9530: 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72  RHS.** exist, tr
9540: 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65  y to return a te
9550: 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  rm that does not
9560: 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a   use WO_EQUIV..*
9570: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
9580: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
9590: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
95a0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
95b0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
95c0: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
95d0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
95e0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
95f0: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
9600: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
9610: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
9620: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
9630: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
9640: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
9650: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
9660: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
9670: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20   */.  u32 op,   
9680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
9690: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
96a0: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
96b0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
96c0: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
96d0: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
96e0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
96f0: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
9700: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
9710: 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74  ereTerm *pResult
9720: 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72   = 0;.  WhereTer
9730: 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61  m *p;.  WhereSca
9740: 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77  n scan;..  p = w
9750: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
9760: 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69  an, pWC, iCur, i
9770: 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78  Column, op, pIdx
9780: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
9790: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
97a0: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
97b0: 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ady)==0 ){.     
97c0: 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69   if( p->prereqRi
97d0: 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f  ght==0 && (p->eO
97e0: 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d  perator&WO_EQ)!=
97f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
9800: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
9810: 20 20 20 20 20 69 66 28 20 70 52 65 73 75 6c 74       if( pResult
9820: 3d 3d 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20  ==0 ) pResult = 
9830: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  p;.    }.    p =
9840: 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
9850: 73 63 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  scan);.  }.  ret
9860: 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a  urn pResult;.}..
9870: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
9880: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
9890: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
98a0: 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43  SrcList*, WhereC
98b0: 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  lause*, int);../
98c0: 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e  *.** Call exprAn
98d0: 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72  alyze on all ter
98e0: 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  ms in a WHERE cl
98f0: 61 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  ause.  .*/.stati
9900: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
9910: 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74  zeAll(.  SrcList
9920: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
9930: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
9940: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
9950: 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20  lause *pWC      
9960: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
9970: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61  clause to be ana
9980: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lyzed */.){.  in
9990: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  t i;.  for(i=pWC
99a0: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
99b0: 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41   i--){.    exprA
99c0: 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c  nalyze(pTabList,
99d0: 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a   pWC, i);.  }.}.
99e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
99f0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
9a00: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65  ZATION./*.** Che
9a10: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
9a20: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
9a30: 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47  n is a LIKE or G
9a40: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61  LOB operator tha
9a50: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69  t.** can be opti
9a60: 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71  mized using ineq
9a70: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
9a80: 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ts.  Return TRUE
9a90: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20   if it is.** so 
9aa0: 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
9ab0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
9ac0: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
9ad0: 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69  r to be optimizi
9ae0: 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73  ble, the RHS mus
9af0: 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a  t be a string.**
9b00: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f   literal that do
9b10: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
9b20: 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a  h a wildcard.  .
9b30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
9b40: 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61  LikeOrGlob(.  Pa
9b50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9b60: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
9b70: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
9b80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9b90: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
9ba0: 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65   Test this expre
9bb0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ssion */.  Expr 
9bc0: 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20  **ppPrefix,  /* 
9bd0: 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54  Pointer to TK_ST
9be0: 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  RING expression 
9bf0: 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65  with pattern pre
9c00: 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  fix */.  int *pi
9c10: 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72  sComplete, /* Tr
9c20: 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77  ue if the only w
9c30: 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20  ildcard is % in 
9c40: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
9c50: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f  er */.  int *pno
9c60: 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75  Case      /* Tru
9c70: 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69  e if uppercase i
9c80: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
9c90: 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a  lowercase */.){.
9ca0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
9cb0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
9cc0: 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66  String on RHS of
9cd0: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
9ce0: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
9cf0: 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f  , *pLeft;      /
9d00: 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74  * Right and left
9d10: 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70   size of LIKE op
9d20: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72  erator */.  Expr
9d30: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
9d40: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
9d50: 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68  f operands to th
9d60: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
9d70: 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20  */.  int c;     
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72  /* One character
9da0: 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74   in z[] */.  int
9db0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
9dc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9dd0: 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72  r of non-wildcar
9de0: 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74  d prefix charact
9df0: 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63  ers */.  char wc
9e00: 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [3];            
9e10: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
9e20: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
9e30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9e40: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
9e50: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9e60: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  n */.  sqlite3_v
9e70: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a  alue *pVal = 0;.
9e80: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ea0: 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74  Opcode of pRight
9eb0: 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69   */..  if( !sqli
9ec0: 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f  te3IsLikeFunctio
9ed0: 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f  n(db, pExpr, pno
9ee0: 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20  Case, wc) ){.   
9ef0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
9f00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43  ifdef SQLITE_EBC
9f10: 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61  DIC.  if( *pnoCa
9f20: 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  se ) return 0;.#
9f30: 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20  endif.  pList = 
9f40: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
9f50: 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d    pLeft = pList-
9f60: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[1].pExpr;.  i
9f70: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b  f( pLeft->op!=TK
9f80: 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73  _COLUMN .   || s
9f90: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
9fa0: 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54  ty(pLeft)!=SQLIT
9fb0: 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c  E_AFF_TEXT .   |
9fc0: 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66  | IsVirtual(pLef
9fd0: 74 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20  t->pTab).  ){.  
9fe0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36    /* IMP: R-0206
9ff0: 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74  5-49465 The left
a000: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
a010: 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  e LIKE or GLOB o
a020: 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20  perator must.   
a030: 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20   ** be the name 
a040: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
a050: 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61  lumn with TEXT a
a060: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
a070: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a080: 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69  assert( pLeft->i
a090: 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20  Column!=(-1) ); 
a0a0: 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e  /* Because IPK n
a0b0: 65 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58  ever has AFF_TEX
a0c0: 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d  T */..  pRight =
a0d0: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
a0e0: 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68  pr;.  op = pRigh
a0f0: 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  t->op;.  if( op=
a100: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
a110: 20 20 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d      op = pRight-
a120: 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >op2;.  }.  if( 
a130: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
a140: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65  ){.    Vdbe *pRe
a150: 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65  prepare = pParse
a160: 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20  ->pReprepare;.  
a170: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69    int iCol = pRi
a180: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ght->iColumn;.  
a190: 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
a1a0: 56 64 62 65 47 65 74 56 61 6c 75 65 28 70 52 65  VdbeGetValue(pRe
a1b0: 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53  prepare, iCol, S
a1c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b  QLITE_AFF_NONE);
a1d0: 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26  .    if( pVal &&
a1e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
a1f0: 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54  ype(pVal)==SQLIT
a200: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
a210: 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  z = (char *)sqli
a220: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
a230: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
a240: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
a250: 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
a260: 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  dbe, iCol);.    
a270: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
a280: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
a290: 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  || pRight->op==T
a2a0: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
a2b0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
a2c0: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a  _STRING ){.    z
a2d0: 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f   = pRight->u.zTo
a2e0: 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ken;.  }.  if( z
a2f0: 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   ){.    cnt = 0;
a300: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
a310: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
a320: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
a330: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
a340: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
a350: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
a360: 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a  =0 && 255!=(u8)z
a370: 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20  [cnt-1] ){.     
a380: 20 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a   Expr *pPrefix;.
a390: 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65        *pisComple
a3a0: 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26  te = c==wc[0] &&
a3b0: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
a3c0: 20 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71      pPrefix = sq
a3d0: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
a3e0: 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20  _STRING, z);.   
a3f0: 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29     if( pPrefix )
a400: 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b   pPrefix->u.zTok
a410: 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20  en[cnt] = 0;.   
a420: 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70     *ppPrefix = p
a430: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66  Prefix;.      if
a440: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
a450: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  E ){.        Vdb
a460: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a470: 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Vdbe;.        sq
a480: 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
a490: 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69  ask(v, pRight->i
a4a0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
a4b0: 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74   if( *pisComplet
a4c0: 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a  e && pRight->u.z
a4d0: 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  Token[1] ){.    
a4e0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
a4f0: 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  rhs of the LIKE 
a500: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
a510: 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68  variable, and th
a520: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20  e current.      
a530: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
a540: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61  the variable mea
a550: 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ns there is no n
a560: 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  eed to invoke th
a570: 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20  e LIKE.         
a580: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68   ** function, th
a590: 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c  en no OP_Variabl
a5a0: 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  e will be added 
a5b0: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
a5c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
a5d0: 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d  s causes problem
a5e0: 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  s for the sqlite
a5f0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
a600: 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20  _name().        
a610: 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72    ** API. To wor
a620: 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64  karound them, ad
a630: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72  d a dummy OP_Var
a640: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20  iable here..    
a650: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
a660: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
a670: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a680: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
a690: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a6a0: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
a6b0: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20  pRight, r1);.   
a6c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a6d0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71  beChangeP3(v, sq
a6e0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
a6f0: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20  Addr(v)-1, 0);. 
a700: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a710: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
a720: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
a730: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
a750: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
a760: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
a770: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74  ree(pVal);.  ret
a780: 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65  urn (z!=0);.}.#e
a790: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
a7a0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
a7b0: 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64  ATION */...#ifnd
a7c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
a7d0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
a7e0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
a7f0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
a800: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
a810: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
a820: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
a830: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
a840: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
a850: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
a860: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
a870: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
a880: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
a890: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
a8a0: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
a8b0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
a8c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
a8d0: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
a8e0: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
a8f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a900: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
a910: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
a920: 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22  u.zToken,"match"
a930: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
a940: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
a950: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
a960: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  st;.  if( pList-
a970: 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20  >nExpr!=2 ){.   
a980: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a990: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d   if( pList->a[1]
a9a0: 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b  .pExpr->op != TK
a9b0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
a9c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
a9d0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
a9e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
a9f0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
aa00: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
aa10: 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  Base expression 
aa20: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
aa30: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
aa40: 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69  ause of.** a joi
aa50: 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  n, then transfer
aa60: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
aa70: 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74   markings over t
aa80: 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74  o derived..*/.st
aa90: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66  atic void transf
aaa0: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45  erJoinMarkings(E
aab0: 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45  xpr *pDerived, E
aac0: 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70  xpr *pBase){.  p
aad0: 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c  Derived->flags |
aae0: 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26  = pBase->flags &
aaf0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20   EP_FromJoin;.  
ab00: 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74  pDerived->iRight
ab10: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73  JoinTable = pBas
ab20: 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
ab30: 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  le;.}..#if !defi
ab40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ab50: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
ab60: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
ab70: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
ab80: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
ab90: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
aba0: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
abb0: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
abc0: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
abd0: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
abe0: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
abf0: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
ac00: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
ac10: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
ac40: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
ac50: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
ac60: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
ac70: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
ac80: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
ac90: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
aca0: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
acb0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
acc0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
acd0: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
ace0: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
acf0: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
ad00: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
ad10: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
ad20: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
ad30: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
ad40: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
ad50: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
ad60: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
ad70: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
ad80: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
ad90: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
ada0: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
adb0: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
adc0: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
add0: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
ade0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
adf0: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
ae00: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
ae10: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
ae20: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
ae30: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
ae40: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
ae50: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
ae60: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
ae70: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
ae80: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
ae90: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
aea0: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
aeb0: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
aec0: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
aed0: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
aee0: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
aef0: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
af00: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
af10: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
af20: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
af30: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
af40: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
af50: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
af60: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
af70: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
af80: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
af90: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
afa0: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
afb0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
afc0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
afd0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
afe0: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
aff0: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
b000: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
b010: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
b020: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
b030: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
b040: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
b050: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
b060: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
b070: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
b080: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
b090: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
b0a0: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
b0b0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
b0c0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
b0d0: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
b0e0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
b0f0: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
b100: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
b110: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
b120: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
b130: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
b140: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
b150: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
b160: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
b170: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
b180: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
b190: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
b1a0: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
b1b0: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
b1c0: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
b1d0: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
b1e0: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
b1f0: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
b200: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
b210: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
b220: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
b230: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
b240: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
b250: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
b260: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
b270: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
b280: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
b290: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
b2a0: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
b2b0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
b2c0: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
b2d0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
b2e0: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
b2f0: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
b300: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
b310: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
b320: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
b330: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
b340: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
b350: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
b360: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
b370: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
b380: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
b390: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
b3a0: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
b3b0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
b3c0: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
b3d0: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
b3e0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
b3f0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
b400: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
b410: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
b420: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
b430: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
b440: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
b450: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
b460: 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20 62 65  something the be
b470: 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74 69 6e  stIndex() routin
b480: 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65  e will determine
b490: 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  .  This analysis
b4a0: 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61  .** only looks a
b4b0: 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72  t whether subter
b4c0: 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ms appropriate f
b4d0: 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73  or indexing exis
b4e0: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61  t..**.** All exa
b4f0: 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20  mples A through 
b500: 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61 74 69  E above all sati
b510: 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74  sfy case 2.  But
b520: 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c   if a term.** al
b530: 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61  so statisfies ca
b540: 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29  se 1 (such as B)
b550: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
b560: 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c  e optimizer will
b570: 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65  .** always prefe
b580: 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20  r case 1, so in 
b590: 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65  that case we pre
b5a0: 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32  tend that case 2
b5b0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73   is not.** satis
b5c0: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d  fied..**.** It m
b5d0: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
b5e0: 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74   that multiple t
b5f0: 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61  ables are indexa
b600: 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ble.  For exampl
b610: 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20  e,.** (E) above 
b620: 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20  is indexable on 
b630: 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64  tables P, Q, and
b640: 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20   R..**.** Terms 
b650: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
b660: 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74  e 2 are candidat
b670: 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79  es for lookup by
b680: 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61   using.** separa
b690: 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69  te indices to fi
b6a0: 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61  nd rowids for ea
b6b0: 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63  ch subterm and c
b6c0: 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20  omposing.** the 
b6d0: 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77  union of all row
b6e0: 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53  ids using a RowS
b6f0: 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  et object.  This
b700: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
b710: 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65  o "bitmap indice
b720: 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61  s" in other data
b730: 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a  base engines..**
b740: 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a  .** OTHERWISE:.*
b750: 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
b760: 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20  case 1 nor case 
b770: 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65  2 apply, then le
b780: 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f  ave the eOperato
b790: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f  r set to.** zero
b7a0: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20  .  This term is 
b7b0: 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73  not useful for s
b7c0: 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  earch..*/.static
b7d0: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
b7e0: 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69  eOrTerm(.  SrcLi
b7f0: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
b800: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
b810: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
b820: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
b830: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f         /* the co
b840: 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61  mplete WHERE cla
b850: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
b860: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
b870: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
b880: 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65  he OR-term to be
b890: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
b8a0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
b8b0: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
b8c0: 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45  o;        /* WHE
b8d0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
b8e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b8f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
b900: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
b910: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
b920: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
b930: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b940: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
b950: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
b960: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
b970: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
b980: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
b990: 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20  idxTerm];    /* 
b9a0: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
b9b0: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70  nalyzed */.  Exp
b9c0: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
b9d0: 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->pExpr;        
b9e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
b9f0: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  ession of the te
ba00: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rm */.  int i;  
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
ba40: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
ba50: 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20  e *pOrWc;       
ba60: 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54  /* Breakup of pT
ba70: 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  erm into subterm
ba80: 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  s */.  WhereTerm
ba90: 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20   *pOrTerm;      
baa0: 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77   /* A Sub-term w
bab0: 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20  ithin the pOrWc 
bac0: 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f  */.  WhereOrInfo
bad0: 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f   *pOrInfo;     /
bae0: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  * Additional inf
baf0: 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61  ormation associa
bb00: 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a  ted with pTerm *
bb10: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67  /.  Bitmask chng
bb20: 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a  ToIN;         /*
bb30: 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   Tables that mig
bb40: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ht satisfy case 
bb50: 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  1 */.  Bitmask i
bb60: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
bb70: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
bb80: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73  are indexable, s
bb90: 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32  atisfying case 2
bba0: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42   */..  /*.  ** B
bbb0: 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75  reak the OR clau
bbc0: 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61  se into its sepa
bbd0: 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20  rate subterms.  
bbe0: 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65  The subterms are
bbf0: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
bc00: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
bc10: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
bc20: 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68  ng within the Wh
bc30: 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f  ereOrInfo.  ** o
bc40: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74  bject that is at
bc50: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72  tached to the or
bc60: 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65  iginal OR clause
bc70: 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73   term..  */.  as
bc80: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
bc90: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59  Flags & (TERM_DY
bca0: 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46  NAMIC|TERM_ORINF
bcb0: 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29  O|TERM_ANDINFO))
bcc0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
bcd0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
bce0: 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e  R );.  pTerm->u.
bcf0: 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66  pOrInfo = pOrInf
bd00: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
bd10: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
bd20: 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20  of(*pOrInfo));. 
bd30: 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20   if( pOrInfo==0 
bd40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72  ) return;.  pTer
bd50: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
bd60: 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72  RM_ORINFO;.  pOr
bd70: 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77  Wc = &pOrInfo->w
bd80: 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  c;.  whereClause
bd90: 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e  Init(pOrWc, pWIn
bda0: 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  fo);.  whereSpli
bdb0: 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20  t(pOrWc, pExpr, 
bdc0: 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e  TK_OR);.  exprAn
bdd0: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
bde0: 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d  OrWc);.  if( db-
bdf0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
be00: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
be10: 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d  ( pOrWc->nTerm>=
be20: 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 );..  /*.  ** 
be30: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20  Compute the set 
be40: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d  of tables that m
be50: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
be60: 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a  es 1 or 2..  */.
be70: 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28    indexable = ~(
be80: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e  Bitmask)0;.  chn
be90: 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73  gToIN = ~(Bitmas
bea0: 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72  k)0;.  for(i=pOr
beb0: 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72  Wc->nTerm-1, pOr
bec0: 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69  Term=pOrWc->a; i
bed0: 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65  >=0 && indexable
bee0: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
bef0: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54  ){.    if( (pOrT
bf00: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
bf10: 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29   WO_SINGLE)==0 )
bf20: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64  {.      WhereAnd
bf30: 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a  Info *pAndInfo;.
bf40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
bf50: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
bf60: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
bf70: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
bf80: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
bf90: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
bfa0: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
bfb0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
bfc0: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
bfd0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
bfe0: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
bff0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
c000: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
c010: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
c020: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
c030: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
c040: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
c050: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
c060: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
c070: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
c080: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c090: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
c0a0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
c0b0: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
c0c0: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
c0d0: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
c0e0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
c0f0: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
c100: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20   pWC->pWInfo);. 
c110: 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69         whereSpli
c120: 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72  t(pAndWC, pOrTer
c130: 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44  m->pExpr, TK_AND
c140: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
c150: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
c160: 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20  pAndWC);.       
c170: 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20   pAndWC->pOuter 
c180: 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74  = pWC;.        t
c190: 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c  estcase( db->mal
c1a0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
c1b0: 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
c1c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
c1d0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
c1e0: 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43   pAndTerm=pAndWC
c1f0: 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e  ->a; j<pAndWC->n
c200: 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54  Term; j++, pAndT
c210: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
c220: 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64      assert( pAnd
c230: 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
c240: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
c250: 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72  llowedOp(pAndTer
c260: 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b  m->pExpr->op) ){
c270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
c280: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
c290: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
c2a0: 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  AndTerm->leftCur
c2b0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sor);.          
c2c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
c2d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c2e0: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
c2f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
c300: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
c310: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
c320: 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20  COPIED ){.      
c330: 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  /* Skip this ter
c340: 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72  m for now.  We r
c350: 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20 77  evisit it when w
c360: 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20  e process the.  
c370: 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
c380: 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41  ding TERM_VIRTUA
c390: 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65  L term */.    }e
c3a0: 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
c3b0: 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20  sk b;.      b = 
c3c0: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
c3d0: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  >sMaskSet, pOrTe
c3e0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  rm->leftCursor);
c3f0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
c400: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
c410: 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20  RM_VIRTUAL ){.  
c420: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
c430: 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63  *pOther = &pOrWc
c440: 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61  ->a[pOrTerm->iPa
c450: 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62  rent];.        b
c460: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
c470: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
c480: 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f  Other->leftCurso
c490: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
c4a0: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
c4b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 72  ;.      if( (pOr
c4c0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c4d0: 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20  & WO_EQ)==0 ){. 
c4e0: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
c4f0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
c500: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
c510: 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  IN &= b;.      }
c520: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
c530: 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  .  ** Record the
c540: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
c550: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
c560: 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67   2.  The set mig
c570: 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79  ht be.  ** empty
c580: 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f  ..  */.  pOrInfo
c590: 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e  ->indexable = in
c5a0: 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d  dexable;.  pTerm
c5b0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e  ->eOperator = in
c5c0: 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a  dexable==0 ? 0 :
c5d0: 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20   WO_OR;..  /*.  
c5e0: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64  ** chngToIN hold
c5f0: 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65  s a set of table
c600: 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73  s that *might* s
c610: 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20  atisfy case 1.  
c620: 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65  But.  ** we have
c630: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69   to do some addi
c640: 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20  tional checking 
c650: 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31  to see if case 1
c660: 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20   really.  ** is 
c670: 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a  satisfied..  **.
c680: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69    ** chngToIN wi
c690: 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30  ll hold either 0
c6a0: 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20  , 1, or 2 bits. 
c6b0: 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20   The 0-bit case 
c6c0: 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
c6d0: 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73  there is no poss
c6e0: 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73  ibility of trans
c6f0: 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63  forming the OR c
c700: 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20  lause into an.  
c710: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62  ** IN operator b
c720: 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f  ecause one or mo
c730: 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
c740: 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  OR clause contai
c750: 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67  n.  ** something
c760: 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f   other than == o
c770: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  n a column in th
c780: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
c790: 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20   The 1-bit.  ** 
c7a0: 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20  case means that 
c7b0: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
c7c0: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f  e OR clause is o
c7d0: 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20  f the form.  ** 
c7e0: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78  "table.column=ex
c7f0: 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  pr" for some sin
c800: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
c810: 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20  one bit that is 
c820: 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f  set.  ** will co
c830: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
c840: 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57  common table.  W
c850: 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
c860: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20  check to make.  
c870: 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65  ** sure the same
c880: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
c890: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54  on all terms.  T
c8a0: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73  he 2-bit case is
c8b0: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61   when.  ** the a
c8c0: 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20  ll terms are of 
c8d0: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31  the form "table1
c8e0: 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63  .column=table2.c
c8f0: 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a  olumn".  It.  **
c900: 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62   might be possib
c910: 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e  le to form an IN
c920: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65   operator with e
c930: 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c  ither table1.col
c940: 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c  umn.  ** or tabl
c950: 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  e2.column as the
c960: 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69   LHS if either i
c970: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72  s common to ever
c980: 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74  y term of.  ** t
c990: 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20  he OR clause..  
c9a0: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
c9b0: 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  t terms of the f
c9c0: 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d  orm "table.colum
c9d0: 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32  n1=table.column2
c9e0: 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  " (the.  ** same
c9f0: 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73   table on both s
ca00: 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20  izes of the ==) 
ca10: 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
ca20: 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
ca30: 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  chngToIN ){.    
ca40: 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  int okToChngToIN
ca50: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
ca60: 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73  e if the convers
ca70: 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c  ion to IN is val
ca80: 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  id */.    int iC
ca90: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20  olumn = -1;     
caa0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e      /* Column in
cab0: 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e  dex on lhs of IN
cac0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
cad0: 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d   int iCursor = -
cae0: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  1;         /* Ta
caf0: 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f  ble cursor commo
cb00: 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a  n to all terms *
cb10: 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b  /.    int j = 0;
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb30: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
cb40: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  */..    /* Searc
cb50: 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e  h for a table an
cb60: 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70  d column that ap
cb70: 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64  pears on one sid
cb80: 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  e or the.    ** 
cb90: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20  other of the == 
cba0: 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72  operator in ever
cbb0: 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74  y subterm.  That
cbc0: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
cbd0: 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65  n.    ** will be
cbe0: 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75   recorded in iCu
cbf0: 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e  rsor and iColumn
cc00: 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e  .  There might n
cc10: 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a  ot be any.    **
cc20: 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20   such table and 
cc30: 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54  column.  Set okT
cc40: 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20  oChngToIN if an 
cc50: 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c  appropriate tabl
cc60: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c  e.    ** and col
cc70: 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74  umn is found but
cc80: 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54   leave okToChngT
cc90: 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  oIN false if not
cca0: 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20   found..    */. 
ccb0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20     for(j=0; j<2 
ccc0: 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  && !okToChngToIN
ccd0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f  ; j++){.      pO
cce0: 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61  rTerm = pOrWc->a
ccf0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ;.      for(i=pO
cd00: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e  rWc->nTerm-1; i>
cd10: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
cd20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
cd30: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
cd40: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
cd50: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  );.        pOrTe
cd60: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
cd70: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
cd80: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
cd90: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
cda0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
cdb0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
cdc0: 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20   2-bit case and 
cdd0: 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65  we are on the se
cde0: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61  cond iteration a
cdf0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
ce00: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
ce10: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69  from the first i
ce20: 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b  teration.  So sk
ce30: 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f  ip this term. */
ce40: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
ce50: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
ce60: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
ce70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ce80: 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26   if( (chngToIN &
ce90: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
cea0: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  ->sMaskSet, pOrT
ceb0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
cec0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
ced0: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d    /* This term m
cee0: 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f  ust be of the fo
cef0: 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68  rm t1.a==t2.b wh
cf00: 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65  ere t2 is in the
cf10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68  .          ** ch
cf20: 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74  ngToIN set but t
cf30: 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20  1 is not.  This 
cf40: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74  term will be eit
cf50: 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20  her preceeded.  
cf60: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f          ** or fo
cf70: 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65  llwed by an inve
cf80: 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d  rted copy (t2.b=
cf90: 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68  =t1.a).  Skip th
cfa0: 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20  is term .       
cfb0: 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74     ** and use it
cfc0: 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a  s inversion. */.
cfd0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
cfe0: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
cff0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
d000: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ED );.          
d010: 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72  testcase( pOrTer
d020: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
d030: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
d040: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d050: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
d060: 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54  & (TERM_COPIED|T
d070: 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a  ERM_VIRTUAL) );.
d080: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
d090: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
d0a0: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
d0b0: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
d0c0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69  olumn;.        i
d0d0: 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d  Cursor = pOrTerm
d0e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ->leftCursor;.  
d0f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d100: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
d110: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
d120: 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61   No candidate ta
d130: 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66  ble+column was f
d140: 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20  ound.  This can 
d150: 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20  only occur.     
d160: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63     ** on the sec
d170: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ond iteration */
d180: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d190: 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   j==1 );.       
d1a0: 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72   assert( IsPower
d1b0: 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20  OfTwo(chngToIN) 
d1c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
d1d0: 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74  t( chngToIN==get
d1e0: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
d1f0: 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29  askSet, iCursor)
d200: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
d210: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d220: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20   testcase( j==1 
d230: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  );..      /* We 
d240: 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e  have found a can
d250: 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64  didate table and
d260: 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20   column.  Check 
d270: 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20  to see if that. 
d280: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e       ** table an
d290: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d  d column is comm
d2a0: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
d2b0: 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73   in the OR claus
d2c0: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43  e */.      okToC
d2d0: 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  hngToIN = 1;.   
d2e0: 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26     for(; i>=0 &&
d2f0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69   okToChngToIN; i
d300: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
d310: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d320: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
d330: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
d340: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
d350: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
d360: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
d370: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
d380: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
d390: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
d3a0: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
d3b0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43  u.leftColumn!=iC
d3c0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
d3d0: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
d3e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
d3f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
d400: 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69  t affLeft, affRi
d410: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  ght;.          /
d420: 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68  * If the right-h
d430: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f  and side is also
d440: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
d450: 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20  the affinities. 
d460: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62           ** of b
d470: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
d480: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
d490: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
d4a0: 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  pe.          ** 
d4b0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
d4c0: 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  required on the 
d4d0: 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20  right.  (Ticket 
d4e0: 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20  #2249).         
d4f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66   */.          af
d500: 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  fRight = sqlite3
d510: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
d520: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
d530: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
d540: 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  affLeft = sqlite
d550: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
d560: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
d570: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
d580: 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20  if( affRight!=0 
d590: 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66  && affRight!=aff
d5a0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
d5b0: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
d5c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
d5d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d5e0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
d5f0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
d600: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
d610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d620: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
d630: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b  t this point, ok
d640: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72  ToChngToIN is tr
d650: 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70  ue if original p
d660: 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20  Term satisfies. 
d670: 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49     ** case 1.  I
d680: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e  n that case, con
d690: 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72  struct a new vir
d6a0: 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69  tual term that i
d6b0: 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20  s .    ** pTerm 
d6c0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
d6d0: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n IN operator.. 
d6e0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a     **.    ** EV:
d6f0: 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20   R-00211-15100. 
d700: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b     */.    if( ok
d710: 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ToChngToIN ){.  
d720: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20      Expr *pDup; 
d730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
d740: 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63  transient duplic
d750: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ate expression *
d760: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
d770: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f   *pList = 0;   /
d780: 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65  * The RHS of the
d790: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
d7a0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
d7b0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
d7c0: 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
d7d0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
d7e0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20      Expr *pNew; 
d7f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d800: 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70  e complete IN op
d810: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
d820: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
d830: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
d840: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  OrWc->a; i>=0; i
d850: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
d860: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
d870: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
d880: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
d890: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
d8a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
d8b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
d8c0: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
d8d0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
d8e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
d8f0: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20  ursor );.       
d900: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
d910: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
d920: 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  iColumn );.     
d930: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
d940: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
d950: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
d960: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
d970: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
d980: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
d990: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
d9a0: 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  List, pDup);.   
d9b0: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72       pLeft = pOr
d9c0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
d9d0: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ft;.      }.    
d9e0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
d9f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70  =0 );.      pDup
da00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
da10: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
da20: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
da30: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
da40: 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  e, TK_IN, pDup, 
da50: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
da60: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
da70: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
da80: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
da90: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
daa0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
dab0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
dac0: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
dad0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
dae0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
daf0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
db00: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
db10: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
db20: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
db30: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
db40: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
db50: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
db60: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  w==0 );.        
db70: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
db80: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
db90: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
dba0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
dbb0: 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61  ;.        pWC->a
dbc0: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
dbd0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
dbe0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
dbf0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
dc00: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
dc10: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
dc20: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
dc30: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72      }.      pTer
dc40: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
dc50: 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65  O_NOOP;  /* case
dc60: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
dc70: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
dc80: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
dc90: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
dca0: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
dcb0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
dcc0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  */../*.** The in
dcd0: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
dce0: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
dcf0: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
dd00: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
dd10: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
dd20: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
dd30: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
dd40: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
dd50: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
dd60: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
dd70: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
dd80: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
dd90: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
dda0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
ddb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ddc0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
ddd0: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
dde0: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
ddf0: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
de00: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
de10: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
de20: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
de30: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
de40: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
de50: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
de60: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
de70: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
de80: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
de90: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
dea0: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
deb0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
dec0: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
ded0: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
dee0: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
def0: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
df00: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
df10: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
df20: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
df30: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
df40: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
df50: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
df60: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
df70: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
df80: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
df90: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
dfa0: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
dfb0: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
dfc0: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
dfd0: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
dfe0: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
dff0: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
e000: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
e010: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
e020: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
e030: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
e040: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
e050: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
e060: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
e070: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
e080: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
e090: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
e0a0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
e0b0: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
e0c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
e0d0: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
e0e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
e0f0: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
e100: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
e110: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
e120: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
e130: 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  o; /* WHERE clau
e140: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  se processing co
e150: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
e160: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
e170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e180: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
e190: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alyzed */.  Wher
e1a0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
e1b0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
e1c0: 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64  Set of table ind
e1d0: 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78  ex masks */.  Ex
e1e0: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e200: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
e210: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
e220: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
e230: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20  reqLeft;        
e240: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
e250: 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45  esites of the pE
e260: 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20  xpr->pLeft */.  
e270: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
e280: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
e290: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
e2a0: 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  s of pExpr */.  
e2b0: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67  Bitmask extraRig
e2c0: 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ht = 0;         
e2d0: 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64   /* Extra depend
e2e0: 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a  encies on LEFT J
e2f0: 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  OIN */.  Expr *p
e300: 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Str1 = 0;       
e310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
e320: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
e330: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
e340: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e360: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
e370: 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63   ends with wildc
e380: 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ard */.  int noC
e390: 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ase = 0;        
e3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b            /* LIK
e3b0: 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69  E/GLOB distingui
e3c0: 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69  shes case */.  i
e3d0: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65  /* Top-level ope
e400: 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f  rator.  pExpr->o
e410: 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  p */.  Parse *pP
e420: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
e430: 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69  Parse;  /* Parsi
e440: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e450: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
e460: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
e470: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
e480: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  nection */..  if
e490: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
e4a0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
e4b0: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
e4c0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
e4d0: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
e4e0: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
e4f0: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
e500: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
e510: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
e520: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
e530: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
e540: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
e550: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
e560: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
e570: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
e580: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
e590: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
e5a0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
e5b0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
e5c0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
e5d0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
e5e0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
e5f0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
e600: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
e610: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
e620: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
e630: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
e640: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
e650: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
e660: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
e670: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
e680: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
e690: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
e6a0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
e6b0: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
e6c0: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
e6d0: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
e6e0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
e6f0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
e700: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
e710: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
e720: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
e730: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
e740: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
e750: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
e760: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
e770: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
e780: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
e790: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
e7a0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
e7b0: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
e7c0: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
e7d0: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
e7e0: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
e7f0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
e800: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
e830: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
e840: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
e850: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
e860: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
e870: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
e880: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
e890: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
e8a0: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
e8b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
e8c0: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
e8d0: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
e8e0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
e8f0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
e900: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
e910: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
e920: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
e930: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
e940: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
e950: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
e960: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
e970: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
e980: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
e990: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28  O_EQUIV;.    if(
e9a0: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
e9b0: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
e9c0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
e9d0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
e9e0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
e9f0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
ea00: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
ea10: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
ea20: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
ea30: 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b  ask(op) & opMask
ea40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ea50: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
ea60: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
ea70: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
ea80: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
ea90: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
eaa0: 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d    u16 eExtraOp =
eab0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78   0;        /* Ex
eac0: 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65  tra bits for pNe
ead0: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  w->eOperator */.
eae0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
eaf0: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
eb00: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
eb10: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
eb20: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
eb30: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
eb40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
eb50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
eb60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
eb70: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
eb80: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
eb90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
eba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
ebb0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
ebc0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
ebd0: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
ebe0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
ebf0: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
ec00: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
ec10: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
ec20: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
ec30: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
ec40: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
ec50: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
ec60: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
ec70: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
ec80: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
ec90: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
eca0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
ecb0: 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IED;.        if(
ecc0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
ecd0: 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  Q.         && !E
ece0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ecf0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
ed00: 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  n).         && O
ed10: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
ed20: 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72  ed(db, SQLITE_Tr
ed30: 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20  ansitive).      
ed40: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
ed50: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
ed60: 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20  |= WO_EQUIV;.   
ed70: 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20         eExtraOp 
ed80: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
ed90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
eda0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
edb0: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
edc0: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
edd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
ede0: 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c  rCommute(pParse,
edf0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c   pDup);.      pL
ee00: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
ee10: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75  rSkipCollate(pDu
ee20: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  p->pLeft);.     
ee30: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
ee40: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
ee50: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
ee60: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
ee70: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
ee80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
ee90: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
eea0: 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65  aRight) != prere
eeb0: 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70  qLeft );.      p
eec0: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
eed0: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20   = prereqLeft | 
eee0: 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20  extraRight;.    
eef0: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
ef00: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
ef10: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
ef20: 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72  ator = (operator
ef30: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b  Mask(pDup->op) +
ef40: 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d   eExtraOp) & opM
ef50: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ask;.    }.  }..
ef60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ef70: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
ef80: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66  MIZATION.  /* If
ef90: 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42   a term is the B
efa0: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
efb0: 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20   create two new 
efc0: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20  virtual terms.  
efd0: 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74  ** that define t
efe0: 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68  he range that th
eff0: 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d  e BETWEEN implem
f000: 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ents.  For examp
f010: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
f020: 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41     a BETWEEN b A
f030: 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  ND c.  **.  ** i
f040: 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  s converted into
f050: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
f060: 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e   (a BETWEEN b AN
f070: 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20  D c) AND (a>=b) 
f080: 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a  AND (a<=c).  **.
f090: 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77    ** The two new
f0a0: 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
f0b0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
f0c0: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
f0d0: 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
f0e0: 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  e new terms are 
f0f0: 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72  "dynamic" and ar
f100: 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  e children of th
f110: 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45  e original BETWE
f120: 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54  EN.  ** term.  T
f130: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69  hat means that i
f140: 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65  f the BETWEEN te
f150: 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65  rm is coded, the
f160: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20   children are.  
f170: 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c  ** skipped.  Or,
f180: 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e   if the children
f190: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
f1a0: 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  y an index, the 
f1b0: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45  original.  ** BE
f1c0: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b  TWEEN term is sk
f1d0: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
f1e0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
f1f0: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20  ==TK_BETWEEN && 
f200: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
f210: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
f220: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
f230: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  x.pList;.    int
f240: 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   i;.    static c
f250: 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20  onst u8 ops[] = 
f260: 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a  {TK_GE, TK_LE};.
f270: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
f280: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
f290: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
f2a0: 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==2 );.    for(i
f2b0: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
f2c0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
f2d0: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
f2e0: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65  dxNew;.      pNe
f2f0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
f300: 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73  Expr(pParse, ops
f310: 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  [i], .          
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
f340: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  p(db, pExpr->pLe
f350: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f370: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f380: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
f390: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30  [i].pExpr, 0), 0
f3a0: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
f3b0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
f3c0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
f3d0: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
f3e0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
f3f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
f400: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
f410: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
f420: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
f430: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
f440: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
f450: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
f460: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
f470: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   idxTerm;.    }.
f480: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
f490: 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 2;.  }.#endi
f4a0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
f4b0: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
f4c0: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64  ATION */..#if !d
f4d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f4e0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
f4f0: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
f500: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
f510: 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79  UERY).  /* Analy
f520: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69  ze a term that i
f530: 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77  s composed of tw
f540: 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72  o or more subter
f550: 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  ms connected by.
f560: 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61    ** an OR opera
f570: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  tor..  */.  else
f580: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
f590: 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73  TK_OR ){.    ass
f5a0: 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  ert( pWC->op==TK
f5b0: 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72  _AND );.    expr
f5c0: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53  AnalyzeOrTerm(pS
f5d0: 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d  rc, pWC, idxTerm
f5e0: 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
f5f0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
f600: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
f610: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
f620: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
f630: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f640: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
f650: 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f  TION.  /* Add co
f660: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64  nstraints to red
f670: 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
f680: 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f  pace on a LIKE o
f690: 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72  r GLOB.  ** oper
f6a0: 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
f6b0: 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f  A like pattern o
f6c0: 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49  f the form "x LI
f6d0: 4b 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68  KE 'abc%'" is ch
f6e0: 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74  anged into const
f6f0: 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a  raints.  **.  **
f700: 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62            x>='ab
f710: 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41  c' AND x<'abd' A
f720: 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27  ND x LIKE 'abc%'
f730: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
f740: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ast character of
f750: 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63   the prefix "abc
f760: 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  " is incremented
f770: 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a   to form the.  *
f780: 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  * termination co
f790: 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20  ndition "abd".. 
f7a0: 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f   */.  if( pWC->o
f7b0: 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26  p==TK_AND .   &&
f7c0: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50   isLikeOrGlob(pP
f7d0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53  arse, pExpr, &pS
f7e0: 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65  tr1, &isComplete
f7f0: 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a  , &noCase).  ){.
f800: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
f810: 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66         /* LHS of
f820: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
f830: 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
f840: 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a  *pStr2;       /*
f850: 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d   Copy of pStr1 -
f860: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
f870: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
f880: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
f890: 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  1;.    Expr *pNe
f8a0: 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20  wExpr2;.    int 
f8b0: 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74  idxNew1;.    int
f8c0: 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f   idxNew2;.    To
f8d0: 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  ken sCollSeqName
f8e0: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f  ;  /* Name of co
f8f0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f900: 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d   */..    pLeft =
f910: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
f920: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
f930: 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33   pStr2 = sqlite3
f940: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72  ExprDup(db, pStr
f950: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 0);.    if( !
f960: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f970: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20   ){.      u8 c, 
f980: 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61  *pC;       /* La
f990: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
f9a0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69  ore the first wi
f9b0: 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20  ldcard */.      
f9c0: 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32  pC = (u8*)&pStr2
f9d0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74  ->u.zToken[sqlit
f9e0: 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32  e3Strlen30(pStr2
f9f0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a  ->u.zToken)-1];.
fa00: 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20        c = *pC;. 
fa10: 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20       if( noCase 
fa20: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
fa30: 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e  e point is to in
fa40: 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74  crement the last
fa50: 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72   character befor
fa60: 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  e the first.    
fa70: 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e      ** wildcard.
fa80: 20 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72    But if we incr
fa90: 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20  ement '@', that 
faa0: 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74  will push it int
fab0: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
fac0: 20 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67   alphabetic rang
fad0: 65 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e  e where case con
fae0: 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65  versions will me
faf0: 73 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20  ss up the .     
fb00: 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79     ** inequality
fb10: 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73  .  To avoid this
fb20: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61  , make sure to a
fb30: 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c  lso run the full
fb40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45  .        ** LIKE
fb50: 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74   on all candidat
fb60: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  e expressions by
fb70: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73   clearing the is
fb80: 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20  Complete flag.  
fb90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
fba0: 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20   if( c=='A'-1 ) 
fbb0: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
fbc0: 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33 33 39    /* EV: R-64339
fbd0: 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20 20 20  -08207 */...    
fbe0: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
fbf0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
fc00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
fc10: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
fc20: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
fc30: 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22  e.z = noCase ? "
fc40: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
fc50: 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71  Y";.    sCollSeq
fc60: 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20  Name.n = 6;.    
fc70: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
fc80: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
fc90: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
fca0: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
fcb0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
fcc0: 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20  K_GE, .         
fcd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
fce0: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
fcf0: 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73  rse,pNewExpr1,&s
fd00: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
fd10: 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20           pStr1, 
fd20: 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20  0);.    idxNew1 
fd30: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
fd40: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
fd50: 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  r1, TERM_VIRTUAL
fd60: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
fd70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
fd80: 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20  xNew1==0 );.    
fd90: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
fda0: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b  , pWC, idxNew1);
fdb0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
fdc0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
fdd0: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
fde0: 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
fdf0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
fe00: 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20  se, TK_LT,.     
fe10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fe20: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
fe30: 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72  (pParse,pNewExpr
fe40: 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29  2,&sCollSeqName)
fe50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74  ,.           pSt
fe60: 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e  r2, 0);.    idxN
fe70: 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew2 = whereClaus
fe80: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
fe90: 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52  wExpr2, TERM_VIR
fea0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
feb0: 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
fec0: 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a  ( idxNew2==0 );.
fed0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
fee0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
fef0: 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
ff00: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
ff10: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
ff20: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
ff30: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
ff40: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
ff50: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
ff60: 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
ff70: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
ff80: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
ff90: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
ffa0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ffb0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
ffc0: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
ffd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ffe0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
fff0: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
10000 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
10010 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
10020 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
10030 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
10040 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
10050 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
10060 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
10070 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
10080 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
10090 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
100a0 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
100b0 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
100c0 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
100d0 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
100e0 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
100f0 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
10100 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
10110 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
10120 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
10130 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
10140 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
10150 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
10160 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
10170 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
10180 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
10190 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
101a0 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
101b0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
101c0 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
101d0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
101e0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
101f0 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65    prereqExpr = e
10200 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
10210 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
10220 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d  .    prereqColum
10230 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  n = exprTableUsa
10240 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65  ge(pMaskSet, pLe
10250 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72  ft);.    if( (pr
10260 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65  ereqExpr & prere
10270 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20  qColumn)==0 ){. 
10280 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
10290 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  xpr;.      pNewE
102a0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
102b0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41  pr(pParse, TK_MA
102c0 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TCH, .          
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78      0, sqlite3Ex
102f0 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
10300 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
10310 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
10320 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
10330 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
10340 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
10350 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
10360 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
10370 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
10380 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
10390 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
103a0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
103b0 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
103c0 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
103d0 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
103e0 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
103f0 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
10400 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
10410 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
10420 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
10430 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
10440 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10450 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
10460 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
10470 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
10480 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
10490 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
104a0 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
104b0 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
104c0 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
104d0 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
104e0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
104f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
10500 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
10510 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
10520 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10530 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 2f 2a 20  ABLE_STAT3.  /* 
10540 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74  When sqlite_stat
10550 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
10560 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e   is available an
10570 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65   operator of the
10580 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53  .  ** form "x IS
10590 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73   NOT NULL" can s
105a0 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c  ometimes be eval
105b0 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63  uated more effic
105c0 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22  iently.  ** as "
105d0 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20  x>NULL" if x is 
105e0 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
105f0 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20  RIMARY KEY.  So 
10600 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a  construct a.  **
10610 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66   virtual term of
10620 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a   that form..  **
10630 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
10640 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  the virtual term
10650 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20   must be tagged 
10660 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e  with TERM_VNULL.
10670 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d    This.  ** TERM
10680 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20  _VNULL tag will 
10690 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74  suppress the not
106a0 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74  -null check at t
106b0 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
106c0 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  * of the loop.  
106d0 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d  Without the TERM
106e0 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65  _VNULL flag, the
106f0 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
10700 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72  at.  ** the star
10710 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69  t of the loop wi
10720 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72  ll prevent any r
10730 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e  esults from bein
10740 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  g returned..  */
10750 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
10760 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20  ==TK_NOTNULL.   
10770 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
10780 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
10790 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
107a0 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  t->iColumn>=0.  
107b0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
107c0 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
107d0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
107e0 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
107f0 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
10800 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
10810 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
10820 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
10830 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10860 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
10870 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10890 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
108a0 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
108b0 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20  0, 0, 0), 0);.. 
108c0 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
108d0 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
108e0 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10900 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f             TERM_
10910 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
10920 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29  AMIC|TERM_VNULL)
10930 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77  ;.    if( idxNew
10940 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   ){.      pNewTe
10950 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
10960 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
10970 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
10980 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  t = 0;.      pNe
10990 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
109a0 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
109b0 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
109c0 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
109d0 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
109e0 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
109f0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
10a00 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  _GT;.      pNewT
10a10 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
10a20 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
10a30 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
10a40 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
10a50 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
10a60 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
10a70 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
10a80 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
10a90 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
10aa0 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
10ab0 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
10ac0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
10ad0 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20  NABLE_STAT */.. 
10ae0 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63   /* Prevent ON c
10af0 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61  lause terms of a
10b00 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20   LEFT JOIN from 
10b10 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72  being used to dr
10b20 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ive.  ** an inde
10b30 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  x for tables to 
10b40 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
10b50 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65  join..  */.  pTe
10b60 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
10b70 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d  |= extraRight;.}
10b80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
10b90 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 70  ction searches p
10ba0 4c 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72 79  List for a entry
10bb0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
10bc0 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
10bd0 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64  .** of index pId
10be0 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68  x..**.** If such
10bf0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
10c00 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64  s found, its ind
10c10 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d  ex in pList->a[]
10c20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
10c30 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f  .** no expressio
10c40 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69  n is found, -1 i
10c50 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
10c60 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
10c70 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20  dexCol(.  Parse 
10c80 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
10ca0 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
10cb0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69  /* Expression li
10ce0 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  st to search */.
10cf0 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20    int iBase,    
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d10 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20    /* Cursor for 
10d20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
10d30 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20   with pIdx */.  
10d40 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63  /* Index to matc
10d70 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20  h column of */. 
10d80 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20   int iCol       
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10da0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e   /* Column of in
10db0 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a  dex to match */.
10dc0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
10dd0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
10de0 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
10df0 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Col];..  for(i=0
10e00 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
10e10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
10e20 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
10e30 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
10e40 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
10e50 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
10e60 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26  TK_COLUMN.     &
10e70 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  & p->iColumn==pI
10e80 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f  dx->aiColumn[iCo
10e90 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54  l].     && p->iT
10ea0 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20  able==iBase.    
10eb0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
10ec0 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
10ed0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
10ee0 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
10ef0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
10f00 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29  f( ALWAYS(pColl)
10f10 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
10f20 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
10f30 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
10f40 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
10f50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10f60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
10f70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10f80 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  true if the DIST
10f90 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d  INCT expression-
10fa0 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
10fb0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
10fc0 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e  t.** is redundan
10fd0 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49  t..**.** A DISTI
10fe0 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75  NCT list is redu
10ff0 6e 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74  ndant if the dat
11000 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73  abase contains s
11010 6f 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  ome subset of.**
11020 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
11030 65 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e  e unique and non
11040 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  -null..*/.static
11050 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
11060 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
11070 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11080 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11090 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
110a0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
110b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
110c0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
110d0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
110e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
110f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
11100 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
11110 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20  stinct       /* 
11120 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  The result set t
11130 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
11140 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20  DISTINCT */.){. 
11150 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
11160 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
11170 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
11190 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20    int iBase;..  
111a0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  /* If there is m
111b0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62  ore than one tab
111c0 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  le or sub-select
111d0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
111e0 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  use of.  ** this
111f0 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
11200 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
11210 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61  ible to show tha
11220 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a  t the DISTINCT .
11230 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72    ** clause is r
11240 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69  edundant. */.  i
11250 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
11260 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
11270 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c  .  iBase = pTabL
11280 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
11290 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62  r;.  pTab = pTab
112a0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
112b0 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
112c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
112d0 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d   is an IPK colum
112e0 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65  n on table iBase
112f0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  , then return . 
11300 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20   ** true. Note: 
11310 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d  The (p->iTable==
11320 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74  iBase) part of t
11330 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20  his test may be 
11340 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a  false if the.  *
11350 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  * current SELECT
11360 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
11370 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f   sub-query..  */
11380 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
11390 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20  istinct->nExpr; 
113a0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
113b0 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
113c0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74  kipCollate(pDist
113d0 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
113e0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
113f0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
11400 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
11410 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
11420 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
11430 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
11440 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
11450 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
11460 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
11470 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
11480 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
11490 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
114a0 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
114b0 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
114c0 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
114d0 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
114e0 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
114f0 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
11500 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
11510 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
11520 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
11530 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
11540 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
11550 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
11560 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
11570 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
11580 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
11590 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
115a0 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
115b0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
115c0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
115d0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
115e0 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
115f0 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
11600 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
11610 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
11620 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f     3. All of tho
11630 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  se index columns
11640 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57   for which the W
11650 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
11660 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63   not.  **      c
11670 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22  ontain a "col=X"
11680 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63   term are subjec
11690 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  t to a NOT NULL 
116a0 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
116b0 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
116c0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
116d0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
116e0 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  ){.    if( pIdx-
116f0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
11700 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
11710 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
11720 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
11730 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
11740 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
11750 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  n[i];.      if( 
11760 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  0==findTerm(pWC,
11770 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28   iBase, iCol, ~(
11780 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
11790 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  , pIdx) ){.     
117a0 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d     int iIdxCol =
117b0 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50   findIndexCol(pP
117c0 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c  arse, pDistinct,
117d0 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29   iBase, pIdx, i)
117e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49  ;.        if( iI
117f0 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d  dxCol<0 || pTab-
11800 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
11810 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c  lumn[i]].notNull
11820 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11830 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11840 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11850 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d      if( i==pIdx-
11860 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
11870 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
11880 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
11890 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
118a0 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ier is redundant
118b0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
118c0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 1;.    }.  }..
118d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
118e0 2a 20 0a 2a 2a 20 54 68 65 20 28 61 6e 20 61 70  * .** The (an ap
118f0 70 72 6f 78 69 6d 61 74 65 29 20 73 75 6d 20 6f  proximate) sum o
11900 66 20 74 77 6f 20 57 68 65 72 65 43 6f 73 74 73  f two WhereCosts
11910 2e 20 20 54 68 69 73 20 63 6f 6d 70 75 74 61 74  .  This computat
11920 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20  ion is.** not a 
11930 73 69 6d 70 6c 65 20 22 2b 22 20 6f 70 65 72 61  simple "+" opera
11940 74 6f 72 20 62 65 63 61 75 73 65 20 57 68 65 72  tor because Wher
11950 65 43 6f 73 74 20 69 73 20 73 74 6f 72 65 64 20  eCost is stored 
11960 61 73 20 61 20 6c 6f 67 61 72 69 74 68 6d 69 63  as a logarithmic
11970 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20 0a 2a  .** value..** .*
11980 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43 6f  /.static WhereCo
11990 73 74 20 77 68 65 72 65 43 6f 73 74 41 64 64 28  st whereCostAdd(
119a0 57 68 65 72 65 43 6f 73 74 20 61 2c 20 57 68 65  WhereCost a, Whe
119b0 72 65 43 6f 73 74 20 62 29 7b 0a 20 20 73 74 61  reCost b){.  sta
119c0 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
119d0 65 64 20 63 68 61 72 20 78 5b 5d 20 3d 20 7b 0a  ed char x[] = {.
119e0 20 20 20 20 20 31 30 2c 20 31 30 2c 20 20 20 20       10, 10,    
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 20 20 20 2f 2a 20 30 2c 31 20 2a 2f 0a 20       /* 0,1 */. 
11a10 20 20 20 20 20 39 2c 20 39 2c 20 20 20 20 20 20       9, 9,      
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 20 20 20 20 2f 2a 20 32 2c 33 20 2a 2f 0a 20 20      /* 2,3 */.  
11a40 20 20 20 20 38 2c 20 38 2c 20 20 20 20 20 20 20      8, 8,       
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a60 20 20 20 2f 2a 20 34 2c 35 20 2a 2f 0a 20 20 20     /* 4,5 */.   
11a70 20 20 20 37 2c 20 37 2c 20 37 2c 20 20 20 20 20     7, 7, 7,     
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a90 20 20 2f 2a 20 36 2c 37 2c 38 20 2a 2f 0a 20 20    /* 6,7,8 */.  
11aa0 20 20 20 20 36 2c 20 36 2c 20 36 2c 20 20 20 20      6, 6, 6,    
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ac0 20 20 20 2f 2a 20 39 2c 31 30 2c 31 31 20 2a 2f     /* 9,10,11 */
11ad0 0a 20 20 20 20 20 20 35 2c 20 35 2c 20 35 2c 20  .      5, 5, 5, 
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11af0 20 20 20 20 20 20 2f 2a 20 31 32 2d 31 34 20 2a        /* 12-14 *
11b00 2f 0a 20 20 20 20 20 20 34 2c 20 34 2c 20 34 2c  /.      4, 4, 4,
11b10 20 34 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   4,             
11b20 20 20 20 20 20 20 20 2f 2a 20 31 35 2d 31 38 20         /* 15-18 
11b30 2a 2f 0a 20 20 20 20 20 20 33 2c 20 33 2c 20 33  */.      3, 3, 3
11b40 2c 20 33 2c 20 33 2c 20 33 2c 20 20 20 20 20 20  , 3, 3, 3,      
11b50 20 20 20 20 20 20 20 20 2f 2a 20 31 39 2d 32 34          /* 19-24
11b60 20 2a 2f 0a 20 20 20 20 20 20 32 2c 20 32 2c 20   */.      2, 2, 
11b70 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 20  2, 2, 2, 2, 2,  
11b80 20 20 20 20 20 20 20 20 20 2f 2a 20 32 35 2d 33           /* 25-3
11b90 31 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 66 28 20  1 */.  };.  if( 
11ba0 61 3e 3d 62 20 29 7b 0a 20 20 20 20 69 66 28 20  a>=b ){.    if( 
11bb0 61 3e 62 2b 34 39 20 29 20 72 65 74 75 72 6e 20  a>b+49 ) return 
11bc0 61 3b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b 33  a;.    if( a>b+3
11bd0 31 20 29 20 72 65 74 75 72 6e 20 61 2b 31 3b 0a  1 ) return a+1;.
11be0 20 20 20 20 72 65 74 75 72 6e 20 61 2b 78 5b 61      return a+x[a
11bf0 2d 62 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -b];.  }else{.  
11c00 20 20 69 66 28 20 62 3e 61 2b 34 39 20 29 20 72    if( b>a+49 ) r
11c10 65 74 75 72 6e 20 62 3b 0a 20 20 20 20 69 66 28  eturn b;.    if(
11c20 20 62 3e 61 2b 33 31 20 29 20 72 65 74 75 72 6e   b>a+31 ) return
11c30 20 62 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   b+1;.    return
11c40 20 62 2b 78 5b 62 2d 61 5d 3b 0a 20 20 7d 0a 7d   b+x[b-a];.  }.}
11c50 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
11c60 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  an integer into 
11c70 61 20 57 68 65 72 65 43 6f 73 74 2e 20 20 49 6e  a WhereCost.  In
11c80 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63 6f   other words, co
11c90 6d 70 75 74 65 20 61 0a 2a 2a 20 67 6f 6f 64 20  mpute a.** good 
11ca0 61 70 70 72 6f 78 69 6d 61 74 61 74 69 6f 6e 20  approximatation 
11cb0 66 6f 72 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a  for 10*log2(x)..
11cc0 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43  */.static WhereC
11cd0 6f 73 74 20 77 68 65 72 65 43 6f 73 74 28 74 52  ost whereCost(tR
11ce0 6f 77 63 6e 74 20 78 29 7b 0a 20 20 73 74 61 74  owcnt x){.  stat
11cf0 69 63 20 57 68 65 72 65 43 6f 73 74 20 61 5b 5d  ic WhereCost a[]
11d00 20 3d 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35 2c   = { 0, 2, 3, 5,
11d10 20 36 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a 20   6, 7, 8, 9 };. 
11d20 20 57 68 65 72 65 43 6f 73 74 20 79 20 3d 20 34   WhereCost y = 4
11d30 30 3b 0a 20 20 69 66 28 20 78 3c 38 20 29 7b 0a  0;.  if( x<8 ){.
11d40 20 20 20 20 69 66 28 20 78 3c 32 20 29 20 72 65      if( x<2 ) re
11d50 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
11d60 65 28 20 78 3c 38 20 29 7b 20 20 79 20 2d 3d 20  e( x<8 ){  y -= 
11d70 31 30 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d 0a 20  10; x <<= 1; }. 
11d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
11d90 65 28 20 78 3e 32 35 35 20 29 7b 20 79 20 2b 3d  e( x>255 ){ y +=
11da0 20 34 30 3b 20 78 20 3e 3e 3d 20 34 3b 20 7d 0a   40; x >>= 4; }.
11db0 20 20 20 20 77 68 69 6c 65 28 20 78 3e 31 35 20      while( x>15 
11dc0 29 7b 20 20 79 20 2b 3d 20 31 30 3b 20 78 20 3e  ){  y += 10; x >
11dd0 3e 3d 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65  >= 1; }.  }.  re
11de0 74 75 72 6e 20 61 5b 78 26 37 5d 20 2b 20 79 20  turn a[x&7] + y 
11df0 2d 20 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  - 10;.}..#ifndef
11e00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
11e10 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
11e20 43 6f 6e 76 65 72 74 20 61 20 64 6f 75 62 6c 65  Convert a double
11e30 20 28 61 73 20 72 65 63 65 69 76 65 64 20 66 72   (as received fr
11e40 6f 6d 20 78 42 65 73 74 49 6e 64 65 78 20 6f 66  om xBestIndex of
11e50 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
11e60 29 0a 2a 2a 20 69 6e 74 6f 20 61 20 57 68 65 72  ).** into a Wher
11e70 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72  eCost.  In other
11e80 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20   words, compute 
11e90 61 6e 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  an approximation
11ea0 20 66 6f 72 0a 2a 2a 20 31 30 2a 6c 6f 67 32 28   for.** 10*log2(
11eb0 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  x)..*/.static Wh
11ec0 65 72 65 43 6f 73 74 20 77 68 65 72 65 43 6f 73  ereCost whereCos
11ed0 74 46 72 6f 6d 44 6f 75 62 6c 65 28 64 6f 75 62  tFromDouble(doub
11ee0 6c 65 20 78 29 7b 0a 20 20 75 36 34 20 61 3b 0a  le x){.  u64 a;.
11ef0 20 20 57 68 65 72 65 43 6f 73 74 20 65 3b 0a 20    WhereCost e;. 
11f00 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
11f10 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
11f20 61 29 3d 3d 38 20 29 3b 0a 20 20 69 66 28 20 78  a)==8 );.  if( x
11f30 3c 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=1 ) return 0;.
11f40 20 20 69 66 28 20 78 3c 3d 32 30 30 30 30 30 30    if( x<=2000000
11f50 30 30 30 20 29 20 72 65 74 75 72 6e 20 77 68 65  000 ) return whe
11f60 72 65 43 6f 73 74 28 28 74 52 6f 77 63 6e 74 29  reCost((tRowcnt)
11f70 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 2c  x);.  memcpy(&a,
11f80 20 26 78 2c 20 38 29 3b 0a 20 20 65 20 3d 20 28   &x, 8);.  e = (
11f90 61 3e 3e 35 32 29 20 2d 20 31 30 32 32 3b 0a 20  a>>52) - 1022;. 
11fa0 20 72 65 74 75 72 6e 20 65 2a 31 30 3b 0a 7d 0a   return e*10;.}.
11fb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11fc0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11fd0 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  LE */../*.** Est
11fe0 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69  imate the logari
11ff0 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
12000 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32   value to base 2
12010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
12020 65 43 6f 73 74 20 65 73 74 4c 6f 67 28 57 68 65  eCost estLog(Whe
12030 72 65 43 6f 73 74 20 4e 29 7b 0a 20 20 57 68 65  reCost N){.  Whe
12040 72 65 43 6f 73 74 20 78 20 3d 20 77 68 65 72 65  reCost x = where
12050 43 6f 73 74 28 4e 29 3b 0a 20 20 72 65 74 75 72  Cost(N);.  retur
12060 6e 20 78 3e 33 33 20 3f 20 78 20 2d 20 33 33 20  n x>33 ? x - 33 
12070 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77  : 0;.}../*.** Tw
12080 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  o routines for p
12090 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74  rinting the cont
120a0 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ent of an sqlite
120b0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20  3_index_info.** 
120c0 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64  structure.  Used
120d0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
120e0 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
120f0 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20    If neither.** 
12100 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53  SQLITE_TEST or S
12110 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20  QLITE_DEBUG are 
12120 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
12130 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ese routines.** 
12140 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23  are no-ops..*/.#
12150 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
12160 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12170 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
12180 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
12190 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64  LED).static void
121a0 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
121b0 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
121c0 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
121d0 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
121e0 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
121f0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
12200 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
12210 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
12220 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12230 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
12240 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
12250 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
12260 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
12270 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
12280 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
12290 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
122a0 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
122b0 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
122c0 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
122d0 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
122e0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
122f0 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
12300 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
12310 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
12320 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
12330 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
12340 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
12350 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
12360 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
12370 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
12380 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
12390 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
123a0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
123b0 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
123c0 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
123d0 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
123e0 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
123f0 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
12400 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
12410 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
12420 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
12430 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12440 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
12450 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
12460 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
12470 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
12480 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
12490 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
124a0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
124b0 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
124c0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
124d0 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
124e0 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
124f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
12500 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
12510 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
12520 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
12530 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
12540 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
12550 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
12560 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
12570 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12580 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
12590 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
125a0 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65  edCost);.}.#else
125b0 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
125c0 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
125d0 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
125e0 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
125f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12600 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
12610 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75  INDEX./*.** Retu
12620 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57  rn TRUE if the W
12630 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
12640 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66   pTerm is of a f
12650 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20  orm where it.** 
12660 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69  could be used wi
12670 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61  th an index to a
12680 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75  ccess pSrc, assu
12690 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69  ming an appropri
126a0 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69  ate.** index exi
126b0 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
126c0 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65  int termCanDrive
126d0 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65  Index(.  WhereTe
126e0 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20  rm *pTerm,      
126f0 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
12700 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
12710 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63  check */.  struc
12720 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
12730 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62  pSrc,     /* Tab
12740 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  le we are trying
12750 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20   to access */.  
12760 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12780 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65  * Tables in oute
12790 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a  r loops of the j
127a0 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  oin */.){.  char
127b0 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72   aff;.  if( pTer
127c0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70  m->leftCursor!=p
127d0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72  Src->iCursor ) r
127e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
127f0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12800 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72   & WO_EQ)==0 ) r
12810 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
12820 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
12830 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ht & notReady)!=
12840 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12850 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  if( pTerm->u.lef
12860 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  tColumn<0 ) retu
12870 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53  rn 0;.  aff = pS
12880 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  rc->pTab->aCol[p
12890 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
128a0 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
128b0 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
128c0 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72  xAffinityOk(pTer
128d0 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29  m->pExpr, aff) )
128e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
128f0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
12900 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12910 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
12920 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  INDEX./*.** Gene
12930 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e  rate code to con
12940 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
12950 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61   object for an a
12960 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a  utomatic index.*
12970 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20  * and to set up 
12980 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f  the WhereLevel o
12990 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20  bject pLevel so 
129a0 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65  that the code ge
129b0 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73  nerator.** makes
129c0 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f   use of the auto
129d0 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a  matic index..*/.
129e0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73  static void cons
129f0 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
12a00 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
12a10 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
12a20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
12a30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
12a40 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
12a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12a60 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
12a70 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
12a80 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
12a90 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
12aa0 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74  se term to get t
12ab0 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f  he next index */
12ac0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
12ad0 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
12ae0 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
12af0 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
12b00 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68  vailable */.  Wh
12b10 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
12b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
12b30 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72  te new index her
12b40 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43  e */.){.  int nC
12b50 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
12b60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12b70 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
12b80 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
12b90 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  dex */.  WhereTe
12ba0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
12bb0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
12bc0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
12bd0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
12be0 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
12bf0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  ;          /* En
12c00 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
12c10 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12c30 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79  * Byte of memory
12c40 20 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64 78   needed for pIdx
12c50 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
12c60 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
12c70 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63    /* Object desc
12c80 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73  ribing the trans
12c90 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
12ca0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12cc0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
12cd0 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
12ce0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
12cf0 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  drInit;         
12d00 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
12d10 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
12d20 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75  zation bypass ju
12d30 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  mp */.  Table *p
12d40 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
12d50 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
12d60 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
12d70 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
12d80 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yinfo;          
12d90 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
12da0 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  on for the index
12db0 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64   */   .  int add
12dc0 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
12dd0 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
12de0 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f  he index fill lo
12df0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  op */.  int regR
12e00 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
12e10 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
12e20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  holding an index
12e30 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
12e40 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
12e50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
12e60 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  mn counter */.  
12e70 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
12e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
12e90 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
12ea0 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20   int mxBitCol;  
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ec0 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69  Maximum column i
12ed0 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  n pSrc->colUsed 
12ee0 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
12ef0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
12f00 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
12f10 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63  quence to on a c
12f20 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
12f30 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
12f40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f         /* The Lo
12f50 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 42  op object */.  B
12f60 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20  itmask idxCols; 
12f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
12f80 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  tmap of columns 
12f90 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e  used for indexin
12fa0 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  g */.  Bitmask e
12fb0 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20  xtraCols;       
12fc0 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
12fd0 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
12fe0 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ns */..  /* Gene
12ff0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
13000 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
13010 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
13020 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
13030 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
13040 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
13050 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
13060 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
13070 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
13080 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
13090 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
130a0 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
130b0 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
130c0 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
130d0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
130e0 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
130f0 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64  added to the ind
13100 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64  ex.  ** and used
13110 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20   to match WHERE 
13120 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
13130 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20  ts */.  nColumn 
13140 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  = 0;.  pTable = 
13150 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57  pSrc->pTab;.  pW
13160 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70  CEnd = &pWC->a[p
13170 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c  WC->nTerm];.  pL
13180 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
13190 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20  Loop;.  idxCols 
131a0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
131b0 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
131c0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
131d0 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
131e0 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
131f0 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
13200 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
13210 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
13220 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
13230 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
13240 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
13250 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
13260 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
13270 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
13280 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
13290 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
132a0 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69  BMS-1 );.      i
132b0 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
132c0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
132d0 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
132e0 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
132f0 62 2c 20 70 4c 6f 6f 70 2c 20 6e 43 6f 6c 75 6d  b, pLoop, nColum
13300 6e 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  n+1) ) return;. 
13310 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
13320 54 65 72 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b 5d 20  Term[nColumn++] 
13330 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
13340 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
13350 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
13360 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
13370 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c  Column>0 );.  pL
13380 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
13390 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
133a0 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4c   = nColumn;.  pL
133b0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
133c0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
133d0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
133e0 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13400 20 20 20 20 20 7c 20 57 48 45 52 45 5f 54 45 4d       | WHERE_TEM
13410 50 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  P_INDEX;..  /* C
13420 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
13430 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
13440 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
13450 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
13460 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
13470 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
13480 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
13490 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
134a0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
134b0 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
134c0 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
134d0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
134e0 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
134f0 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
13500 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
13510 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
13520 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
13530 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
13540 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
13550 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
13560 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
13570 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
13580 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
13590 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
135a0 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
135b0 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
135c0 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
135d0 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
135e0 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
135f0 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
13600 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
13610 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
13620 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e  tCol = (pTable->
13630 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f  nCol >= BMS-1) ?
13640 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d   BMS-1 : pTable-
13650 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73  >nCol;.  testcas
13660 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
13670 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74  =BMS-1 );.  test
13680 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
13690 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66  ol==BMS-2 );.  f
136a0 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
136b0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
136c0 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41  ( extraCols & MA
136d0 53 4b 42 49 54 28 69 29 20 29 20 6e 43 6f 6c 75  SKBIT(i) ) nColu
136e0 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  mn++;.  }.  if( 
136f0 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
13700 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
13710 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d  {.    nColumn +=
13720 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20   pTable->nCol - 
13730 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70  BMS + 1;.  }.  p
13740 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
13750 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
13760 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
13770 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75  Y;..  /* Constru
13780 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
13790 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
137a0 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
137b0 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49  nByte = sizeof(I
137c0 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b  ndex);.  nByte +
137d0 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
137e0 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e  (int);     /* In
137f0 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a  dex.aiColumn */.
13800 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
13810 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  mn*sizeof(char*)
13820 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43  ;   /* Index.azC
13830 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  oll */.  nByte +
13840 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  = nColumn;      
13850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
13860 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
13870 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74  /.  pIdx = sqlit
13880 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
13890 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65  Parse->db, nByte
138a0 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
138b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f   ) return;.  pLo
138c0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
138d0 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  ex = pIdx;.  pId
138e0 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
138f0 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20  r**)&pIdx[1];.  
13900 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
13910 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a   (int*)&pIdx->az
13920 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  Coll[nColumn];. 
13930 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
13940 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e  r = (u8*)&pIdx->
13950 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
13960 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  ];.  pIdx->zName
13970 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
13980 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
13990 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49   = nColumn;.  pI
139a0 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  dx->pTable = pTa
139b0 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  ble;.  n = 0;.  
139c0 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
139d0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
139e0 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
139f0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
13a00 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
13a10 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
13a20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
13a30 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
13a40 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
13a50 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
13a60 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
13a70 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
13a80 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
13a90 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ol);.      testc
13aa0 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
13ab0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13ac0 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
13ad0 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
13ae0 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
13af0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
13b00 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
13b10 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  pr;.        idxC
13b20 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
13b30 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
13b40 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d  lumn[n] = pTerm-
13b50 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
13b60 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
13b70 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
13b80 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
13b90 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
13ba0 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
13bb0 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
13bc0 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c  n] = ALWAYS(pCol
13bd0 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  l) ? pColl->zNam
13be0 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  e : "BINARY";.  
13bf0 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
13c00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
13c10 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70  ssert( (u32)n==p
13c20 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
13c30 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61  q );..  /* Add a
13c40 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
13c50 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  s needed to make
13c60 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
13c70 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  ndex into.  ** a
13c80 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
13c90 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
13ca0 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
13cb0 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
13cc0 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
13cd0 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
13ce0 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
13cf0 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
13d00 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
13d10 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
13d20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  }.  }.  if( pSrc
13d30 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
13d40 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
13d50 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69    for(i=BMS-1; i
13d60 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
13d70 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
13d80 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
13d90 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
13da0 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
13db0 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
13dc0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
13dd0 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  t( n==nColumn );
13de0 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
13df0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
13e00 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20  x */.  pKeyinfo 
13e10 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
13e20 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
13e30 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dx);.  assert( p
13e40 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
13e50 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 69  0 );.  pLevel->i
13e60 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  IdxCur = pParse-
13e70 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nTab++;.  sqlit
13e80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13e90 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78  OP_OpenAutoindex
13ea0 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
13eb0 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c  r, nColumn+1, 0,
13ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13ed0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
13ee0 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  info, P4_KEYINFO
13ef0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62  _HANDOFF);.  Vdb
13f00 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
13f10 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
13f20 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
13f30 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
13f40 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
13f50 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  ent */.  addrTop
13f60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13f70 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
13f80 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
13f90 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64  ur);.  regRecord
13fa0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
13fb0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
13fc0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
13fd0 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
13fe0 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  pIdx, pLevel->iT
13ff0 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  abCur, regRecord
14000 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
14010 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14020 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65  IdxInsert, pLeve
14030 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52  l->iIdxCur, regR
14040 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
14050 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
14060 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
14070 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65  ESULT);.  sqlite
14080 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14090 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e  P_Next, pLevel->
140a0 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70  iTabCur, addrTop
140b0 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
140c0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
140d0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
140e0 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71  AUTOINDEX);.  sq
140f0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14100 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  e(v, addrTop);. 
14110 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
14120 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
14130 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20  egRecord);.  .  
14140 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
14150 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
14160 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
14170 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
14180 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
14190 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  it);.}.#endif /*
141a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
141b0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
141c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
141d0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
141e0 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
141f0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
14200 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14210 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
14220 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
14230 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
14240 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
14250 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
14260 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
14270 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
14280 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
14290 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
142a0 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
142b0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
142c0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
142d0 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
142e0 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
142f0 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c  Parse,.  WhereCl
14300 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72  ause *pWC,.  str
14310 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
14320 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69   *pSrc,.  ExprLi
14330 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a  st *pOrderBy.){.
14340 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
14350 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63  t nTerm;.  struc
14360 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14370 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
14380 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
14390 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
143a0 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42  erby *pIdxOrderB
143b0 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  y;.  struct sqli
143c0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
143d0 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
143e0 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
143f0 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
14400 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
14410 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
14420 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f  dxInfo;..  /* Co
14430 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
14440 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45  f possible WHERE
14450 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
14460 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20  nts referring.  
14470 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75  ** to this virtu
14480 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  al table */.  fo
14490 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65  r(i=nTerm=0, pTe
144a0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
144b0 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
144c0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
144d0 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
144e0 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
144f0 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
14500 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
14510 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
14520 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
14530 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
14540 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
14550 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
14560 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14570 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14580 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
14590 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
145a0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
145b0 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e  ISNULL) ) contin
145c0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
145d0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
145e0 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
145f0 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b  ue;.    nTerm++;
14600 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
14610 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14620 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
14630 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
14640 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72  urrent .  ** vir
14650 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20  tual table then 
14660 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
14670 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20  or the aOrderBy 
14680 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  part of.  ** the
14690 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
146a0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20  nfo structure.. 
146b0 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   */.  nOrderBy =
146c0 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   0;.  if( pOrder
146d0 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  By ){.    int n 
146e0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
146f0 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
14700 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
14710 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
14720 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
14730 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
14740 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
14750 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
14760 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
14770 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
14780 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 29   }.    if( i==n)
14790 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79  {.      nOrderBy
147a0 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
147b0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
147c0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
147d0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  _info structure.
147e0 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20    */.  pIdxInfo 
147f0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
14800 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
14810 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e  , sizeof(*pIdxIn
14820 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo).            
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
14840 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f   (sizeof(*pIdxCo
14850 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55  ns) + sizeof(*pU
14860 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20  sage))*nTerm.   
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
14890 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e  (*pIdxOrderBy)*n
148a0 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28  OrderBy );.  if(
148b0 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
148c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
148d0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74  Msg(pParse, "out
148e0 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
148f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
14900 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
14910 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
14920 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
14930 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14940 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20  e contains.  ** 
14950 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74  many fields that
14960 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63   are declared "c
14970 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74  onst" to prevent
14980 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d   xBestIndex from
14990 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  .  ** changing t
149a0 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f  hem.  We have to
149b0 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63   do some funky c
149c0 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  asting in order 
149d0 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  to.  ** initiali
149e0 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e  ze those fields.
149f0 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  .  */.  pIdxCons
14a00 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
14a10 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14a20 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31  int*)&pIdxInfo[1
14a30 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79  ];.  pIdxOrderBy
14a40 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
14a50 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
14a60 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72  *)&pIdxCons[nTer
14a70 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28  m];.  pUsage = (
14a80 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14a90 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
14aa0 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65  usage*)&pIdxOrde
14ab0 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20  rBy[nOrderBy];. 
14ac0 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
14ad0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->nConstraint =
14ae0 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a   nTerm;.  *(int*
14af0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  )&pIdxInfo->nOrd
14b00 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
14b10 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
14b20 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
14b30 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
14b40 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->aConstraint = 
14b50 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74  pIdxCons;.  *(st
14b60 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14b70 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49  ex_orderby**)&pI
14b80 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  dxInfo->aOrderBy
14b90 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a   = pIdxOrderBy;.
14ba0 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
14bb0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14bc0 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64  int_usage**)&pId
14bd0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
14be0 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20  ntUsage =.      
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73               pUs
14c30 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d  age;..  for(i=j=
14c40 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
14c50 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
14c60 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
14c70 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66 28    u8 op;.    if(
14c80 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
14c90 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
14ca0 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
14cb0 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
14cc0 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
14cd0 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
14ce0 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
14cf0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
14d00 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
14d10 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
14d20 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
14d30 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
14d40 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
14d50 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
14d60 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
14d70 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
14d80 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
14d90 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
14da0 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
14db0 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
14dc0 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
14dd0 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
14de0 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
14df0 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75  = i;.    op = (u
14e00 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
14e10 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
14e20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
14e30 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
14e40 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
14e50 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
14e60 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
14e70 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
14e80 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
14e90 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
14ea0 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
14eb0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
14ec0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
14ed0 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
14ee0 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
14ef0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
14f00 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
14f10 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
14f20 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
14f30 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
14f40 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
14f50 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
14f60 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
14f70 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
14f80 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
14f90 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
14fa0 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
14fb0 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
14fc0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
14fd0 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
14fe0 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
14ff0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
15000 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
15010 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
15020 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
15030 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
15040 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
15050 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
15060 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
15070 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
15080 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
15090 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
150a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
150b0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
150c0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
150d0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
150e0 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
150f0 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
15100 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
15110 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
15120 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
15130 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
15140 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
15150 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
15160 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
15170 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
15180 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
15190 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
151a0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
151b0 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
151c0 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
151d0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
151e0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
151f0 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
15200 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
15210 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
15220 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
15230 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  info object that
15240 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20  .** comes in as 
15250 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74  the 3rd argument
15260 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
15270 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  n..**.** If an e
15280 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
15290 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
152a0 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
152b0 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
152c0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
152d0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
152e0 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
152f0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
15300 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
15310 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
15320 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
15330 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
15340 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
15350 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
15360 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
15370 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
15380 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
15390 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
153a0 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
153b0 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
153c0 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
153d0 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
153e0 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
153f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
15400 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
15410 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
15420 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
15430 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
15440 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
15450 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
15460 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
15470 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
15480 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
15490 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
154a0 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
154b0 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
154c0 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
154d0 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
154e0 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
154f0 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
15500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
15510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
15520 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
15530 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
15540 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
15550 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
15560 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
15570 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15580 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
15590 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
155a0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
155b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
155c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
155d0 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
155e0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
155f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
15600 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
15610 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
15620 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
15630 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
15640 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
15650 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
15660 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
15670 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
15680 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
15690 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
156a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
156b0 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
156c0 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
156d0 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
156e0 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
156f0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
15700 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
15710 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
15720 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
15730 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
15740 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
15750 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15760 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a  NABLE_STAT3./*.*
15770 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
15780 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
15790 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
157a0 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
157b0 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
157c0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
157d0 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
157e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
157f0 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
15800 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
15810 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a 20  ss than pVal.** 
15820 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
15830 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
15840 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 56  rows equal to pV
15850 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  al.**.** Return 
15860 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15870 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
15880 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74  int whereKeyStat
15890 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
158a0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
158b0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
158c0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  nection */.  Ind
158d0 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
158e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
158f0 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f  x to consider do
15900 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73 71 6c  main of */.  sql
15910 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
15920 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ,        /* Valu
15930 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  e to consider */
15940 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15960 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
15970 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
15980 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
15990 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
159a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
159b0 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
159c0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 74 52 6f  here */.){.  tRo
159d0 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64 65 78 53  wcnt n;.  IndexS
159e0 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 3b 0a  ample *aSample;.
159f0 20 20 69 6e 74 20 69 2c 20 65 54 79 70 65 3b 0a    int i, eType;.
15a00 20 20 69 6e 74 20 69 73 45 71 20 3d 20 30 3b 0a    int isEq = 0;.
15a10 20 20 69 36 34 20 76 3b 0a 20 20 64 6f 75 62 6c    i64 v;.  doubl
15a20 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61 73 73 65  e r, rS;..  asse
15a30 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30 20 7c  rt( roundUp==0 |
15a40 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29 3b 0a  | roundUp==1 );.
15a50 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
15a60 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 69  nSample>0 );.  i
15a70 66 28 20 70 56 61 6c 3d 3d 30 20 29 20 72 65 74  f( pVal==0 ) ret
15a80 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
15a90 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 61 69  ;.  n = pIdx->ai
15aa0 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 61 53 61  RowEst[0];.  aSa
15ab0 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61  mple = pIdx->aSa
15ac0 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65 20 3d 20  mple;.  eType = 
15ad0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
15ae0 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28  pe(pVal);..  if(
15af0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49   eType==SQLITE_I
15b00 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 76 20  NTEGER ){.    v 
15b10 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
15b20 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20 20 20  int64(pVal);.   
15b30 20 72 20 3d 20 28 69 36 34 29 76 3b 0a 20 20 20   r = (i64)v;.   
15b40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
15b50 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
15b60 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
15b70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
15b80 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  ITE_NULL ) conti
15b90 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61  nue;.      if( a
15ba0 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e  Sample[i].eType>
15bb0 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62  =SQLITE_TEXT ) b
15bc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
15bd0 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
15be0 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
15bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
15c00 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3e 3d  aSample[i].u.i>=
15c10 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  v ){.          i
15c20 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  sEq = aSample[i]
15c30 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20 20 20 20  .u.i==v;.       
15c40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
15c50 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
15c60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15c70 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
15c80 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20  e==SQLITE_FLOAT 
15c90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
15ca0 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 3d 72  Sample[i].u.r>=r
15cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
15cc0 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  Eq = aSample[i].
15cd0 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20  u.r==r;.        
15ce0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15cf0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15d00 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79  .  }else if( eTy
15d10 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54  pe==SQLITE_FLOAT
15d20 20 29 7b 0a 20 20 20 20 72 20 3d 20 73 71 6c 69   ){.    r = sqli
15d30 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
15d40 28 70 56 61 6c 29 3b 0a 20 20 20 20 66 6f 72 28  (pVal);.    for(
15d50 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61  i=0; i<pIdx->nSa
15d60 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
15d70 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
15d80 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e  .eType==SQLITE_N
15d90 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
15da0 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
15db0 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49  e[i].eType>=SQLI
15dc0 54 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b  TE_TEXT ) break;
15dd0 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
15de0 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
15df0 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  ITE_FLOAT ){.   
15e00 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c       rS = aSampl
15e10 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20 20 20 20  e[i].u.r;.      
15e20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
15e30 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  S = aSample[i].u
15e40 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  .i;.      }.    
15e50 20 20 69 66 28 20 72 53 3e 3d 72 20 29 7b 0a 20    if( rS>=r ){. 
15e60 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 72 53         isEq = rS
15e70 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ==r;.        bre
15e80 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
15e90 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54  }.  }else if( eT
15ea0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ype==SQLITE_NULL
15eb0 20 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20   ){.    i = 0;. 
15ec0 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 30     if( aSample[0
15ed0 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ].eType==SQLITE_
15ee0 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d 20 31 3b  NULL ) isEq = 1;
15ef0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
15f00 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
15f10 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79 70  ITE_TEXT || eTyp
15f20 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
15f30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
15f40 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
15f50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
15f60 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
15f70 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
15f80 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
15f90 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
15fa0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
15fb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15fc0 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e     if( i<pIdx->n
15fd0 53 61 6d 70 6c 65 20 29 7b 20 20 20 20 20 20 0a  Sample ){      .
15fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
15ff0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
16000 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
16010 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 73  Coll;.      cons
16020 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 20 69  t u8 *z;.      i
16030 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
16040 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20  _BLOB ){.       
16050 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a   z = (const u8 *
16060 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
16070 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20 20 20  lob(pVal);.     
16080 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     pColl = db->p
16090 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
160a0 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 2d    assert( pColl-
160b0 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
160c0 38 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  8 );.      }else
160d0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
160e0 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
160f0 53 65 71 28 70 50 61 72 73 65 2c 20 53 51 4c 49  Seq(pParse, SQLI
16100 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70 49 64  TE_UTF8, 0, *pId
16110 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  x->azColl);.    
16120 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30      if( pColl==0
16130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
16140 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
16150 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
16160 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20       z = (const 
16170 75 38 20 2a 29 73 71 6c 69 74 65 33 56 61 6c 75  u8 *)sqlite3Valu
16180 65 54 65 78 74 28 70 56 61 6c 2c 20 70 43 6f 6c  eText(pVal, pCol
16190 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 20 20 20  l->enc);.       
161a0 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20 20 20   if( !z ){.     
161b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
161c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
161d0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
161e0 72 74 28 20 7a 20 26 26 20 70 43 6f 6c 6c 20 26  rt( z && pColl &
161f0 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b  & pColl->xCmp );
16200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
16210 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 42   = sqlite3ValueB
16220 79 74 65 73 28 70 56 61 6c 2c 20 70 43 6f 6c 6c  ytes(pVal, pColl
16230 2d 3e 65 6e 63 29 3b 0a 20 20 0a 20 20 20 20 20  ->enc);.  .     
16240 20 66 6f 72 28 3b 20 69 3c 70 49 64 78 2d 3e 6e   for(; i<pIdx->n
16250 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
16260 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
16270 20 20 20 20 20 69 6e 74 20 65 53 61 6d 70 6c 65       int eSample
16280 74 79 70 65 20 3d 20 61 53 61 6d 70 6c 65 5b 69  type = aSample[i
16290 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].eType;.       
162a0 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65   if( eSampletype
162b0 3c 65 54 79 70 65 20 29 20 63 6f 6e 74 69 6e 75  <eType ) continu
162c0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  e;.        if( e
162d0 53 61 6d 70 6c 65 74 79 70 65 21 3d 65 54 79 70  Sampletype!=eTyp
162e0 65 20 29 20 62 72 65 61 6b 3b 0a 23 69 66 6e 64  e ) break;.#ifnd
162f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
16300 54 46 31 36 0a 20 20 20 20 20 20 20 20 69 66 28  TF16.        if(
16310 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53 51 4c   pColl->enc!=SQL
16320 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20  ITE_UTF8 ){.    
16330 20 20 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c        int nSampl
16340 65 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  e;.          cha
16350 72 20 2a 7a 53 61 6d 70 6c 65 20 3d 20 73 71 6c  r *zSample = sql
16360 69 74 65 33 55 74 66 38 74 6f 31 36 28 0a 20 20  ite3Utf8to16(.  
16370 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 20              db, 
16380 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53 61 6d  pColl->enc, aSam
16390 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53 61 6d  ple[i].u.z, aSam
163a0 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 26 6e  ple[i].nByte, &n
163b0 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 20 20 20  Sample.         
163c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
163d0 28 20 21 7a 53 61 6d 70 6c 65 20 29 7b 0a 20 20  ( !zSample ){.  
163e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
163f0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
16400 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed );.          
16410 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16420 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
16430 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
16440 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
16450 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 53 61 6d 70  ll->pUser, nSamp
16460 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e 2c 20  le, zSample, n, 
16470 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  z);.          sq
16480 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16490 7a 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20 20 20  zSample);.      
164a0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
164b0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
164c0 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43     c = pColl->xC
164d0 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
164e0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74   aSample[i].nByt
164f0 65 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  e, aSample[i].u.
16500 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20  z, n, z);.      
16510 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
16520 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c>=0 ){.        
16530 20 20 69 66 28 20 63 3d 3d 30 20 29 20 69 73 45    if( c==0 ) isE
16540 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  q = 1;.         
16550 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16560 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
16570 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
16580 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65  s point, aSample
16590 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74  [i] is the first
165a0 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
165b0 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a  greater than.  *
165c0 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56  * or equal to pV
165d0 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49  al.  Or if i==pI
165e0 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65  dx->nSample, the
165f0 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72  n all samples ar
16600 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  e less.  ** than
16610 20 70 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70   pVal.  If aSamp
16620 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65  le[i]==pVal, the
16630 6e 20 69 73 45 71 3d 3d 31 2e 0a 20 20 2a 2f 0a  n isEq==1..  */.
16640 20 20 69 66 28 20 69 73 45 71 20 29 7b 0a 20 20    if( isEq ){.  
16650 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78    assert( i<pIdx
16660 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20  ->nSample );.   
16670 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d   aStat[0] = aSam
16680 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20  ple[i].nLt;.    
16690 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70  aStat[1] = aSamp
166a0 6c 65 5b 69 5d 2e 6e 45 71 3b 0a 20 20 7d 65 6c  le[i].nEq;.  }el
166b0 73 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20  se{.    tRowcnt 
166c0 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20  iLower, iUpper, 
166d0 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d  iGap;.    if( i=
166e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  =0 ){.      iLow
166f0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55  er = 0;.      iU
16700 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30  pper = aSample[0
16710 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 65 6c 73 65  ].nLt;.    }else
16720 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  {.      iUpper =
16730 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i>=pIdx->nSampl
16740 65 20 3f 20 6e 20 3a 20 61 53 61 6d 70 6c 65 5b  e ? n : aSample[
16750 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20 20 20 69 4c  i].nLt;.      iL
16760 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  ower = aSample[i
16770 2d 31 5d 2e 6e 45 71 20 2b 20 61 53 61 6d 70 6c  -1].nEq + aSampl
16780 65 5b 69 2d 31 5d 2e 6e 4c 74 3b 0a 20 20 20 20  e[i-1].nLt;.    
16790 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  }.    aStat[1] =
167a0 20 70 49 64 78 2d 3e 61 76 67 45 71 3b 0a 20 20   pIdx->avgEq;.  
167b0 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55    if( iLower>=iU
167c0 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47  pper ){.      iG
167d0 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ap = 0;.    }els
167e0 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
167f0 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b  iUpper - iLower;
16800 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
16810 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20  oundUp ){.      
16820 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f  iGap = (iGap*2)/
16830 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  3;.    }else{.  
16840 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f      iGap = iGap/
16850 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74  3;.    }.    aSt
16860 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b  at[0] = iLower +
16870 20 69 47 61 70 3b 0a 20 20 7d 0a 20 20 72 65 74   iGap;.  }.  ret
16880 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16890 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
168a0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 20 2a  E_ENABLE_STAT3 *
168b0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72  /../*.** If expr
168c0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 72 65 70  ession pExpr rep
168d0 72 65 73 65 6e 74 73 20 61 20 6c 69 74 65 72 61  resents a litera
168e0 6c 20 76 61 6c 75 65 2c 20 73 65 74 20 2a 70 70  l value, set *pp
168f0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
16900 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
16910 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
16920 69 6e 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76  ining the same v
16930 61 6c 75 65 2c 20 77 69 74 68 20 61 66 66 69 6e  alue, with affin
16940 69 74 79 0a 2a 2a 20 61 66 66 20 61 70 70 6c 69  ity.** aff appli
16950 65 64 20 74 6f 20 69 74 2c 20 62 65 66 6f 72 65  ed to it, before
16960 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74 20 69   returning. It i
16970 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
16980 6c 69 74 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20  lity of the .** 
16990 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
169a0 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 69  ally release thi
169b0 73 20 73 74 72 75 63 74 75 72 65 20 62 79 20 70  s structure by p
169c0 61 73 73 69 6e 67 20 69 74 20 74 6f 20 0a 2a 2a  assing it to .**
169d0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
169e0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e()..**.** If th
169f0 65 20 63 75 72 72 65 6e 74 20 70 61 72 73 65 20  e current parse 
16a00 69 73 20 61 20 72 65 63 6f 6d 70 69 6c 65 20 28  is a recompile (
16a10 73 71 6c 69 74 65 33 52 65 70 72 65 70 61 72 65  sqlite3Reprepare
16a20 28 29 29 20 61 6e 64 20 70 45 78 70 72 0a 2a 2a  ()) and pExpr.**
16a30 20 69 73 20 61 6e 20 53 51 4c 20 76 61 72 69 61   is an SQL varia
16a40 62 6c 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  ble that current
16a50 6c 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e 55 4c  ly has a non-NUL
16a60 4c 20 76 61 6c 75 65 20 62 6f 75 6e 64 20 74 6f  L value bound to
16a70 20 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65 20 61   it,.** create a
16a80 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
16a90 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
16aa0 6e 69 6e 67 20 74 68 69 73 20 76 61 6c 75 65 2c  ning this value,
16ab0 20 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a 20 61   again with.** a
16ac0 66 66 69 6e 69 74 79 20 61 66 66 20 61 70 70 6c  ffinity aff appl
16ad0 69 65 64 20 74 6f 20 69 74 2c 20 69 6e 73 74 65  ied to it, inste
16ae0 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  ad..**.** If nei
16af0 74 68 65 72 20 6f 66 20 74 68 65 20 61 62 6f 76  ther of the abov
16b00 65 20 61 70 70 6c 79 2c 20 73 65 74 20 2a 70 70  e apply, set *pp
16b10 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
16b20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
16b30 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  rs, return an er
16b40 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
16b50 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
16b60 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
16b70 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 73 74  _ENABLE_STAT3.st
16b80 61 74 69 63 20 69 6e 74 20 76 61 6c 75 65 46 72  atic int valueFr
16b90 6f 6d 45 78 70 72 28 0a 20 20 50 61 72 73 65 20  omExpr(.  Parse 
16ba0 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72  *pParse, .  Expr
16bb0 20 2a 70 45 78 70 72 2c 20 0a 20 20 75 38 20 61   *pExpr, .  u8 a
16bc0 66 66 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  ff, .  sqlite3_v
16bd0 61 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20 20 69  alue **pp.){.  i
16be0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
16bf0 5f 56 41 52 49 41 42 4c 45 0a 20 20 20 7c 7c 20  _VARIABLE.   || 
16c00 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52  (pExpr->op==TK_R
16c10 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72  EGISTER && pExpr
16c20 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49 41 42  ->op2==TK_VARIAB
16c30 4c 45 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  LE).  ){.    int
16c40 20 69 56 61 72 20 3d 20 70 45 78 70 72 2d 3e 69   iVar = pExpr->i
16c50 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
16c60 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
16c70 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  k(pParse->pVdbe,
16c80 20 69 56 61 72 29 3b 0a 20 20 20 20 2a 70 70 20   iVar);.    *pp 
16c90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
16ca0 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52  Value(pParse->pR
16cb0 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20  eprepare, iVar, 
16cc0 61 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  aff);.    return
16cd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
16ce0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
16cf0 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  ValueFromExpr(pP
16d00 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
16d10 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 61 66   SQLITE_UTF8, af
16d20 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  f, pp);.}.#endif
16d30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
16d40 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
16d50 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
16d60 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
16d70 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65  t will be visite
16d80 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67  d.** by scanning
16d90 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20   an index for a 
16da0 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e  range of values.
16db0 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68   The range may h
16dc0 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20  ave an upper.** 
16dd0 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62  bound, a lower b
16de0 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54  ound, or both. T
16df0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
16e00 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74  terms that set t
16e10 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20  he upper.** and 
16e20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65  lower bounds are
16e30 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
16e40 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
16e50 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  r respectively. 
16e60 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
16e70 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e  assuming that in
16e80 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
16e90 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  ):.**.**   ... F
16ea0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
16eb0 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
16ec0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16ed0 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20         |_____|  
16ee0 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20   |_____|.**     
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f00 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a    |         |.**
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70       pLower    p
16f30 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Upper.**.** If e
16f40 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70  ither of the upp
16f50 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e  er or lower boun
16f60 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  d is not present
16f70 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70  , then NULL is p
16f80 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63  assed in.** plac
16f90 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  e of the corresp
16fa0 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d  onding WhereTerm
16fb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 71 20  ..**.** The nEq 
16fc0 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
16fd0 73 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66  sed the index of
16fe0 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
16ff0 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  n subject to the
17000 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  .** range constr
17010 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61  aint. Or, equiva
17020 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62  lently, the numb
17030 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63  er of equality c
17040 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 6f 70  onstraints.** op
17050 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70  timized by the p
17060 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63  roposed index sc
17070 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  an. For example,
17080 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20   assuming index 
17090 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c  p is.** on t1(a,
170a0 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c   b), and the SQL
170b0 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
170c0 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
170d0 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62  HERE a = ? AND b
170e0 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e   > ? AND b < ? .
170f0 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
17100 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  q should be pass
17110 65 64 20 74 68 65 20 76 61 6c 75 65 20 31 20 28  ed the value 1 (
17120 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73  as the range res
17130 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a  tricted column,.
17140 2a 2a 20 62 2c 20 69 73 20 74 68 65 20 73 65 63  ** b, is the sec
17150 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  ond left-most co
17160 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
17170 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71  x). Or, if the q
17180 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
17190 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
171a0 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
171b0 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
171c0 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20  n nEq should be 
171d0 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20  passed 0..**.** 
171e0 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
171f0 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ue is an integer
17200 20 64 69 76 69 73 6f 72 20 74 6f 20 72 65 64 75   divisor to redu
17210 63 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  ce the estimated
17220 0a 2a 2a 20 73 65 61 72 63 68 20 73 70 61 63 65  .** search space
17230 2e 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75  .  A return valu
17240 65 20 6f 66 20 31 20 6d 65 61 6e 73 20 74 68 61  e of 1 means tha
17250 74 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  t range constrai
17260 6e 74 73 20 61 72 65 0a 2a 2a 20 6e 6f 20 68 65  nts are.** no he
17270 6c 70 20 61 74 20 61 6c 6c 2e 20 20 41 20 72 65  lp at all.  A re
17280 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 20  turn value of 2 
17290 6d 65 61 6e 73 20 72 61 6e 67 65 20 63 6f 6e 73  means range cons
172a0 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 65  traints are.** e
172b0 78 70 65 63 74 65 64 20 74 6f 20 72 65 64 75 63  xpected to reduc
172c0 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  e the search spa
172d0 63 65 20 62 79 20 68 61 6c 66 2e 20 20 41 6e 64  ce by half.  And
172e0 20 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a 2a 0a   so forth....**.
172f0 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
17300 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
17310 33 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  3 ANALYZE data, 
17320 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75  each range inequ
17330 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73  ality.** reduces
17340 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
17350 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  e by a factor of
17360 20 34 2e 20 20 48 65 6e 63 65 20 61 20 73 69 6e   4.  Hence a sin
17370 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  gle constraint (
17380 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73 20  x>?).** results 
17390 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 34  in a return of 4
173a0 20 61 6e 64 20 61 20 72 61 6e 67 65 20 63 6f 6e   and a range con
173b0 73 74 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e 44  straint (x>? AND
173c0 20 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a 2a   x<?) results.**
173d0 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20   in a return of 
173e0 31 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  16..*/.static in
173f0 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e  t whereRangeScan
17400 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
17410 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
17420 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
17430 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
17440 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20   */.  Index *p, 
17450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17460 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 69  e index containi
17470 6e 67 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d  ng the range-com
17480 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22 78  pared column; "x
17490 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20  " */.  int nEq, 
174a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
174b0 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43 6f  ndex into p->aCo
174c0 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e 67 65  l[] of the range
174d0 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e  -compared column
174e0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
174f0 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
17500 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
17510 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
17520 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
17530 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
17540 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
17550 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
17560 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
17570 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
17580 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  LL */.  WhereCos
17590 74 20 2a 70 52 61 6e 67 65 44 69 76 20 2f 2a 20  t *pRangeDiv /* 
175a0 4f 55 54 3a 20 52 65 64 75 63 65 20 73 65 61 72  OUT: Reduce sear
175b0 63 68 20 73 70 61 63 65 20 62 79 20 74 68 69 73  ch space by this
175c0 20 64 69 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a 20   divisor */.){. 
175d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
175e0 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  _OK;..#ifdef SQL
175f0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
17600 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26  ..  if( nEq==0 &
17610 26 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a  & p->nSample ){.
17620 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
17630 65 20 2a 70 52 61 6e 67 65 56 61 6c 3b 0a 20 20  e *pRangeVal;.  
17640 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
17650 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f 77 63 6e   = 0;.    tRowcn
17660 74 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61 69  t iUpper = p->ai
17670 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 74  RowEst[0];.    t
17680 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20  Rowcnt a[2];.   
17690 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61   u8 aff = p->pTa
176a0 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
176b0 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69  olumn[0]].affini
176c0 74 79 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f  ty;..    if( pLo
176d0 77 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70  wer ){.      Exp
176e0 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65  r *pExpr = pLowe
176f0 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
17700 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c  ;.      rc = val
17710 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
17720 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26  e, pExpr, aff, &
17730 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20  pRangeVal);.    
17740 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 77 65    assert( (pLowe
17750 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
17760 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30  WO_GT|WO_GE))!=0
17770 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
17780 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
17790 20 20 20 26 26 20 77 68 65 72 65 4b 65 79 53 74     && whereKeySt
177a0 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
177b0 52 61 6e 67 65 56 61 6c 2c 20 30 2c 20 61 29 3d  RangeVal, 0, a)=
177c0 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
177d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77   ){.        iLow
177e0 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
177f0 20 20 20 69 66 28 20 28 70 4c 6f 77 65 72 2d 3e     if( (pLower->
17800 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
17810 54 29 21 3d 30 20 29 20 69 4c 6f 77 65 72 20 2b  T)!=0 ) iLower +
17820 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  = a[1];.      }.
17830 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
17840 75 65 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c  ueFree(pRangeVal
17850 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
17860 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
17870 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  & pUpper ){.    
17880 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
17890 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pUpper->pExpr->p
178a0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20  Right;.      rc 
178b0 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
178c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
178d0 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b  ff, &pRangeVal);
178e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
178f0 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
17900 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  r & (WO_LT|WO_LE
17910 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ))!=0 );.      i
17920 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17930 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65  .       && where
17940 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
17950 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 31   p, pRangeVal, 1
17960 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  , a)==SQLITE_OK.
17970 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
17980 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b 0a   iUpper = a[0];.
17990 20 20 20 20 20 20 20 20 69 66 28 20 28 70 55 70          if( (pUp
179a0 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  per->eOperator &
179b0 20 57 4f 5f 4c 45 29 21 3d 30 20 29 20 69 55 70   WO_LE)!=0 ) iUp
179c0 70 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20  per += a[1];.   
179d0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
179e0 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e  e3ValueFree(pRan
179f0 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  geVal);.    }.  
17a00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17a10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 57 68 65  _OK ){.      Whe
17a20 72 65 43 6f 73 74 20 69 42 61 73 65 20 3d 20 77  reCost iBase = w
17a30 68 65 72 65 43 6f 73 74 28 70 2d 3e 61 69 52 6f  hereCost(p->aiRo
17a40 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20  wEst[0]);.      
17a50 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65  if( iUpper>iLowe
17a60 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 42 61  r ){.        iBa
17a70 73 65 20 2d 3d 20 77 68 65 72 65 43 6f 73 74 28  se -= whereCost(
17a80 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29  iUpper - iLower)
17a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17aa0 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 69 42 61  *pRangeDiv = iBa
17ab0 73 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  se;.      WHERET
17ac0 52 41 43 45 28 30 78 31 30 30 2c 20 28 22 72 61  RACE(0x100, ("ra
17ad0 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73  nge scan regions
17ae0 3a 20 25 75 2e 2e 25 75 20 20 64 69 76 3d 25 64  : %u..%u  div=%d
17af0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
17b10 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
17b20 69 55 70 70 65 72 2c 20 2a 70 52 61 6e 67 65 44  iUpper, *pRangeD
17b30 69 76 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  iv));.      retu
17b40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17b50 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
17b60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
17b70 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53  (pParse);.  UNUS
17b80 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
17b90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
17ba0 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69 66  TER(nEq);.#endif
17bb0 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65  .  assert( pLowe
17bc0 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20  r || pUpper );. 
17bd0 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 30 3b   *pRangeDiv = 0;
17be0 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 45  .  /* TUNING:  E
17bf0 61 63 68 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ach inequality c
17c00 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63 65  onstraint reduce
17c10 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
17c20 63 65 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a 20  ce 4-fold..  ** 
17c30 41 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  A BETWEEN operat
17c40 6f 72 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 72  or, therefore, r
17c50 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
17c60 68 20 73 70 61 63 65 20 31 36 2d 66 6f 6c 64 20  h space 16-fold 
17c70 2a 2f 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20  */.  if( pLower 
17c80 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c  && (pLower->wtFl
17c90 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
17ca0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 61  )==0 ){.    *pRa
17cb0 6e 67 65 44 69 76 20 2b 3d 20 32 30 3b 20 20 61  ngeDiv += 20;  a
17cc0 73 73 65 72 74 28 20 32 30 3d 3d 77 68 65 72 65  ssert( 20==where
17cd0 43 6f 73 74 28 34 29 20 29 3b 0a 20 20 7d 0a 20  Cost(4) );.  }. 
17ce0 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20   if( pUpper ){. 
17cf0 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 2b 3d     *pRangeDiv +=
17d00 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30   20;  assert( 20
17d10 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29 20 29  ==whereCost(4) )
17d20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17d30 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
17d40 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
17d50 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
17d60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
17d70 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
17d80 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
17d90 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
17da0 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
17db0 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
17dc0 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
17dd0 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
17de0 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
17df0 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
17e00 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
17e10 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
17e20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
17e30 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
17e40 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
17e50 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
17e60 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
17e70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
17e80 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
17e90 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
17ea0 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
17eb0 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
17ec0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
17ed0 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
17ee0 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
17ef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17f00 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
17f10 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
17f20 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
17f30 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
17f40 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
17f50 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
17f60 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
17f70 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
17f80 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
17f90 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
17fa0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
17fb0 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
17fc0 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
17fd0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
17fe0 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
17ff0 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
18000 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
18010 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
18020 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
18030 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
18040 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
18050 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
18060 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
18070 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
18080 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
18090 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
180a0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
180b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
180c0 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66   index whose lef
180d0 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
180e0 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72   pTerm */.  Expr
180f0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
18100 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
18110 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
18120 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
18130 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  nt */.  tRowcnt 
18140 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
18150 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
18160 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
18170 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
18180 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 68 73 20  te3_value *pRhs 
18190 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f  = 0;  /* VALUE o
181a0 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
181b0 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20  e of pTerm */.  
181c0 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
181d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
181e0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
181f0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18210 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
18220 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
18230 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
18240 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
18250 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ics */..  assert
18260 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
18270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
18280 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
18290 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
182a0 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
182b0 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  [0]].affinity;. 
182c0 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
182d0 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
182e0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
182f0 70 72 2c 20 61 66 66 2c 20 26 70 52 68 73 29 3b  pr, aff, &pRhs);
18300 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
18310 74 6f 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  to whereEqualSca
18320 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a 20 20 7d  nEst_cancel;.  }
18330 65 6c 73 65 7b 0a 20 20 20 20 70 52 68 73 20 3d  else{.    pRhs =
18340 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
18350 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
18360 7d 0a 20 20 69 66 28 20 70 52 68 73 3d 3d 30 20  }.  if( pRhs==0 
18370 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
18380 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 72 63 20 3d  NOTFOUND;.  rc =
18390 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
183a0 50 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c 20  Parse, p, pRhs, 
183b0 30 2c 20 61 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, a);.  if( rc=
183c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
183d0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
183e0 30 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63  00,("equality sc
183f0 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e  an regions: %d\n
18400 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  ", (int)a[1]));.
18410 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31      *pnRow = a[1
18420 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45 71 75 61  ];.  }.whereEqua
18430 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a  lScanEst_cancel:
18440 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
18450 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74  ree(pRhs);.  ret
18460 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
18470 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
18480 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29  TE_ENABLE_STAT3)
18490 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
184a0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
184b0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
184c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
184d0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
184e0 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
184f0 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  .** an IN constr
18500 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72  aint where the r
18510 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
18520 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
18530 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f  r.** is a list o
18540 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70  f values.  Examp
18550 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
18560 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
18570 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ,3,4).**.** Writ
18580 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
18590 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
185a0 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
185b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
185c0 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
185d0 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
185e0 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
185f0 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
18600 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
18610 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18620 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
18630 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
18640 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
18650 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
18660 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
18670 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
18680 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
18690 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
186a0 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
186b0 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
186c0 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
186d0 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
186e0 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
186f0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
18700 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49  tatic int whereI
18710 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  nScanEst(.  Pars
18720 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
18730 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
18740 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
18750 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
18760 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
18770 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
18780 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  se left-most col
18790 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a  umn is pTerm */.
187a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
187b0 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
187c0 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
187d0 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
187e0 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
187f0 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
18800 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
18810 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
18820 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
18830 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
18840 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a  QLITE_OK;     /*
18850 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
18860 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
18870 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20  owcnt nEst;     
18880 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18890 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69  of rows for a si
188a0 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74  ngle term */.  t
188b0 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d  Rowcnt nRowEst =
188c0 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73   0;    /* New es
188d0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
188e0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a  mber of rows */.
188f0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
18900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
18910 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
18920 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
18930 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  le!=0 );.  for(i
18940 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
18950 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  K && i<pList->nE
18960 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  xpr; i++){.    n
18970 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  Est = p->aiRowEs
18980 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20 3d 20 77  t[0];.    rc = w
18990 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
189a0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 69 73  (pParse, p, pLis
189b0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
189c0 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
189d0 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 7d 0a  st += nEst;.  }.
189e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
189f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
18a00 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f  RowEst > p->aiRo
18a10 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73  wEst[0] ) nRowEs
18a20 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t = p->aiRowEst[
18a30 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  0];.    *pnRow =
18a40 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48   nRowEst;.    WH
18a50 45 52 45 54 52 41 43 45 28 30 78 31 30 30 2c 28  ERETRACE(0x100,(
18a60 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65  "IN row estimate
18a70 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f  : est=%g\n", nRo
18a80 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 72 65  wEst));.  }.  re
18a90 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
18aa0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
18ab0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
18ac0 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61  ) */../*.** Disa
18ad0 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68  ble a term in th
18ae0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
18af0 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
18b00 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d  disable the term
18b10 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f  .** if it contro
18b20 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  ls a LEFT OUTER 
18b30 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20  JOIN and it did 
18b40 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
18b50 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53   the ON.** or US
18b60 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
18b70 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43  at join..**.** C
18b80 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d  onsider the term
18b90 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68   t2.z='ok' in th
18ba0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
18bb0 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ies:.**.**   (1)
18bc0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
18bd0 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
18be0 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45  ON t1.a=t2.x WHE
18bf0 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  RE t2.z='ok'.** 
18c00 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20    (2)  SELECT * 
18c10 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
18c20 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
18c30 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
18c40 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54  **   (3)  SELECT
18c50 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57   * FROM t1, t2 W
18c60 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41  HERE t1.a=t2.x A
18c70 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a  ND t2.z='ok'.**.
18c80 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27  ** The t2.z='ok'
18c90 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
18ca0 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75  the in (2) becau
18cb0 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73  se it originates
18cc0 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  .** in the ON cl
18cd0 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20  ause.  The term 
18ce0 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  is disabled in (
18cf0 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73  3) because it is
18d00 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20   not part.** of 
18d10 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
18d20 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20  N.  In (1), the 
18d30 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61  term is not disa
18d40 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c  bled..**.** IMPL
18d50 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
18d60 2d 32 34 35 39 37 2d 35 38 36 35 35 20 4e 6f 20  -24597-58655 No 
18d70 74 65 73 74 73 20 61 72 65 20 64 6f 6e 65 20 66  tests are done f
18d80 6f 72 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  or terms that ar
18d90 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e.** completely 
18da0 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
18db0 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  ices..**.** Disa
18dc0 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75  bling a term cau
18dd0 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f  ses that term to
18de0 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69   not be tested i
18df0 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
18e00 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  .** of the join.
18e10 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61    Disabling is a
18e20 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
18e30 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20   When terms are 
18e40 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
18e50 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61  indices, we disa
18e60 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76  ble them to prev
18e70 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65  ent redundant te
18e80 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  sts in the inner
18e90 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f  .** loop.  We wo
18ea0 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72  uld get the corr
18eb0 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e  ect results if n
18ec0 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72  othing were ever
18ed0 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75   disabled,.** bu
18ee0 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75  t joins might ru
18ef0 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
18f00 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73  r.  The trick is
18f10 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d   to disable as m
18f20 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e  uch.** as we can
18f30 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69   without disabli
18f40 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66  ng too much.  If
18f50 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20   we disabled in 
18f60 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a  (1), we'd get.**
18f70 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65   the wrong answe
18f80 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  r.  See ticket #
18f90 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  813..*/.static v
18fa0 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28  oid disableTerm(
18fb0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
18fc0 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  el, WhereTerm *p
18fd0 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
18fe0 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65  rm.      && (pTe
18ff0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
19000 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20  RM_CODED)==0.   
19010 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69     && (pLevel->i
19020 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45  LeftJoin==0 || E
19030 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
19040 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
19050 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a  FromJoin)).  ){.
19060 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
19070 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
19080 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
19090 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
190a0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
190b0 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
190c0 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
190d0 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
190e0 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
190f0 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
19100 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
19110 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
19120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19130 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
19140 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   an OP_Affinity 
19150 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20  opcode to apply 
19160 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
19170 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a  ity string zAff.
19180 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69  ** to the n regi
19190 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
191a0 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41  t base. .**.** A
191b0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
191c0 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  n, SQLITE_AFF_NO
191d0 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63  NE entries (whic
191e0 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74  h are no-ops) at
191f0 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e   the.** beginnin
19200 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66  g and end of zAf
19210 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20  f are ignored.  
19220 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  If all entries i
19230 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51  n zAff are.** SQ
19240 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74  LITE_AFF_NONE, t
19250 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73  hen no code gets
19260 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a   generated..**.*
19270 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
19280 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70  akes its own cop
19290 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61  y of zAff so tha
192a0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  t the caller is 
192b0 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66  free.** to modif
192c0 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69  y zAff after thi
192d0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
192e0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
192f0 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e  d codeApplyAffin
19300 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
19310 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74  e, int base, int
19320 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b   n, char *zAff){
19330 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
19340 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
19350 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( zAff==0 ){.   
19360 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
19370 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
19380 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
19390 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76  .  }.  assert( v
193a0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a  !=0 );..  /* Adj
193b0 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74  ust base and n t
193c0 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49  o skip over SQLI
193d0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72  TE_AFF_NONE entr
193e0 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ies at the begin
193f0 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e  ning.  ** and en
19400 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74  d of the affinit
19410 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20  y string..  */. 
19420 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
19430 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41  Aff[0]==SQLITE_A
19440 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
19450 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a  --;.    base++;.
19460 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a      zAff++;.  }.
19470 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
19480 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54  zAff[n-1]==SQLIT
19490 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
194a0 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    n--;.  }..  /*
194b0 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66   Code the OP_Aff
194c0 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20  inity opcode if 
194d0 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e  there is anythin
194e0 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f  g left to do. */
194f0 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
19500 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19510 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op2(v, OP_Affini
19520 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  ty, base, n);.  
19530 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19540 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66  ngeP4(v, -1, zAf
19550 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  f, n);.    sqlit
19560 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
19570 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
19580 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a  , base, n);.  }.
19590 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
195a0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
195b0 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
195c0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
195d0 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
195e0 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
195f0 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
19600 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
19610 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
19620 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
19630 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
19640 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
19650 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
19660 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
19670 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a  ster iReg..**.**
19680 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
19690 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
196a0 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
196b0 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
196c0 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
196d0 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
196e0 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
196f0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
19700 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
19710 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
19720 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
19730 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
19740 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
19750 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
19760 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c  ic int codeEqual
19770 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
19780 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
19790 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
197a0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
197b0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
197c0 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
197d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
197e0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
197f0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
19800 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c  el, /* The level
19810 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
19820 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69  use we are worki
19830 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ng on */.  int i
19840 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  Eq,            /
19850 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65  * Index of the e
19860 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69 74  quality term wit
19870 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20 2a  hin this level *
19880 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20  /.  int bRev,   
19890 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
198a0 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65  for reverse-orde
198b0 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20  r IN operations 
198c0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74  */.  int iTarget
198d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65           /* Atte
198e0 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73  mpt to leave res
198f0 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67  ults in this reg
19900 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
19910 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
19920 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76  pExpr;.  Vdbe *v
19930 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
19940 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20  ;.  int iReg;   
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19960 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
19970 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  ng results */.. 
19980 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74   assert( iTarget
19990 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e  >0 );.  if( pX->
199a0 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20  op==TK_EQ ){.   
199b0 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
199c0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
199d0 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
199e0 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65  , iTarget);.  }e
199f0 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  lse if( pX->op==
19a00 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
19a10 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
19a20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19a30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
19a40 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66  l, 0, iReg);.#if
19a50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19a60 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73  _SUBQUERY.  }els
19a70 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65  e{.    int eType
19a80 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a  ;.    int iTab;.
19a90 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
19aa0 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65 72  p *pIn;.    Wher
19ab0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70  eLoop *pLoop = p
19ac0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a  Level->pWLoop;..
19ad0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
19ae0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
19af0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
19b00 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d  .      && pLoop-
19b10 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
19b20 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f  =0.      && pLoo
19b30 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
19b40 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 45  x->aSortOrder[iE
19b50 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q].    ){.      
19b60 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d 30  testcase( iEq==0
19b70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19b80 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20  se( bRev );.    
19b90 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a    bRev = !bRev;.
19ba0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19bb0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
19bc0 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54  );.    iReg = iT
19bd0 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65  arget;.    eType
19be0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
19bf0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58  Index(pParse, pX
19c00 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65 54  , 0);.    if( eT
19c10 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
19c20 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  DEX_DESC ){.    
19c30 20 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76    testcase( bRev
19c40 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d   );.      bRev =
19c50 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20   !bRev;.    }.  
19c60 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61    iTab = pX->iTa
19c70 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ble;.    sqlite3
19c80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
19c90 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
19ca0 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
19cb0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
19cc0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
19cd0 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
19ce0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  )==0 );.    pLoo
19cf0 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
19d00 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20  ERE_IN_ABLE;.   
19d10 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69   if( pLevel->u.i
19d20 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  n.nIn==0 ){.    
19d30 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78    pLevel->addrNx
19d40 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
19d50 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
19d60 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75   }.    pLevel->u
19d70 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70  .in.nIn++;.    p
19d80 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
19d90 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c  oop =.       sql
19da0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
19db0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
19dc0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
19dd0 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Loop,.          
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19df0 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65      sizeof(pLeve
19e00 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
19e10 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  0])*pLevel->u.in
19e20 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d  .nIn);.    pIn =
19e30 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
19e40 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  nLoop;.    if( p
19e50 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20  In ){.      pIn 
19e60 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  += pLevel->u.in.
19e70 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  nIn - 1;.      p
19e80 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b  In->iCur = iTab;
19e90 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
19ea0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
19eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d   ){.        pIn-
19ec0 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c  >addrInTop = sql
19ed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19ee0 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
19ef0 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
19f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
19f10 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
19f20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19f30 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
19f40 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20  Tab, 0, iReg);. 
19f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
19f60 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62  ->eEndLoopOp = b
19f70 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
19f80 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  OP_Next;.      s
19f90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
19fa0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69  (v, OP_IsNull, i
19fb0 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Reg);.    }else{
19fc0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  .      pLevel->u
19fd0 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  .in.nIn = 0;.   
19fe0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
19ff0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1a000 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65  el, pTerm);.  re
1a010 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
1a020 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1a030 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
1a040 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20  uate all == and 
1a050 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  IN constraints f
1a060 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a  or an.** index..
1a070 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1a080 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c  e, consider tabl
1a090 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  e t1(a,b,c,d,e,f
1a0a0 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28  ) with index i1(
1a0b0 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f  a,b,c)..** Suppo
1a0c0 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  se the WHERE cla
1a0d0 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d  use is this:  a=
1a0e0 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32  =5 AND b IN (1,2
1a0f0 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20  ,3) AND c>5 AND 
1a100 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65  c<10.** The inde
1a110 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73  x has as many as
1a120 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20   three equality 
1a130 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74  constraints, but
1a140 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d   in this.** exam
1a150 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22  ple, the third "
1a160 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69  c" value is an i
1a170 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f  nequality.  So o
1a180 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73  nly two .** cons
1a190 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65  traints are code
1a1a0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1a1b0 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63   will generate c
1a1c0 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ode to evaluate.
1a1d0 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e  ** a==5 and b IN
1a1e0 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63   (1,2,3).  The c
1a1f0 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
1a200 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62  r a and b will b
1a210 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63  e stored.** in c
1a220 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
1a230 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64  ters and the ind
1a240 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ex of the first 
1a250 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75  register is retu
1a260 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  rned..**.** In t
1a270 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
1a280 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68   nEq==2.  But th
1a290 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f  is subroutine wo
1a2a0 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75  rks for any valu
1a2b0 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c  e.** of nEq incl
1a2c0 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71  uding 0.  If nEq
1a2d0 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0, this routin
1a2e0 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f  e is nearly a no
1a2f0 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  -op..** The only
1a300 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69   thing it does i
1a310 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70  s allocate the p
1a320 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f  Level->iMem memo
1a330 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63  ry cell and.** c
1a340 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e  ompute the affin
1a350 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ity string..**.*
1a360 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1a370 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20  lways allocates 
1a380 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d  at least one mem
1a390 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74  ory cell and ret
1a3a0 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65  urns.** the inde
1a3b0 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79  x of that memory
1a3c0 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20   cell. The code 
1a3d0 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68  that.** calls th
1a3e0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1a3f0 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  use that memory 
1a400 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68  cell to store th
1a410 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a  e termination.**
1a420 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68   key value of th
1a430 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20  e loop.  If one 
1a440 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61  or more IN opera
1a450 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65  tors appear, the
1a460 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
1a470 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61  e allocates an a
1a480 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65  dditional nEq me
1a490 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69  mory cells for i
1a4a0 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a  nternal.** use..
1a4b0 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
1a4c0 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69  urning, *pzAff i
1a4d0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1a4e0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1a4f0 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20  ining a.** copy 
1a500 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  of the column af
1a510 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66  finity string of
1a520 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63   the index alloc
1a530 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71  ated using.** sq
1a540 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
1a550 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73   Except, entries
1a560 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20   in the copy of 
1a570 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63  the string assoc
1a580 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71  iated.** with eq
1a590 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1a5a0 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45  ts that use NONE
1a5b0 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73 65   affinity are se
1a5c0 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  t to.** SQLITE_A
1a5d0 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73  FF_NONE. This is
1a5e0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51   to deal with SQ
1a5f0 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f  L such as the fo
1a600 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
1a610 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1a620 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59 20  (a TEXT PRIMARY 
1a630 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45  KEY, b);.**   SE
1a640 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
1a650 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52 45   AS t2, t1 WHERE
1a660 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a   t1.a = t2.b;.**
1a670 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
1a680 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e  le above, the in
1a690 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73  dex on t1(a) has
1a6a0 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20   TEXT affinity. 
1a6b0 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65  But since.** the
1a6c0 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64 65   right hand side
1a6d0 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79   of the equality
1a6e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e   constraint (t2.
1a6f0 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69  b) has NONE affi
1a700 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76  nity,.** no conv
1a710 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  ersion should be
1a720 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72   attempted befor
1a730 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76  e using a t2.b v
1a740 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a  alue as part of.
1a750 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72  ** a key to sear
1a760 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65  ch the index. He
1a770 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62 79  nce the first by
1a780 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  te in the return
1a790 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73  ed affinity.** s
1a7a0 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78  tring in this ex
1a7b0 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73  ample would be s
1a7c0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46  et to SQLITE_AFF
1a7d0 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _NONE..*/.static
1a7e0 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61   int codeAllEqua
1a7f0 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72  lityTerms(.  Par
1a800 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1a810 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1a820 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
1a830 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
1a840 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64   /* Which nested
1a850 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f   loop of the FRO
1a860 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20  M we are coding 
1a870 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
1a880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1a890 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20  verse the order 
1a8a0 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  of IN operators 
1a8b0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52  */.  int nExtraR
1a8c0 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  eg,        /* Nu
1a8d0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
1a8e0 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
1a8f0 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
1a900 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f  pzAff          /
1a910 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f  * OUT: Set to po
1a920 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20  int to affinity 
1a930 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
1a940 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
1a950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a960 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
1a970 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
1a980 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  ts to code */.  
1a990 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1a9a0 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
1a9b0 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f   The vm under co
1a9c0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1a9d0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a9f0 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
1aa00 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
1aa10 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  oop */.  WhereTe
1aa20 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
1aa30 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
1aa40 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
1aa50 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  rm */.  WhereLoo
1aa60 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
1aa70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
1aa80 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
1aa90 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aab0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1aac0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
1aad0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1aae0 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
1aaf0 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
1ab00 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
1ab10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ab20 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
1ab30 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
1ab40 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
1ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ab60 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
1ab70 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
1ab80 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
1ab90 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
1aba0 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
1abb0 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
1abc0 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c   */.  pLoop = pL
1abd0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
1abe0 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
1abf0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1ac00 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
1ac10 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f   );.  nEq = pLoo
1ac20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
1ac30 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
1ac40 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
1ac50 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
1ac60 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  0 );..  /* Figur
1ac70 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
1ac80 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
1ac90 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
1aca0 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
1acb0 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
1acc0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
1acd0 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e    nReg = pLoop->
1ace0 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45  u.btree.nEq + nE
1acf0 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73  xtraReg;.  pPars
1ad00 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
1ad10 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74  ..  zAff = sqlit
1ad20 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
1ad30 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e  e->db, sqlite3In
1ad40 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
1ad50 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20  , pIdx));.  if( 
1ad60 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61  !zAff ){.    pPa
1ad70 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1ad80 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ailed = 1;.  }..
1ad90 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
1ada0 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
1adb0 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  raints.  */.  as
1adc0 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
1add0 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f  umn>=nEq );.  fo
1ade0 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  r(j=0; j<nEq; j+
1adf0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a  +){.    int r1;.
1ae00 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1ae10 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
1ae20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
1ae30 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 );.    /* The
1ae40 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20   following true 
1ae50 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68  for indices with
1ae60 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d   redundant colum
1ae70 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20  ns. .    ** Ex: 
1ae80 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
1ae90 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45  ON t1(a,b,a); SE
1aea0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1aeb0 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30  HERE a=0 AND b=0
1aec0 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73  ; */.    testcas
1aed0 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  e( (pTerm->wtFla
1aee0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
1aef0 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
1af00 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
1af10 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1af20 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
1af30 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
1af40 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c    r1 = codeEqual
1af50 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
1af60 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a  pTerm, pLevel, j
1af70 2c 20 62 52 65 76 2c 20 72 65 67 42 61 73 65 2b  , bRev, regBase+
1af80 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d  j);.    if( r1!=
1af90 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20  regBase+j ){.   
1afa0 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29     if( nReg==1 )
1afb0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1afc0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1afd0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 29  pParse, regBase)
1afe0 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  ;.        regBas
1aff0 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65  e = r1;.      }e
1b000 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1b010 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b020 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20  , OP_SCopy, r1, 
1b030 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
1b040 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1b050 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
1b060 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
1b070 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
1b080 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
1b090 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1b0a0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
1b0b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1b0c0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29  O_ISNULL|WO_IN))
1b0d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
1b0e0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72  r *pRight = pTer
1b0f0 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
1b100 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b110 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d  xprCodeIsNullJum
1b120 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67  p(v, pRight, reg
1b130 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e  Base+j, pLevel->
1b140 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20  addrBrk);.      
1b150 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20  if( zAff ){.    
1b160 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
1b170 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
1b180 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d  Right, zAff[j])=
1b190 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
1b1a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41   ){.          zA
1b1b0 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41  ff[j] = SQLITE_A
1b1c0 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
1b1d0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
1b1e0 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
1b1f0 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
1b200 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
1b210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41   ){.          zA
1b220 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41  ff[j] = SQLITE_A
1b230 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
1b240 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1b250 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20  .  }.  *pzAff = 
1b260 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72  zAff;.  return r
1b270 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64  egBase;.}..#ifnd
1b280 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
1b290 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  XPLAIN./*.** Thi
1b2a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  s routine is a h
1b2b0 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69  elper for explai
1b2c0 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65  nIndexRange() be
1b2d0 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68  low.**.** pStr h
1b2e0 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f 66  olds the text of
1b2f0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
1b300 68 61 74 20 77 65 20 61 72 65 20 62 75 69 6c 64  hat we are build
1b310 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a  ing up one term.
1b320 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  ** at a time.  T
1b330 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
1b340 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74   a new term to t
1b350 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78  he end of the ex
1b360 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72  pression..** Ter
1b370 6d 73 20 61 72 65 20 73 65 70 61 72 61 74 65 64  ms are separated
1b380 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74   by AND so add t
1b390 68 65 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f  he "AND" text fo
1b3a0 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62  r second and sub
1b3b0 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73  sequent.** terms
1b3c0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
1b3d0 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70   void explainApp
1b3e0 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63  endTerm(.  StrAc
1b3f0 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20  cum *pStr,      
1b400 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65         /* The te
1b410 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65  xt expression be
1b420 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69  ing built */.  i
1b430 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20 20  nt iTerm,       
1b440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1b450 64 65 78 20 6f 66 20 74 68 69 73 20 74 65 72 6d  dex of this term
1b460 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65 72 6f  .  First is zero
1b470 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1b480 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20   *zColumn,      
1b490 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1b4a0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
1b4b0 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20 20  st char *zOp    
1b4c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1b4d0 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
1b4e0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54 65   */.){.  if( iTe
1b4f0 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72 41  rm ) sqlite3StrA
1b500 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
1b510 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20   " AND ", 5);.  
1b520 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1b530 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f 6c  ppend(pStr, zCol
1b540 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69  umn, -1);.  sqli
1b550 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1b560 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b  d(pStr, zOp, 1);
1b570 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1b580 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22  umAppend(pStr, "
1b590 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ?", 1);.}../*.**
1b5a0 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c   Argument pLevel
1b5b0 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74 72   describes a str
1b5c0 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e 69  ategy for scanni
1b5d0 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54  ng table pTab. T
1b5e0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
1b5f0 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
1b600 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 62  er to a string b
1b610 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
1b620 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a   a description.*
1b630 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74 20  * of the subset 
1b640 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73 63  of table rows sc
1b650 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74 72  anned by the str
1b660 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72  ategy in the for
1b670 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65  m of an.** SQL e
1b680 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69  xpression. Or, i
1b690 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 73  f all rows are s
1b6a0 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20  canned, NULL is 
1b6b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1b6c0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1b6d0 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  the query:.**.**
1b6e0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1b6f0 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e   t1 WHERE a=1 AN
1b700 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20  D b>2;.**.** is 
1b710 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73  run and there is
1b720 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c   an index on (a,
1b730 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66   b), then this f
1b740 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1b750 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69  a.** string simi
1b760 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  lar to:.**.**   
1b770 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a  "a=? AND b>?".**
1b780 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
1b790 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1b7a0 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
1b7b0 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
1b7c0 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74  bMalloc()..** It
1b7d0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
1b7e0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
1b7f0 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 65  ller to free the
1b800 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74 20   buffer when it 
1b810 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20  is.** no longer 
1b820 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
1b830 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61 69  tic char *explai
1b840 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c 69  nIndexRange(sqli
1b850 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
1b860 6f 70 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65  op *pLoop, Table
1b870 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
1b880 20 2a 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   *pIndex = pLoop
1b890 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1b8a0 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  ;.  int nEq = pL
1b8b0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1b8c0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
1b8d0 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70  Column *aCol = p
1b8e0 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74  Tab->aCol;.  int
1b8f0 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e   *aiColumn = pIn
1b900 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20  dex->aiColumn;. 
1b910 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a   StrAccum txt;..
1b920 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20    if( nEq==0 && 
1b930 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1b940 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
1b950 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
1b960 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  IT))==0 ){.    r
1b970 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
1b980 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
1b990 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53  it(&txt, 0, 0, S
1b9a0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
1b9b0 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62  );.  txt.db = db
1b9c0 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
1b9d0 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
1b9e0 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28  " (", 2);.  for(
1b9f0 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29  i=0; i<nEq; i++)
1ba00 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  {.    explainApp
1ba10 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c  endTerm(&txt, i,
1ba20 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69   aCol[aiColumn[i
1ba30 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a  ]].zName, "=");.
1ba40 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20    }..  j = i;.  
1ba50 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1ba60 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
1ba70 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  IT ){.    char *
1ba80 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e  z = (j==pIndex->
1ba90 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77  nColumn ) ? "row
1baa0 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
1bab0 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
1bac0 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
1bad0 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20  Term(&txt, i++, 
1bae0 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69  z, ">");.  }.  i
1baf0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1bb00 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  s&WHERE_TOP_LIMI
1bb10 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  T ){.    char *z
1bb20 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e   = (j==pIndex->n
1bb30 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69  Column ) ? "rowi
1bb40 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  d" : aCol[aiColu
1bb50 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  mn[j]].zName;.  
1bb60 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
1bb70 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20  erm(&txt, i, z, 
1bb80 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  "<");.  }.  sqli
1bb90 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1bba0 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b  d(&txt, ")", 1);
1bbb0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1bbc0 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
1bbd0 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  &txt);.}../*.** 
1bbe0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1bbf0 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1bc00 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
1bc10 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20  sing an EXPLAIN 
1bc20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f  QUERY PLAN.** co
1bc30 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75  mmand. If the qu
1bc40 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c  ery being compil
1bc50 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  ed is an EXPLAIN
1bc60 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73   QUERY PLAN, a s
1bc70 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20  ingle.** record 
1bc80 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
1bc90 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69  output to descri
1bca0 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  be the table sca
1bcb0 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a  n strategy in .*
1bcc0 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  * pLevel..*/.sta
1bcd0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
1bce0 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65  OneScan(.  Parse
1bcf0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1bd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1bd10 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
1bd20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1bd30 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1bd40 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74   /* Table list t
1bd50 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20  his loop refers 
1bd60 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  to */.  WhereLev
1bd70 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20  el *pLevel,     
1bd80 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
1bd90 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c  to write OP_Expl
1bda0 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a  ain opcode for *
1bdb0 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
1bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdd0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
1bde0 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20   "level" column 
1bdf0 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  of output */.  i
1be00 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
1be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1be20 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f  * Value for "fro
1be30 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74  m" column of out
1be40 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  put */.  u16 wct
1be50 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  rlFlags         
1be60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1be70 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  s passed to sqli
1be80 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
1be90 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72  */.){.  if( pPar
1bea0 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
1beb0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1bec0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1bed0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1bee0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1bef0 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
1bf00 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
1bf10 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f    /* VM being co
1bf20 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20  nstructed */.   
1bf30 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1bf40 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
1bf50 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
1bf60 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
1bf70 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Msg;            
1bf80 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
1bf90 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74  o add to EQP out
1bfa0 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  put */.    int i
1bfb0 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
1bfc0 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65  lectId;  /* Sele
1bfd0 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74  ct id (left-most
1bfe0 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20   output column) 
1bff0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61  */.    int isSea
1c000 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  rch;            
1c010 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1c020 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65   a SEARCH. False
1c030 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20   for SCAN. */.  
1c040 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
1c050 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1c060 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69  /* The controlli
1c070 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ng WhereLoop obj
1c080 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66  ect */.    u32 f
1c090 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1c0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1c0b0 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
1c0c0 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20  this loop */..  
1c0d0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
1c0e0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c  ->pWLoop;.    fl
1c0f0 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46  ags = pLoop->wsF
1c100 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 28 66  lags;.    if( (f
1c110 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
1c120 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c  _OR) || (wctrlFl
1c130 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
1c140 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72  LE_ONLY) ) retur
1c150 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68  n;..    isSearch
1c160 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45 52 45   = (flags&(WHERE
1c170 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
1c180 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a  _TOP_LIMIT))!=0.
1c190 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
1c1a0 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52  (flags&WHERE_VIR
1c1b0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26  TUALTABLE)==0 &&
1c1c0 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65   (pLoop->u.btree
1c1d0 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20  .nEq>0)).       
1c1e0 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c       || (wctrlFl
1c1f0 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52  ags&(WHERE_ORDER
1c200 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44  BY_MIN|WHERE_ORD
1c210 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20  ERBY_MAX));..   
1c220 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1c230 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
1c240 20 69 73 53 65 61 72 63 68 3f 22 53 45 41 52 43   isSearch?"SEARC
1c250 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20  H":"SCAN");.    
1c260 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
1c270 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  ct ){.      zMsg
1c280 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1c290 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1c2a0 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a   SUBQUERY %d", z
1c2b0 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65  Msg,pItem->iSele
1c2c0 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ctId);.    }else
1c2d0 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
1c2e0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1c2f0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42  b, zMsg, "%s TAB
1c300 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  LE %s", zMsg, pI
1c310 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
1c320 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65   }..    if( pIte
1c330 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
1c340 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c350 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1c360 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20  sg, "%s AS %s", 
1c370 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  zMsg, pItem->zAl
1c380 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ias);.    }.    
1c390 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 57 48  if( (flags & (WH
1c3a0 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49  ERE_IPK|WHERE_VI
1c3b0 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a  RTUALTABLE))==0.
1c3c0 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70       && ALWAYS(p
1c3d0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1c3e0 6e 64 65 78 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ndex!=0).    ){.
1c3f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65        char *zWhe
1c400 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65  re = explainInde
1c410 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f 6f 70  xRange(db, pLoop
1c420 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
1c430 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1c440 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1c450 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47   zMsg, "%s USING
1c460 20 25 73 25 73 49 4e 44 45 58 25 73 25 73 25 73   %s%sINDEX%s%s%s
1c470 22 2c 20 7a 4d 73 67 2c 20 0a 20 20 20 20 20 20  ", zMsg, .      
1c480 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48      ((flags & WH
1c490 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f  ERE_TEMP_INDEX)?
1c4a0 22 41 55 54 4f 4d 41 54 49 43 20 22 3a 22 22 29  "AUTOMATIC ":"")
1c4b0 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c  ,.          ((fl
1c4c0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
1c4d0 4f 4e 4c 59 29 3f 22 43 4f 56 45 52 49 4e 47 20  ONLY)?"COVERING 
1c4e0 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20  ":""),.         
1c4f0 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
1c500 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a  _TEMP_INDEX)?"":
1c510 22 20 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20  " "),.          
1c520 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ((flags & WHERE_
1c530 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 20  TEMP_INDEX)?"": 
1c540 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
1c550 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20  Index->zName),. 
1c560 20 20 20 20 20 20 20 20 20 7a 57 68 65 72 65 0a           zWhere.
1c570 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
1c580 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1c590 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65   zWhere);.    }e
1c5a0 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
1c5b0 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 20 26   WHERE_IPK)!=0 &
1c5c0 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  & (flags & WHERE
1c5d0 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 20  _CONSTRAINT)!=0 
1c5e0 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
1c5f0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1c600 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53  db, zMsg, "%s US
1c610 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
1c620 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b  ARY KEY", zMsg);
1c630 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  ..      if( flag
1c640 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  s&(WHERE_COLUMN_
1c650 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  EQ|WHERE_COLUMN_
1c660 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  IN) ){.        z
1c670 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1c680 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1c690 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20  "%s (rowid=?)", 
1c6a0 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
1c6b0 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57 48  se if( (flags&WH
1c6c0 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d  ERE_BOTH_LIMIT)=
1c6d0 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  =WHERE_BOTH_LIMI
1c6e0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  T ){.        zMs
1c6f0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1c700 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1c710 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72  s (rowid>? AND r
1c720 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid<?)", zMsg);
1c730 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1c740 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d   flags&WHERE_BTM
1c750 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
1c760 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1c770 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1c780 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29  g, "%s (rowid>?)
1c790 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
1c7a0 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
1c7b0 28 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50  (flags&WHERE_TOP
1c7c0 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20  _LIMIT) ){.     
1c7d0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c7e0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1c7f0 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f  sg, "%s (rowid<?
1c800 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
1c810 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
1c820 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1c830 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c  TUALTABLE.    el
1c840 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  se if( (flags & 
1c850 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1c860 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
1c870 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c880 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c890 20 22 25 73 20 56 49 52 54 55 41 4c 20 54 41 42   "%s VIRTUAL TAB
1c8a0 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c  LE INDEX %d:%s",
1c8b0 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20   zMsg,.         
1c8c0 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
1c8d0 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
1c8e0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1c8f0 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Str);.    }.#end
1c900 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  if.    zMsg = sq
1c910 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1c920 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c 20 7a 4d  , zMsg, "%s", zM
1c930 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
1c940 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1c950 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69  _Explain, iId, i
1c960 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d  Level, iFrom, zM
1c970 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
1c980 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
1c990 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65  efine explainOne
1c9a0 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a  Scan(u,v,w,x,y,z
1c9b0 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
1c9c0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
1c9d0 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  */.../*.** Gener
1c9e0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
1c9f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
1ca00 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
1ca10 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1ca20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
1ca30 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
1ca40 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69  pWInfo..*/.stati
1ca50 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e  c Bitmask codeOn
1ca60 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68  eLoopStart(.  Wh
1ca70 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
1ca80 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69     /* Complete i
1ca90 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
1caa0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1cab0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
1cac0 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
1cad0 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57  hich level of pW
1cae0 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64  Info->a[] should
1caf0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42   be coded */.  B
1cb00 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
1cb10 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
1cb20 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
1cb30 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
1cb40 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
1cb50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1cb60 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
1cb70 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
1cb80 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
1cb90 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
1cba0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
1cbb0 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
1cbc0 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
1cbd0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
1cbe0 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
1cbf0 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
1cc00 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
1cc10 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
1cc20 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
1cc30 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
1cc40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1cc50 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
1cc60 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1cc70 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
1cc80 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
1cc90 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
1cca0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1ccb0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1ccc0 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  p;    /* The Whe
1ccd0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65  reLoop object be
1cce0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57  ing coded */.  W
1ccf0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
1cd00 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
1cd10 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  tion of the enti
1cd20 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
1cd30 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1cd40 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
1cd50 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20       /* A WHERE 
1cd60 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
1cd70 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd90 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1cda0 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ext */.  Vdbe *v
1cdb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cdc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1cdd0 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e  prepared stmt un
1cde0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1cdf0 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
1ce00 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
1ce10 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63  Item;  /* FROM c
1ce20 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
1ce30 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
1ce40 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20  addrBrk;        
1ce50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
1ce60 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
1ce70 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  k out of the loo
1ce80 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
1ce90 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ont;            
1cea0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
1ceb0 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
1cec0 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20  with next cycle 
1ced0 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52  */.  int iRowidR
1cee0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  eg = 0;        /
1cef0 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65  * Rowid is store
1cf00 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  d in this regist
1cf10 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20  er, if not zero 
1cf20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73  */.  int iReleas
1cf30 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f  eReg = 0;      /
1cf40 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  * Temp register 
1cf50 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72  to free before r
1cf60 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 42 69  eturning */.  Bi
1cf70 74 6d 61 73 6b 20 6e 65 77 4e 6f 74 52 65 61 64  tmask newNotRead
1cf80 79 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  y;      /* Retur
1cf90 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 70 50  n value */..  pP
1cfa0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
1cfb0 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61  Parse;.  v = pPa
1cfc0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57  rse->pVdbe;.  pW
1cfd0 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
1cfe0 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57  ;.  pLevel = &pW
1cff0 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b  Info->a[iLevel];
1d000 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
1d010 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61  l->pWLoop;.  pTa
1d020 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  bItem = &pWInfo-
1d030 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
1d040 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
1d050 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
1d060 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20  iCursor;.  bRev 
1d070 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61  = (pWInfo->revMa
1d080 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a 20  sk>>iLevel)&1;. 
1d090 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c   omitTable = (pL
1d0a0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1d0b0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d  HERE_IDX_ONLY)!=
1d0c0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  0 .           &&
1d0d0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
1d0e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
1d0f0 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20 20  CE_TABLE)==0;.  
1d100 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1d110 28 76 2c 20 22 42 65 67 69 6e 20 4a 6f 69 6e 20  (v, "Begin Join 
1d120 4c 6f 6f 70 20 25 64 22 2c 20 69 4c 65 76 65 6c  Loop %d", iLevel
1d130 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  ));..  /* Create
1d140 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
1d150 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
1d160 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
1d170 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ons.  ** for the
1d180 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20   current loop.  
1d190 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20  Jump to addrBrk 
1d1a0 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
1d1b0 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d  a loop..  ** Jum
1d1c0 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
1d1d0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
1d1e0 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
1d1f0 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
1d200 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  op..  **.  ** Wh
1d210 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
1d220 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
1d230 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72  lso have a "addr
1d240 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a  Nxt" label that.
1d250 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f    ** means to co
1d260 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
1d270 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f  next IN value co
1d280 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e  mbination.  When
1d290 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20  .  ** there are 
1d2a0 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  no IN operators 
1d2b0 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  in the constrain
1d2c0 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74  ts, the "addrNxt
1d2d0 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20  " label.  ** is 
1d2e0 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64  the same as "add
1d2f0 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64  rBrk"..  */.  ad
1d300 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
1d310 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
1d320 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
1d330 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1d340 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20  (v);.  addrCont 
1d350 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
1d360 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
1d370 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
1d380 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1d390 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
1d3a0 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
1d3b0 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  OIN, allocate an
1d3c0 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  d.  ** initializ
1d3d0 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
1d3e0 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
1d3f0 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
1d400 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20  es any.  ** row 
1d410 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  of the left tabl
1d420 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  e of the join.. 
1d430 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
1d440 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
1d450 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79  abItem[0].jointy
1d460 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
1d470 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
1d480 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50  iLeftJoin = ++pP
1d490 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1d4a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d4b0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1d4c0 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   0, pLevel->iLef
1d4d0 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
1d4e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69  Comment((v, "ini
1d4f0 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d  t LEFT JOIN no-m
1d500 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20  atch flag"));.  
1d510 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
1d520 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63  case of a FROM c
1d530 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20 69  lause subquery i
1d540 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
1d550 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
1d560 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69  if( pTabItem->vi
1d570 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
1d580 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d    int regYield =
1d590 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65   pTabItem->regRe
1d5a0 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
1d5b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d5c0 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 49  P_Integer, pTabI
1d5d0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
1d5e0 2d 31 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  -1, regYield);. 
1d5f0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1d600 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d610 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
1d620 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56  regYield);.    V
1d630 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1d640 6e 65 78 74 20 72 6f 77 20 6f 66 20 63 6f 2d 72  next row of co-r
1d650 6f 75 74 69 6e 65 20 25 73 22 2c 20 70 54 61 62  outine %s", pTab
1d660 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
1d670 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e));.    sqlite3
1d680 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d690 5f 49 66 2c 20 72 65 67 59 69 65 6c 64 2b 31 2c  _If, regYield+1,
1d6a0 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70   addrBrk);.    p
1d6b0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47  Level->op = OP_G
1d6c0 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69  oto;.  }else..#i
1d6d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d6e0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1d6f0 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77 73   if(  (pLoop->ws
1d700 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
1d710 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
1d720 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a  {.    /* Case 1:
1d730 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61    The table is a
1d740 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20   virtual-table. 
1d750 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65 72   Use the VFilter
1d760 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a   and VNext.    *
1d770 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63  *          to ac
1d780 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20  cess the data.. 
1d790 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52     */.    int iR
1d7a0 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75  eg;   /* P3 Valu
1d7b0 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72  e for OP_VFilter
1d7c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
1d7d0 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69 6e  NotFound;.    in
1d7e0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
1d7f0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a  pLoop->nLTerm;..
1d800 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1d810 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1d820 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  ;.    iReg = sql
1d830 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
1d840 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72  (pParse, nConstr
1d850 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64 64  aint+2);.    add
1d860 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76  rNotFound = pLev
1d870 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20 20  el->addrBrk;.   
1d880 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e   for(j=0; j<nCon
1d890 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20  straint; j++){. 
1d8a0 20 20 20 20 20 69 6e 74 20 69 54 61 72 67 65 74       int iTarget
1d8b0 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20 20   = iReg+j+2;.   
1d8c0 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
1d8d0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
1d8e0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
1d8f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1d900 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
1d910 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1d920 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45 71  {.        codeEq
1d930 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
1d940 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
1d950 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61 72 67  , j, bRev, iTarg
1d960 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  et);.        add
1d970 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65 76  rNotFound = pLev
1d980 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20  el->addrNxt;.   
1d990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d9a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1d9b0 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  e(pParse, pTerm-
1d9c0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
1d9d0 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  iTarget);.      
1d9e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1d9f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1da00 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c 6f   OP_Integer, pLo
1da10 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75  op->u.vtab.idxNu
1da20 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71  m, iReg);.    sq
1da30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1da40 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
1da50 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52 65 67  Constraint, iReg
1da60 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
1da70 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1da80 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20  _VFilter, iCur, 
1da90 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69 52  addrNotFound, iR
1daa0 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eg,.            
1dab0 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
1dac0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 0a  >u.vtab.idxStr,.
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dae0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76        pLoop->u.v
1daf0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f 20 50  tab.needFree ? P
1db00 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53  4_MPRINTF : P4_S
1db10 54 41 54 49 43 29 3b 0a 20 20 20 20 70 4c 6f 6f  TATIC);.    pLoo
1db20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  p->u.vtab.needFr
1db30 65 65 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ee = 0;.    for(
1db40 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69  j=0; j<nConstrai
1db50 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29  nt && j<16; j++)
1db60 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f  {.      if( (pLo
1db70 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d  op->u.vtab.omitM
1db80 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20 20 20  ask>>j)&1 ){.   
1db90 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
1dba0 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e  (pLevel, pLoop->
1dbb0 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20  aLTerm[j]);.    
1dbc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c    }.    }.    pL
1dbd0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e  evel->op = OP_VN
1dbe0 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ext;.    pLevel-
1dbf0 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
1dc00 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
1dc10 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1dc20 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
1dc30 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
1dc40 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67  nge(pParse, iReg
1dc50 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
1dc60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1dc70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1dc80 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  , 1);.  }else.#e
1dc90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1dca0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1dcb0 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c 6f 6f   */..  if( (pLoo
1dcc0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1dcd0 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 26 26  RE_IPK)!=0.   &&
1dce0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1dcf0 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
1dd00 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
1dd10 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  _EQ))!=0.  ){.  
1dd20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
1dd30 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65   can directly re
1dd40 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65  ference a single
1dd50 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20   row using an.  
1dd60 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71    **          eq
1dd70 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
1dd80 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
1dd90 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20  WID field.  Or. 
1dda0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
1ddb0 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
1ddc0 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
1ddd0 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
1dde0 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  )".    **       
1ddf0 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20     construct..  
1de00 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1de10 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1de20 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 69 52  nEq==1 );.    iR
1de30 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69  eleaseReg = sqli
1de40 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1de50 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65 72 6d  arse);.    pTerm
1de60 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1de70 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [0];.    assert(
1de80 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
1de90 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
1dea0 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
1deb0 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
1dec0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  e==0 );.    test
1ded0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
1dee0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1def0 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  UAL ); /* EV: R-
1df00 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
1df10 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63     iRowidReg = c
1df20 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1df30 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1df40 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20  Level, 0, bRev, 
1df50 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20  iReleaseReg);.  
1df60 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
1df70 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20  el->addrNxt;.   
1df80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1df90 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
1dfa0 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61  nt, iRowidReg, a
1dfb0 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c  ddrNxt);.    sql
1dfc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1dfd0 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
1dfe0 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69  iCur, addrNxt, i
1dff0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 73  RowidReg);.    s
1e000 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1e010 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1e020 61 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67 2c  arse, iRowidReg,
1e030 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
1e040 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
1e050 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
1e060 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1e070 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1e080 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65   "pk"));.    pLe
1e090 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
1e0a0 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  p;.  }else if( (
1e0b0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1e0c0 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20   WHERE_IPK)!=0. 
1e0d0 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f          && (pLoo
1e0e0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1e0f0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29  RE_COLUMN_RANGE)
1e100 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1e110 43 61 73 65 20 33 3a 20 20 57 65 20 68 61 76 65  Case 3:  We have
1e120 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
1e130 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
1e140 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
1e150 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
1e160 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
1e170 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  op;.    int star
1e180 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e  t;.    int memEn
1e190 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  dValue = 0;.    
1e1a0 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
1e1b0 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61  t, *pEnd;..    a
1e1c0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
1e1d0 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30  ==0 );.    j = 0
1e1e0 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  ;.    pStart = p
1e1f0 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  End = 0;.    if(
1e200 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1e210 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1e220 54 20 29 20 70 53 74 61 72 74 20 3d 20 70 4c 6f  T ) pStart = pLo
1e230 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1e240 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1e250 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1e260 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64  TOP_LIMIT ) pEnd
1e270 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1e280 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72  [j++];.    asser
1e290 74 28 20 70 53 74 61 72 74 21 3d 30 20 7c 7c 20  t( pStart!=0 || 
1e2a0 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  pEnd!=0 );.    i
1e2b0 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
1e2c0 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b   pTerm = pStart;
1e2d0 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20  .      pStart = 
1e2e0 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64  pEnd;.      pEnd
1e2f0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   = pTerm;.    }.
1e300 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
1e310 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
1e320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e330 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1e340 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
1e350 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a   start bound */.
1e360 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54        int r1, rT
1e370 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  emp;        /* R
1e380 65 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c  egisters for hol
1e390 64 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62  ding the start b
1e3a0 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20  oundary */..    
1e3b0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1e3c0 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73  ng constant maps
1e3d0 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74   TK_xx codes int
1e3e0 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  o corresponding 
1e3f0 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f  .      ** seek o
1e400 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65  pcodes.  It depe
1e410 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75  nds on a particu
1e420 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20  lar ordering of 
1e430 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20  TK_xx.      */. 
1e440 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d       const u8 aM
1e450 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  oveOp[] = {.    
1e460 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20         /* TK_GT 
1e470 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20  */  OP_SeekGt,. 
1e480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1e490 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65  LE */  OP_SeekLe
1e4a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
1e4b0 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LT */  OP_See
1e4c0 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLt,.           
1e4d0 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f  /* TK_GE */  OP_
1e4e0 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a  SeekGe.      };.
1e4f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e500 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20  _LE==TK_GT+1 ); 
1e510 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
1e520 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e  e the ordering..
1e530 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1e540 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
1e550 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
1e560 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61   of the TK_xx va
1e570 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  lues... */.     
1e580 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
1e590 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20  TK_GT+3 );      
1e5a0 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65  /*  ... is corre
1e5b0 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74  cct. */..      t
1e5c0 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d  estcase( pStart-
1e5d0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1e5e0 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
1e5f0 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
1e600 2a 2f 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53  */.      pX = pS
1e610 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  tart->pExpr;.   
1e620 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
1e630 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e640 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75  ( pStart->leftCu
1e650 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
1e660 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1e670 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e680 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
1e690 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20   &rTemp);.      
1e6a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e6b0 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d  3(v, aMoveOp[pX-
1e6c0 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72  >op-TK_GT], iCur
1e6d0 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a  , addrBrk, r1);.
1e6e0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1e6f0 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
1e700 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e710 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1e720 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31  ge(pParse, r1, 1
1e730 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e740 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1e750 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20  Parse, rTemp);. 
1e760 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
1e770 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29  (pLevel, pStart)
1e780 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e7a0 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f  dOp2(v, bRev ? O
1e7b0 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69  P_Last : OP_Rewi
1e7c0 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  nd, iCur, addrBr
1e7d0 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  k);.    }.    if
1e7e0 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ( pEnd ){.      
1e7f0 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20  Expr *pX;.      
1e800 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72  pX = pEnd->pExpr
1e810 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e820 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pX!=0 );.      a
1e830 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66  ssert( pEnd->lef
1e840 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
1e850 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e860 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26   pEnd->wtFlags &
1e870 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1e880 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
1e890 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d  11662 */.      m
1e8a0 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70  emEndValue = ++p
1e8b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1e8c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1e8d0 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
1e8e0 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c  Right, memEndVal
1e8f0 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ue);.      if( p
1e900 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  X->op==TK_LT || 
1e910 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b  pX->op==TK_GT ){
1e920 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
1e930 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a  = bRev ? OP_Le :
1e940 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65   OP_Ge;.      }e
1e950 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
1e960 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
1e970 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20  Lt : OP_Gt;.    
1e980 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c    }.      disabl
1e990 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45  eTerm(pLevel, pE
1e9a0 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nd);.    }.    s
1e9b0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
1e9c0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1e9d0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1e9e0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
1e9f0 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
1ea00 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
1ea10 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
1ea20 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
1ea30 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
1ea40 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  p5==0 );.    if(
1ea50 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
1ea60 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
1ea70 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
1ea80 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1ea90 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1eaa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1eab0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
1eac0 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  id, iCur, iRowid
1ead0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1eae0 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1eaf0 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
1eb00 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
1eb10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1eb20 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f  eAddOp3(v, testO
1eb30 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20  p, memEndValue, 
1eb40 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52  addrBrk, iRowidR
1eb50 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1eb60 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1eb70 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
1eb80 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55  ERIC | SQLITE_JU
1eb90 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  MPIFNULL);.    }
1eba0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f  .  }else if( pLo
1ebb0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1ebc0 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20  ERE_INDEXED ){. 
1ebd0 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41 20     /* Case 4: A 
1ebe0 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e  scan using an in
1ebf0 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
1ec00 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 57  **         The W
1ec10 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20  HERE clause may 
1ec20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20  contain zero or 
1ec30 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20  more equality . 
1ec40 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65     **         te
1ec50 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e  rms ("==" or "IN
1ec60 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61  " operators) tha
1ec70 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e  t refer to the N
1ec80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ec90 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
1eca0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  s of the index. 
1ecb0 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  It may also cont
1ecc0 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ain.    **      
1ecd0 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f     inequality co
1ece0 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c  nstraints (>, <,
1ecf0 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68   >= or <=) on th
1ed00 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a  e indexed.    **
1ed10 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
1ed20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  that immediately
1ed30 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65   follows the N e
1ed40 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20  qualities. Only 
1ed50 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ed60 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
1ed70 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20  olumn can be an 
1ed80 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65  inequality - the
1ed90 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a   rest must.    *
1eda0 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68  *         use th
1edb0 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20  e "==" and "IN" 
1edc0 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65  operators. For e
1edd0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a  xample, if the .
1ede0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
1edf0 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c  ndex is on (x,y,
1ee00 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  z), then the fol
1ee10 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61  lowing clauses a
1ee20 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20  re all .    **  
1ee30 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64         optimized
1ee40 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1ee50 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20             x=5. 
1ee60 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1ee70 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20   x=5 AND y=10.  
1ee80 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1ee90 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20  x=5 AND y<10.   
1eea0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1eeb0 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79  =5 AND y>5 AND y
1eec0 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
1eed0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
1eee0 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20  5 AND z<=10.    
1eef0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1ef00 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20    The z<10 term 
1ef10 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1ef20 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
1ef30 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20   only.    **    
1ef40 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72       the x=5 ter
1ef50 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m:.    **.    **
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1ef70 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a  AND z<10.    **.
1ef80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e      **         N
1ef90 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20   may be zero if 
1efa0 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
1efb0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1efc0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
1efd0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1efe0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1eff0 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20  traints, then N 
1f000 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20  is at.    **    
1f010 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a       least one..
1f020 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1f030 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20        This case 
1f040 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65  is also used whe
1f050 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  n there are no W
1f060 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20  HERE clause.    
1f070 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
1f080 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
1f090 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
1f0a0 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
1f0b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f0c0 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74  to force the out
1f0d0 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e  put order to con
1f0e0 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52  form to an ORDER
1f0f0 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20   BY..    */  .  
1f100 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1f110 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b  8 aStartOp[] = {
1f120 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
1f130 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69  0,.      OP_Rewi
1f140 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nd,           /*
1f150 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   2: (!start_cons
1f160 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
1f170 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f  Eq &&  !bRev) */
1f180 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20  .      OP_Last, 
1f190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33              /* 3
1f1a0 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72  : (!start_constr
1f1b0 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71  aints && startEq
1f1c0 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20   &&   bRev) */. 
1f1d0 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20       OP_SeekGt, 
1f1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20            /* 4: 
1f1f0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1f200 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
1f210 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
1f220 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20     OP_SeekLt,   
1f230 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73          /* 5: (s
1f240 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1f250 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26    && !startEq &&
1f260 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
1f270 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20   OP_SeekGe,     
1f280 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61        /* 6: (sta
1f290 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1f2a0 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21  &&  startEq && !
1f2b0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1f2c0 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20  P_SeekLe        
1f2d0 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74      /* 7: (start
1f2e0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1f2f0 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52    startEq &&  bR
1f300 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  ev) */.    };.  
1f310 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1f320 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20  8 aEndOp[] = {. 
1f330 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20       OP_Noop,   
1f340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
1f350 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74  (!end_constraint
1f360 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  s) */.      OP_I
1f370 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxGE,           
1f380 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 1: (end_cons
1f390 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76  traints && !bRev
1f3a0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1f3b0 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  xLT             
1f3c0 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 2: (end_const
1f3d0 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29 20  raints && bRev) 
1f3e0 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
1f3f0 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
1f400 2e 62 74 72 65 65 2e 6e 45 71 3b 20 20 2f 2a 20  .btree.nEq;  /* 
1f410 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
1f420 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  IN terms */.    
1f430 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d  int isMinQuery =
1f440 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
1f450 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1f460 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54  optimized SELECT
1f470 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20   min(x).. */.   
1f480 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20   int regBase;   
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f4a0 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68   Base register h
1f4b0 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e  olding constrain
1f4c0 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20  t values */.    
1f4d0 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20  int r1;         
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f4f0 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f  Temp register */
1f500 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1f510 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b  pRangeStart = 0;
1f520 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
1f530 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
1f540 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20  nge start */.   
1f550 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
1f560 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a  geEnd = 0;    /*
1f570 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
1f580 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
1f590 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  end */.    int s
1f5a0 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20  tartEq;         
1f5b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1f5c0 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75  if range start u
1f5d0 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
1f5e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45   */.    int endE
1f5f0 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
1f600 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1f610 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d  range end uses =
1f620 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20  =, >= or <= */. 
1f630 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e     int start_con
1f640 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20  straints;       
1f650 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67  /* Start of rang
1f660 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  e is constrained
1f670 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e   */.    int nCon
1f680 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20  straint;        
1f690 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f6a0 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  f constraint ter
1f6b0 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ms */.    Index 
1f6c0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
1f6d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1f6e0 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75  dex we will be u
1f6f0 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sing */.    int 
1f700 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20  iIdxCur;        
1f710 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f720 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
1f730 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
1f740 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d   int nExtraReg =
1f750 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1f760 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
1f770 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64 65   registers neede
1f780 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b  d */.    int op;
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7a0 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63        /* Instruc
1f7b0 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  tion opcode */. 
1f7c0 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41     char *zStartA
1f7d0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
1f7e0 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
1f7f0 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63  start of range c
1f800 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
1f810 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20   char *zEndAff; 
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f830 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e   Affinity for en
1f840 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74  d of range const
1f850 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49  raint */..    pI
1f860 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
1f870 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
1f880 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
1f890 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 6b  ->iIdxCur;.    k
1f8a0 20 3d 20 28 6e 45 71 3d 3d 70 49 64 78 2d 3e 6e   = (nEq==pIdx->n
1f8b0 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20 3a 20 70 49  Column ? -1 : pI
1f8c0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  dx->aiColumn[nEq
1f8d0 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ]);..    /* If t
1f8e0 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69  his loop satisfi
1f8f0 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20  es a sort order 
1f900 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65  (pOrderBy) reque
1f910 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20  st that .    ** 
1f920 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
1f930 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69  is function to i
1f940 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45  mplement a "SELE
1f950 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a  CT min(x) ..." .
1f960 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68      ** query, th
1f970 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  en the caller wi
1f980 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68  ll only allow th
1f990 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f  e loop to run fo
1f9a0 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c  r.    ** a singl
1f9b0 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  e iteration. Thi
1f9c0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1f9d0 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72   first row retur
1f9e0 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  ned.    ** shoul
1f9f0 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c  d not have a NUL
1fa00 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  L value stored i
1fa10 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e  n 'x'. If column
1fa20 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74   'x' is.    ** t
1fa30 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74  he first one aft
1fa40 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  er the nEq equal
1fa50 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1fa60 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20  in the index,.  
1fa70 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72    ** this requir
1fa80 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20  es some special 
1fa90 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f  handling..    */
1faa0 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
1fab0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45  ->wctrlFlags&WHE
1fac0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21  RE_ORDERBY_MIN)!
1fad0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e  =0.     && (pWIn
1fae0 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 29 0a 20  fo->bOBSat!=0). 
1faf0 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43      && (pIdx->nC
1fb00 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29  olumn>nEq).    )
1fb10 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  {.      /* asser
1fb20 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t( pOrderBy->nEx
1fb30 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20  pr==1 ); */.    
1fb40 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72    /* assert( pOr
1fb50 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70  derBy->a[0].pExp
1fb60 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  r->iColumn==pIdx
1fb70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20  ->aiColumn[nEq] 
1fb80 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69  ); */.      isMi
1fb90 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20  nQuery = 1;.    
1fba0 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
1fbb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
1fbc0 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69  ind any inequali
1fbd0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ty constraint te
1fbe0 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61 72  rms for the star
1fbf0 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a  t and end .    *
1fc00 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  * of the range. 
1fc10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6a 20 3d 20  .    */.    j = 
1fc20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  nEq;.    if( pLo
1fc30 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1fc40 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1fc50 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74 61  .      pRangeSta
1fc60 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rt = pLoop->aLTe
1fc70 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e  rm[j++];.      n
1fc80 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
1fc90 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
1fca0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1fcb0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
1fcc0 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20        pRangeEnd 
1fcd0 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1fce0 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74  j++];.      nExt
1fcf0 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
1fd00 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
1fd10 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
1fd20 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  te all constrain
1fd30 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d  t terms using ==
1fd40 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e   or IN.    ** an
1fd50 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  d store the valu
1fd60 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
1fd70 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  s in an array of
1fd80 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
1fd90 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65  * starting at re
1fda0 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  gBase..    */.  
1fdb0 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65    regBase = code
1fdc0 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
1fdd0 28 70 50 61 72 73 65 2c 70 4c 65 76 65 6c 2c 62  (pParse,pLevel,b
1fde0 52 65 76 2c 6e 45 78 74 72 61 52 65 67 2c 26 7a  Rev,nExtraReg,&z
1fdf0 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 7a  StartAff);.    z
1fe00 45 6e 64 41 66 66 20 3d 20 73 71 6c 69 74 65 33  EndAff = sqlite3
1fe10 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
1fe20 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  >db, zStartAff);
1fe30 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
1fe40 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
1fe50 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
1fe60 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73  e doing a revers
1fe70 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  e order scan on 
1fe80 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
1fe90 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  ex, or.    ** a 
1fea0 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63  forward order sc
1feb0 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69  an on a descendi
1fec0 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63  ng index, interc
1fed0 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a  hange the .    *
1fee0 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  * start and end 
1fef0 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61  terms (pRangeSta
1ff00 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64  rt and pRangeEnd
1ff10 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
1ff20 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f  ( (nEq<pIdx->nCo
1ff30 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70  lumn && bRev==(p
1ff40 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
1ff50 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  nEq]==SQLITE_SO_
1ff60 41 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62  ASC)).     || (b
1ff70 52 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f  Rev && pIdx->nCo
1ff80 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29  lumn==nEq).    )
1ff90 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65  {.      SWAP(Whe
1ffa0 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65  reTerm *, pRange
1ffb0 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74  End, pRangeStart
1ffc0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  );.    }..    te
1ffd0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
1ffe0 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74  art && (pRangeSt
1fff0 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
20000 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20   WO_LE)!=0 );.  
20010 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
20020 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61 6e  geStart && (pRan
20030 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
20040 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29  or & WO_GE)!=0 )
20050 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20060 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52  pRangeEnd && (pR
20070 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
20080 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
20090 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
200a0 70 52 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52  pRangeEnd && (pR
200b0 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
200c0 6f 72 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29  or & WO_GE)!=0 )
200d0 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20  ;.    startEq = 
200e0 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20  !pRangeStart || 
200f0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
20100 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
20110 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45  WO_GE);.    endE
20120 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64  q =   !pRangeEnd
20130 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   || pRangeEnd->e
20140 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
20150 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74  E|WO_GE);.    st
20160 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
20170 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c  = pRangeStart ||
20180 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20   nEq>0;..    /* 
20190 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63  Seek the index c
201a0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
201b0 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  rt of the range.
201c0 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
201d0 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
201e0 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29  f( pRangeStart )
201f0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
20200 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61  ight = pRangeSta
20210 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
20220 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
20230 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
20240 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
20250 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
20260 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77   (pRangeStart->w
20270 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
20280 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
20290 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
202a0 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
202b0 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
202c0 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
202d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
202e0 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20   zStartAff ){.  
202f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
20300 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
20310 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
20320 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
20330 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
20340 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
20350 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
20360 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
20370 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
20380 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
20390 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
203a0 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
203b0 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
203c0 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
203d0 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
203e0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
203f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
20400 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
20410 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
20420 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20430 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
20440 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
20450 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
20460 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20  zStartAff[nEq]) 
20470 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  ){.          zSt
20480 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
20490 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
204a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
204b0 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72    .      nConstr
204c0 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
204d0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
204e0 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
204f0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
20500 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
20510 36 36 32 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  662 */.    }else
20520 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20   if( isMinQuery 
20530 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20540 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20550 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
20560 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43  e+nEq);.      nC
20570 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
20580 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a     startEq = 0;.
20590 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73        start_cons
205a0 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20  traints = 1;.   
205b0 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79   }.    codeApply
205c0 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
205d0 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
205e0 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41 66 66  raint, zStartAff
205f0 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61  );.    op = aSta
20600 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73  rtOp[(start_cons
20610 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73  traints<<2) + (s
20620 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65  tartEq<<1) + bRe
20630 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  v];.    assert( 
20640 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  op!=0 );.    tes
20650 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65  tcase( op==OP_Re
20660 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65 73 74  wind );.    test
20670 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73  case( op==OP_Las
20680 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
20690 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74  e( op==OP_SeekGt
206a0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
206b0 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20  ( op==OP_SeekGe 
206c0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
206d0 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29   op==OP_SeekLe )
206e0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
206f0 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b  op==OP_SeekLt );
20700 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
20710 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
20720 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
20730 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
20740 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f  straint);..    /
20750 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65  * Load the value
20760 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c   for the inequal
20770 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
20780 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
20790 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69  .    ** range (i
207a0 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
207b0 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
207c0 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
207d0 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20  angeEnd ){.     
207e0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
207f0 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72  pRangeEnd->pExpr
20800 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
20810 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
20820 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  Remove(pParse, r
20830 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a  egBase+nEq, 1);.
20840 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20850 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
20860 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
20870 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  q);.      if( (p
20880 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
20890 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
208a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
208b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
208c0 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
208d0 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  t, regBase+nEq, 
208e0 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
208f0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64  }.      if( zEnd
20900 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
20910 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
20920 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
20930 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d  , zEndAff[nEq])=
20940 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
20950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
20960 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72  Since the compar
20970 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65  ison is to be pe
20980 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20  rformed with no 
20990 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20  conversions.    
209a0 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64        ** applied
209b0 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73   to the operands
209c0 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69  , set the affini
209d0 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  ty to apply to p
209e0 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20  Right to .      
209f0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46      ** SQLITE_AF
20a00 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20  F_NONE.  */.    
20a10 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45        zEndAff[nE
20a20 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
20a30 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
20a40 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
20a50 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
20a60 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
20a70 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71  ght, zEndAff[nEq
20a80 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
20a90 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53  zEndAff[nEq] = S
20aa0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
20ab0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20ac0 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65 41 70  }  .      codeAp
20ad0 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
20ae0 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 71  se, regBase, nEq
20af0 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20  +1, zEndAff);.  
20b00 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
20b10 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
20b20 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  e( pRangeEnd->wt
20b30 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
20b40 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
20b50 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
20b60 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
20b70 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
20b80 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  db, zStartAff);.
20b90 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
20ba0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 45  e(pParse->db, zE
20bb0 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20  ndAff);..    /* 
20bc0 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
20bd0 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76  body */.    pLev
20be0 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
20bf0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
20c00 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  v);..    /* Chec
20c10 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63  k if the index c
20c20 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68  ursor is past th
20c30 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  e end of the ran
20c40 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20  ge. */.    op = 
20c50 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e  aEndOp[(pRangeEn
20c60 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b  d || nEq) * (1 +
20c70 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73   bRev)];.    tes
20c80 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f  tcase( op==OP_No
20c90 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  op );.    testca
20ca0 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45  se( op==OP_IdxGE
20cb0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20cc0 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  ( op==OP_IdxLT )
20cd0 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50  ;.    if( op!=OP
20ce0 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
20cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20d00 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Int(v, op, iIdxC
20d10 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67  ur, addrNxt, reg
20d20 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
20d30 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
20d40 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
20d50 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a   endEq!=bRev ?1:
20d60 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
20d70 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 69  * If there are i
20d80 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
20d90 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61  aints, check tha
20da0 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  t the value.    
20db0 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
20dc0 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
20dd0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72  inequality contr
20de0 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ains is not NULL
20df0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69  ..    ** If it i
20e00 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  s, jump to the n
20e10 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
20e20 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a   the loop..    *
20e30 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74  /.    r1 = sqlit
20e40 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
20e50 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  rse);.    testca
20e60 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  se( pLoop->wsFla
20e70 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
20e80 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74  IMIT );.    test
20e90 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46  case( pLoop->wsF
20ea0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
20eb0 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66  _LIMIT );.    if
20ec0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
20ed0 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c  s & (WHERE_BTM_L
20ee0 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
20ef0 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20  IMIT))!=0 ){.   
20f00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20f10 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
20f20 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c  n, iIdxCur, nEq,
20f30 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
20f40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20f50 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20   OP_IsNull, r1, 
20f60 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d  addrCont);.    }
20f70 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
20f80 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
20f90 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  e, r1);..    /* 
20fa0 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63  Seek the table c
20fb0 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72  ursor, if requir
20fc0 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c  ed */.    disabl
20fd0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
20fe0 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
20ff0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
21000 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a  el, pRangeEnd);.
21010 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62      if( !omitTab
21020 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  le ){.      iRow
21030 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65  idReg = iRelease
21040 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
21050 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
21060 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21070 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
21080 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72  dxRowid, iIdxCur
21090 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
210a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
210b0 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
210c0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
210d0 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
210e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
210f0 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72  v, OP_Seek, iCur
21100 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f  , iRowidReg);  /
21110 2a 20 44 65 66 65 72 72 65 64 20 73 65 65 6b 20  * Deferred seek 
21120 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
21130 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74   Record the inst
21140 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  ruction used to 
21150 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
21160 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20  op. Disable .   
21170 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   ** WHERE clause
21180 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75   terms made redu
21190 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64  ndant by the ind
211a0 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20  ex range scan.. 
211b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
211c0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
211d0 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20  HERE_ONEROW ){. 
211e0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
211f0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d  = OP_Noop;.    }
21200 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b  else if( bRev ){
21210 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
21220 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20  p = OP_Prev;.   
21230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
21240 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65  evel->op = OP_Ne
21250 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  xt;.    }.    pL
21260 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43  evel->p1 = iIdxC
21270 75 72 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  ur;.    if( (pLo
21280 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
21290 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d  ERE_CONSTRAINT)=
212a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
212b0 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
212c0 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
212d0 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65  CAN_STEP;.    }e
212e0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
212f0 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30  t( pLevel->p5==0
21300 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
21310 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
21320 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
21330 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f  ZATION.  if( pLo
21340 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
21350 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a  ERE_MULTI_OR ){.
21360 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20      /* Case 5:  
21370 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  Two or more sepa
21380 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74  rately indexed t
21390 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
213a0 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y OR.    **.    
213b0 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
213c0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  **.    **   CREA
213d0 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c  TE TABLE t1(a,b,
213e0 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  c,d);.    **   C
213f0 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
21400 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20  N t1(a);.    ** 
21410 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
21420 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20  2 ON t1(b);.    
21430 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
21440 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20  X i3 ON t1(c);. 
21450 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
21460 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
21470 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37  WHERE a=5 OR b=7
21480 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d   OR (c=11 AND d=
21490 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  13).    **.    *
214a0 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
214b0 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  , there are thre
214c0 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  e indexed terms 
214d0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e  connected by OR.
214e0 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20  .    ** The top 
214f0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b  of the loop look
21500 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  s like this:.   
21510 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
21520 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31      Null       1
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21540 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65  # Zero the rowse
21550 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a  t in reg 1.    *
21560 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66  *.    ** Then, f
21570 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20  or each indexed 
21580 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  term, the follow
21590 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ing. The argumen
215a0 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77  ts to.    ** Row
215b0 53 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68  SetTest are such
215c0 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
215d0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
215e0 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20  ow is inserted. 
215f0 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52     ** into the R
21600 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20  owSet. If it is 
21610 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c  already present,
21620 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74   control skips t
21630 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20  he.    ** Gosub 
21640 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73  opcode and jumps
21650 20 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65   straight to the
21660 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
21670 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20  by WhereEnd().. 
21680 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
21690 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
216a0 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20  Begin(<term>).  
216b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f    **          Ro
216c0 77 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20  wSetTest        
216d0 20 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65            # Inse
216e0 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f  rt rowid into ro
216f0 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  wset.    **     
21700 20 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20       Gosub      
21710 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  2 A.    **      
21720 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
21730 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  d().    **.    *
21740 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * Following the 
21750 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74  above, code to t
21760 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
21770 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20  p. Label A, the 
21780 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66  target.    ** of
21790 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65   the Gosub above
217a0 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69  , jumps to the i
217b0 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74  nstruction right
217c0 20 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e   after the Goto.
217d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
217e0 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
217f0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
21800 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
21810 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
21820 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
21830 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20  oto       B     
21840 20 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65             # The
21850 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65   loop is finishe
21860 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
21870 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20         A: <loop 
21880 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20  body>           
21890 20 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64        # Return d
218a0 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20  ata, whatever.. 
218b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
218c0 20 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20        Return    
218d0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
218e0 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f    # Jump back to
218f0 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a   the Gosub.    *
21900 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42  *.    **       B
21910 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f  : <after the loo
21920 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f  p>.    **.    */
21930 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65  .    WhereClause
21940 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54   *pOrWc;    /* T
21950 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f  he OR-clause bro
21960 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62  ken out into sub
21970 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63  terms */.    Src
21980 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20  List *pOrTab;   
21990 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64      /* Shortened
219a0 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f   table list or O
219b0 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74  R-clause generat
219c0 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  ion */.    Index
219d0 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20   *pCov = 0;     
219e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e          /* Poten
219f0 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e  tial covering in
21a00 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  dex (or NULL) */
21a10 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72  .    int iCovCur
21a20 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
21a30 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73  +;  /* Cursor us
21a40 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61  ed for index sca
21a50 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a  ns (if any) */..
21a60 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72      int regRetur
21a70 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
21a80 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  em;           /*
21a90 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77   Register used w
21aa0 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a  ith OP_Gosub */.
21ab0 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65      int regRowse
21ac0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21ae0 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f   Register for Ro
21af0 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  wSet object */. 
21b00 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20     int regRowid 
21b10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b30 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
21b40 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e   rowid */.    in
21b50 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71  t iLoopBody = sq
21b60 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
21b70 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74  el(v);  /* Start
21b80 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f   of loop body */
21b90 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69  .    int iRetIni
21ba0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21bc0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65 67  * Address of reg
21bd0 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20  Return init */. 
21be0 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54     int untestedT
21bf0 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20  erms = 0;       
21c00 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65        /* Some te
21c10 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  rms not complete
21c20 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20  ly tested */.   
21c30 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
21c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c50 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21c60 74 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  ter */.    Expr 
21c70 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20  *pAndExpr = 0;  
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21c90 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e   An ".. AND (...
21ca0 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  )" expression */
21cb0 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d  .   .    pTerm =
21cc0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
21cd0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
21ce0 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61  Term!=0 );.    a
21cf0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
21d00 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20  perator & WO_OR 
21d10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
21d20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
21d30 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30   TERM_ORINFO)!=0
21d40 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20   );.    pOrWc = 
21d50 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
21d60 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65  o->wc;.    pLeve
21d70 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72  l->op = OP_Retur
21d80 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  n;.    pLevel->p
21d90 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a  1 = regReturn;..
21da0 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20      /* Set up a 
21db0 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70  new SrcList in p
21dc0 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67  OrTab containing
21dd0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
21de0 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20   scanned.    ** 
21df0 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20  by this loop in 
21e00 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e  the a[0] slot an
21e10 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74  d all notReady t
21e20 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20  ables in a[1..] 
21e30 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68  slots..    ** Th
21e40 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53  is becomes the S
21e50 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65  rcList in the re
21e60 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20  cursive call to 
21e70 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
21e80 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n()..    */.    
21e90 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
21ea0 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  el>1 ){.      in
21eb0 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20  t nNotReady;    
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21ed0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  The number of no
21ee0 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f  tReady tables */
21ef0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
21f00 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67  cList_item *orig
21f10 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  Src;     /* Orig
21f20 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62  inal list of tab
21f30 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f  les */.      nNo
21f40 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d  tReady = pWInfo-
21f50 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c  >nLevel - iLevel
21f60 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54   - 1;.      pOrT
21f70 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63  ab = sqlite3Stac
21f80 6b 41 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65  kAllocRaw(pParse
21f90 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fb0 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62    sizeof(*pOrTab
21fc0 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a  )+ nNotReady*siz
21fd0 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d  eof(pOrTab->a[0]
21fe0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ));.      if( pO
21ff0 72 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  rTab==0 ) return
22000 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20   notReady;.     
22010 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20   pOrTab->nAlloc 
22020 3d 20 28 69 31 36 29 28 6e 4e 6f 74 52 65 61 64  = (i16)(nNotRead
22030 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f  y + 1);.      pO
22040 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72  rTab->nSrc = pOr
22050 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20  Tab->nAlloc;.   
22060 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62     memcpy(pOrTab
22070 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73  ->a, pTabItem, s
22080 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29  izeof(*pTabItem)
22090 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63  );.      origSrc
220a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
220b0 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f  ist->a;.      fo
220c0 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65  r(k=1; k<=nNotRe
220d0 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  ady; k++){.     
220e0 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61     memcpy(&pOrTa
220f0 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72  b->a[k], &origSr
22100 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f  c[pLevel[k].iFro
22110 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61  m], sizeof(pOrTa
22120 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20  b->a[k]));.     
22130 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
22140 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49      pOrTab = pWI
22150 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
22160 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69     }..    /* Ini
22170 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73  tialize the rows
22180 65 74 20 72 65 67 69 73 74 65 72 20 74 6f 20 63  et register to c
22190 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20  ontain NULL. An 
221a0 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20  SQL NULL is .   
221b0 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
221c0 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65  o an empty rowse
221d0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
221e0 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65   Also initialize
221f0 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f   regReturn to co
22200 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73  ntain the addres
22210 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63  s of the instruc
22220 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d  tion .    ** imm
22230 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
22240 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e  ng the OP_Return
22250 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
22260 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73  f the loop. This
22270 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69  .    ** is requi
22280 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73  red in a few obs
22290 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63  cure LEFT JOIN c
222a0 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72  ases where contr
222b0 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20  ol jumps.    ** 
222c0 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20  over the top of 
222d0 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68  the loop into th
222e0 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e  e body of it. In
222f0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
22300 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72      ** correct r
22310 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20  esponse for the 
22320 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65  end-of-loop code
22330 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29   (the OP_Return)
22340 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66   is to .    ** f
22350 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
22360 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
22370 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20  ion, just as an 
22380 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a  OP_Next does if.
22390 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e      ** called on
223a0 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   an uninitialize
223b0 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f  d cursor..    */
223c0 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
223d0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
223e0 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
223f0 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
22400 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50  regRowset = ++pP
22410 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
22420 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
22430 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
22440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22450 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
22460 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a   0, regRowset);.
22470 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e      }.    iRetIn
22480 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
22490 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
224a0 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75  eger, 0, regRetu
224b0 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  rn);..    /* If 
224c0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  the original WHE
224d0 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f  RE clause is z o
224e0 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31  f the form:  (x1
224f0 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41   OR x2 OR ...) A
22500 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e  ND y.    ** Then
22510 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
22520 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20  xN, evaluate as 
22530 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
22540 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20  n: xN AND z.    
22550 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72  ** That way, ter
22560 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65  ms in y that are
22570 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74   factored into t
22580 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77  he disjunction w
22590 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69  ill.    ** be pi
225a0 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72  cked up by the r
225b0 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
225c0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
225d0 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20  gin() below..   
225e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61   **.    ** Actua
225f0 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70  lly, each subexp
22600 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65  ression is conve
22610 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20  rted to "xN AND 
22620 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20  w" where w is.  
22630 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65    ** the "intere
22640 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20  sting" terms of 
22650 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64  z - terms that d
22660 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
22670 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f   in the.    ** O
22680 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
22690 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
226a0 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74  , and terms that
226b0 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a   are usable as .
226c0 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a      ** indices..
226d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
226e0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
226f0 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65  also only applie
22700 73 20 69 66 20 74 68 65 20 28 78 31 20 4f 52 20  s if the (x1 OR 
22710 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a  x2 OR ...) term.
22720 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f      ** is not co
22730 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f  ntained in the O
22740 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
22750 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20  FT JOIN..    ** 
22760 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a  See ticket http:
22770 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
22780 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33  /src/info/f23693
22790 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20  04e4.    */.    
227a0 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31  if( pWC->nTerm>1
227b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
227c0 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  erm;.      for(i
227d0 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57  Term=0; iTerm<pW
227e0 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b  C->nTerm; iTerm+
227f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
22800 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61   *pExpr = pWC->a
22810 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20  [iTerm].pExpr;. 
22820 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
22830 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
22840 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
22850 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22860 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54     if( pWC->a[iT
22870 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28  erm].wtFlags & (
22880 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
22890 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74  M_ORINFO) ) cont
228a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
228b0 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( (pWC->a[iTerm]
228c0 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  .eOperator & WO_
228d0 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ALL)==0 ) contin
228e0 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  ue;.        pExp
228f0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
22900 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
22910 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
22920 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
22930 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
22940 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72  se->db, pAndExpr
22950 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
22960 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
22970 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
22980 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
22990 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
229a0 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45  TK_AND, 0, pAndE
229b0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
229c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
229d0 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e  ii=0; ii<pOrWc->
229e0 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
229f0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
22a00 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d  OrTerm = &pOrWc-
22a10 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66  >a[ii];.      if
22a20 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
22a30 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28  ursor==iCur || (
22a40 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
22a50 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
22a60 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
22a70 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b  Info *pSubWInfo;
22a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
22a90 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d  o for single OR-
22aa0 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20  term scan */.   
22ab0 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78       Expr *pOrEx
22ac0 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  pr = pOrTerm->pE
22ad0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
22ae0 20 70 41 6e 64 45 78 70 72 20 26 26 20 21 45 78   pAndExpr && !Ex
22af0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f  prHasProperty(pO
22b00 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rExpr, EP_FromJo
22b10 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  in) ){.         
22b20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
22b30 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20   = pOrExpr;.    
22b40 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20        pOrExpr = 
22b50 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20  pAndExpr;.      
22b60 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c    }.        /* L
22b70 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
22b80 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
22b90 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
22ba0 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53  m. */.        pS
22bb0 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  ubWInfo = sqlite
22bc0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
22bd0 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45  se, pOrTab, pOrE
22be0 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  xpr, 0, 0,.     
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c00 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50     WHERE_OMIT_OP
22c10 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45  EN_CLOSE | WHERE
22c20 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20  _AND_ONLY |.    
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c40 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f      WHERE_FORCE_
22c50 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e  TABLE | WHERE_ON
22c60 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f  ETABLE_ONLY, iCo
22c70 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61  vCur);.        a
22c80 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f  ssert( pSubWInfo
22c90 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
22ca0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
22cb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
22cc0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
22cd0 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  WInfo ){.       
22ce0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53     WhereLoop *pS
22cf0 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  ubLoop;.        
22d00 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e    explainOneScan
22d10 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
22d20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
22d30 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d  &pSubWInfo->a[0]
22d40 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c  , iLevel, pLevel
22d50 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20  ->iFrom, 0.     
22d60 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
22d70 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
22d80 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
22d90 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
22da0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
22db0 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28     int iSet = ((
22dc0 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ii==pOrWc->nTerm
22dd0 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20  -1)?-1:ii);.    
22de0 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20          int r;. 
22df0 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
22e00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
22e10 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
22e20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20  pTabItem->pTab, 
22e30 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20  -1, iCur, .     
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29      regRowid, 0)
22e70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
22e80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
22e90 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54  nt(v, OP_RowSetT
22ea0 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a  est, regRowset,.
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ed0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
22ee0 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c  entAddr(v)+2, r,
22ef0 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20   iSet);.        
22f00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
22f10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22f20 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
22f30 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64  Return, iLoopBod
22f40 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  y);..          /
22f50 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d  * The pSubWInfo-
22f60 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66  >untestedTerms f
22f70 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74  lag means that t
22f80 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20  his OR term.    
22f90 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
22fa0 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41  ed one or more A
22fb0 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e  ND term from a n
22fc0 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20  otReady table.  
22fd0 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  The.          **
22fe0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
22ff0 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63  notReady table c
23000 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74  ould not be test
23010 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20  ed and will.    
23020 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
23030 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72   be tested later
23040 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
23050 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
23060 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
23070 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64  Terms ) untested
23080 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20  Terms = 1;..    
23090 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
230a0 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63  of the OR-connec
230b0 74 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70  ted terms are op
230c0 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68  timized using th
230d0 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20  e same.         
230e0 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74   ** index, and t
230f0 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  he index is open
23100 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
23110 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
23120 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20            ** by 
23130 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c  each call to sql
23140 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
23150 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f   made by this lo
23160 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20  op, it may.     
23170 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69       ** be possi
23180 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74 20  ble to use that 
23190 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65 72  index as a cover
231a0 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  ing index..     
231b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
231c0 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
231d0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
231e0 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65  Begin() above re
231f0 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e  sulted in a scan
23200 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
23210 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  ** uses an index
23220 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 65 69  , and this is ei
23230 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20 4f  ther the first O
23240 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
23250 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
23260 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65 20 69  ocessed or the i
23270 6e 64 65 78 20 69 73 20 74 68 65 20 73 61 6d 65  ndex is the same
23280 20 61 73 20 74 68 61 74 20 75 73 65 64 20 62 79   as that used by
23290 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20   all previous.  
232a0 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
232b0 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68  , set pCov to th
232c0 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65  e candidate cove
232d0 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65  ring index. Othe
232e0 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20  rwise, set .    
232f0 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f        ** pCov to
23300 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74   NULL to indicat
23310 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64  e that no candid
23320 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ate covering ind
23330 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20  ex will .       
23340 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62     ** be availab
23350 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  le..          */
23360 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 4c  .          pSubL
23370 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d  oop = pSubWInfo-
23380 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20  >a[0].pWLoop;.  
23390 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
233a0 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61  (pSubLoop->wsFla
233b0 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
233c0 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20  INDEX)==0 );.   
233d0 20 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62         if( (pSub
233e0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
233f0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
23400 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
23410 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f  (ii==0 || pSubLo
23420 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
23430 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20  ex==pCov).      
23440 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
23450 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57     assert( pSubW
23460 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43  Info->a[0].iIdxC
23470 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20  ur==iCovCur );. 
23480 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
23490 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74  = pSubLoop->u.bt
234a0 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
234b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
234c0 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
234d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  0;.          }..
234e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
234f0 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72  ish the loop thr
23500 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
23510 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
23520 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
23530 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23540 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e  WhereEnd(pSubWIn
23550 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fo);.        }. 
23560 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
23570 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69   pLevel->u.pCovi
23580 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69  dx = pCov;.    i
23590 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c  f( pCov ) pLevel
235a0 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76  ->iIdxCur = iCov
235b0 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e  Cur;.    if( pAn
235c0 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  dExpr ){.      p
235d0 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  AndExpr->pLeft =
235e0 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
235f0 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
23600 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72  se->db, pAndExpr
23610 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
23620 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
23630 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71  (v, iRetInit, sq
23640 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
23650 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71  Addr(v));.    sq
23660 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23670 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
23680 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
23690 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
236a0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
236b0 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
236c0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
236d0 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53  vel>1 ) sqlite3S
236e0 74 61 63 6b 46 72 65 65 28 70 50 61 72 73 65 2d  tackFree(pParse-
236f0 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20  >db, pOrTab);.  
23700 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54    if( !untestedT
23710 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65  erms ) disableTe
23720 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
23730 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
23740 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
23750 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
23760 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20   */..  {.    /* 
23770 43 61 73 65 20 36 3a 20 20 54 68 65 72 65 20 69  Case 6:  There i
23780 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65  s no usable inde
23790 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61  x.  We must do a
237a0 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a   complete.    **
237b0 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f            scan o
237c0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  f the entire tab
237d0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  le..    */.    s
237e0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
237f0 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65  Step[] = { OP_Ne
23800 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20  xt, OP_Prev };. 
23810 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
23820 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20  u8 aStart[] = { 
23830 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61  OP_Rewind, OP_La
23840 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  st };.    assert
23850 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65  ( bRev==0 || bRe
23860 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70 4c 65 76  v==1 );.    pLev
23870 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62  el->op = aStep[b
23880 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Rev];.    pLevel
23890 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
238a0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
238b0 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
238c0 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52  Op2(v, aStart[bR
238d0 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ev], iCur, addrB
238e0 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  rk);.    pLevel-
238f0 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
23900 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
23910 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 65 77  _STEP;.  }.  new
23920 4e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65  NotReady = notRe
23930 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26  ady & ~getMask(&
23940 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
23950 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49  , iCur);..  /* I
23960 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
23970 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72  st every subexpr
23980 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  ession that can 
23990 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20  be completely.  
239a0 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e  ** computed usin
239b0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
239c0 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a  t of tables..  *
239d0 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  *.  ** IMPLEMENT
239e0 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32  ATION-OF: R-4952
239f0 35 2d 35 30 39 33 35 20 54 65 72 6d 73 20 74 68  5-50935 Terms th
23a00 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74  at cannot be sat
23a10 69 73 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20  isfied through. 
23a20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69   ** the use of i
23a30 6e 64 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65  ndices become te
23a40 73 74 73 20 74 68 61 74 20 61 72 65 20 65 76 61  sts that are eva
23a50 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74 20 65  luated against e
23a60 61 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20  ach row of.  ** 
23a70 74 68 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70  the relevant inp
23a80 75 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  ut tables..  */.
23a90 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
23aa0 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, j=pWC->nTerm
23ab0 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
23ac0 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
23ad0 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  pE;.    testcase
23ae0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
23af0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
23b00 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35  ); /* IMP: R-305
23b10 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
23b20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
23b30 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
23b40 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28  CODED );.    if(
23b50 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
23b60 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
23b70 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
23b80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
23b90 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
23ba0 6c 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29  l & newNotReady)
23bb0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  !=0 ){.      tes
23bc0 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75  tcase( pWInfo->u
23bd0 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a  ntestedTerms==0.
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
23bf0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
23c00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
23c10 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20  ETABLE_ONLY)!=0 
23c20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  );.      pWInfo-
23c30 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d  >untestedTerms =
23c40 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   1;.      contin
23c50 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  ue;.    }.    pE
23c60 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
23c70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21  .    assert( pE!
23c80 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =0 );.    if( pL
23c90 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
23ca0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
23cb0 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
23cc0 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  oin) ){.      co
23cd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
23ce0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
23cf0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c  alse(pParse, pE,
23d00 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
23d10 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
23d20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
23d30 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
23d40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  .  }..  /* Inser
23d50 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 66  t code to test f
23d60 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74  or implied const
23d70 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e 20  raints based on 
23d80 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20 2a  transitivity.  *
23d90 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f 70  * of the "==" op
23da0 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
23db0 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68  * Example: If th
23dc0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
23dd0 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74 32  ontains "t1.a=t2
23de0 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31 32  .b" and "t2.b=12
23df0 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61  3".  ** and we a
23e00 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74 31  re coding the t1
23e10 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74 32   loop and the t2
23e20 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79 65   loop has not ye
23e30 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68  t coded,.  ** th
23e40 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  en we cannot use
23e50 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62 22   the "t1.a=t2.b"
23e60 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75 74   constraint, but
23e70 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a   we can code.  *
23e80 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22 74  * the implied "t
23e90 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72 61  1.a=123" constra
23ea0 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
23eb0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
23ec0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  pWC->nTerm; j>0;
23ed0 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
23ee0 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
23ef0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c    WhereTerm *pAl
23f00 74 3b 0a 20 20 20 20 45 78 70 72 20 73 45 71 3b  t;.    Expr sEq;
23f10 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
23f20 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
23f30 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
23f40 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
23f50 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
23f60 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45 51  Operator!=(WO_EQ
23f70 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f 6e  UIV|WO_EQ) ) con
23f80 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
23f90 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
23fa0 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
23fb0 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72  e;.    pE = pTer
23fc0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
23fd0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
23fe0 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
23ff0 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20 20 61  omJoin) );.    a
24000 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 70  ssert( (pTerm->p
24010 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 65 77  rereqRight & new
24020 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a  NotReady)!=0 );.
24030 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54      pAlt = findT
24040 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70  erm(pWC, iCur, p
24050 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
24060 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  mn, notReady, WO
24070 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20  _EQ|WO_IN, 0);. 
24080 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29     if( pAlt==0 )
24090 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
240a0 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73  f( pAlt->wtFlags
240b0 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20   & (TERM_CODED) 
240c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
240d0 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e  testcase( pAlt->
240e0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
240f0 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Q );.    testcas
24100 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74  e( pAlt->eOperat
24110 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
24120 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
24130 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61  t((v, "begin tra
24140 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
24150 6e 74 22 29 29 3b 0a 20 20 20 20 73 45 71 20 3d  nt"));.    sEq =
24160 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20   *pAlt->pExpr;. 
24170 20 20 20 73 45 71 2e 70 4c 65 66 74 20 3d 20 70     sEq.pLeft = p
24180 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 73 71  E->pLeft;.    sq
24190 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
241a0 28 70 50 61 72 73 65 2c 20 26 73 45 71 2c 20 61  (pParse, &sEq, a
241b0 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
241c0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d  JUMPIFNULL);.  }
241d0 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
241e0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
241f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
24200 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
24210 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
24220 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
24230 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
24240 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
24250 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
24260 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
24270 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
24280 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
24290 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
242a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
242b0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
242c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
242d0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
242e0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
242f0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
24300 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
24310 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
24320 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
24330 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
24340 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
24350 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
24360 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
24370 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
24380 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
24390 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
243a0 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49  VIRTUAL );  /* I
243b0 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  MP: R-30575-1166
243c0 32 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  2 */.      testc
243d0 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
243e0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
243f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
24400 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
24410 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
24420 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
24430 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
24440 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
24450 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21   & newNotReady)!
24460 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
24470 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e  sert( pWInfo->un
24480 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20  testedTerms );. 
24490 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
244a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
244b0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
244c0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  xpr );.      sql
244d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
244e0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
244f0 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Expr, addrCont, 
24500 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
24510 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  L);.      pTerm-
24520 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
24530 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
24540 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
24550 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
24560 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
24570 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 4e 6f 74  .  return newNot
24580 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66  Ready;.}..#ifdef
24590 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
245a0 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
245b0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
245c0 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ct for debugging
245d0 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61   purposes.*/.sta
245e0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
245f0 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f  opPrint(WhereLoo
24600 70 20 2a 70 2c 20 53 72 63 4c 69 73 74 20 2a 70  p *p, SrcList *p
24610 54 61 62 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20  TabList){.  int 
24620 6e 62 20 3d 20 31 2b 28 70 54 61 62 4c 69 73 74  nb = 1+(pTabList
24630 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73  ->nSrc+7)/8;.  s
24640 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24650 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 54 61 62  em *pItem = pTab
24660 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61  List->a + p->iTa
24670 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  b;.  Table *pTab
24680 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
24690 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
246a0 69 6e 74 66 28 22 25 63 20 25 32 64 2e 25 30 2a  intf("%c %2d.%0*
246b0 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e  llx.%0*llx", p->
246c0 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cId,.           
246d0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61            p->iTa
246e0 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65  b, nb, p->maskSe
246f0 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65  lf, nb, p->prere
24700 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  q);.  sqlite3Deb
24710 75 67 50 72 69 6e 74 66 28 22 20 25 38 73 22 2c  ugPrintf(" %8s",
24720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24730 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c        pItem->zAl
24740 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c  ias ? pItem->zAl
24750 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d  ias : pTab->zNam
24760 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73  e);.  if( (p->ws
24770 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
24780 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
24790 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62  {.    if( p->u.b
247a0 74 72 65 65 2e 70 49 6e 64 65 78 20 29 7b 0a 20  tree.pIndex ){. 
247b0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
247c0 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  *zName = p->u.bt
247d0 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
247e0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61  e;.      if( zNa
247f0 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d 65 20 3d 20  me==0 ) zName = 
24800 22 69 70 6b 22 3b 0a 20 20 20 20 20 20 69 66 28  "ipk";.      if(
24810 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20   strncmp(zName, 
24820 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
24830 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20  x_", 17)==0 ){. 
24840 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73         int i = s
24850 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
24860 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20  Name) - 1;.     
24870 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b     while( zName[
24880 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20  i]!='_' ) i--;. 
24890 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20         zName += 
248a0 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  i;.      }.     
248b0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
248c0 6e 74 66 28 22 2e 25 2d 31 32 73 20 25 32 64 22  ntf(".%-12s %2d"
248d0 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74  , zName, p->u.bt
248e0 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65  ree.nEq);.    }e
248f0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
24900 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
24910 31 36 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a  16s","");.    }.
24920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
24930 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d  r *z;.    if( p-
24940 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29  >u.vtab.idxStr )
24950 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
24960 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64  te3_mprintf("(%d
24970 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20  ,\"%s\",%x)",.  
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
24990 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
249a0 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
249b0 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  , p->u.vtab.omit
249c0 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Mask);.    }else
249d0 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
249e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64  te3_mprintf("(%d
249f0 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62  ,%x)", p->u.vtab
24a00 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74  .idxNum, p->u.vt
24a10 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
24a20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
24a30 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31  ebugPrintf(" %-1
24a40 35 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  5s", z);.    sql
24a50 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
24a60 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
24a70 50 72 69 6e 74 66 28 22 20 66 67 20 25 30 35 78  Printf(" fg %05x
24a80 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61   N %d", p->wsFla
24a90 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a  gs, p->nLTerm);.
24aa0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24ab0 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25  intf(" cost %d,%
24ac0 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74  d,%d\n", p->rSet
24ad0 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  up, p->rRun, p->
24ae0 6e 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  nOut);.}.#endif.
24af0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62  ./*.** Convert b
24b00 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20  ulk memory into 
24b10 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f  a valid WhereLoo
24b20 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61  p that can be pa
24b30 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65  ssed.** to where
24b40 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65  LoopClear harmle
24b50 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssly..*/.static 
24b60 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e  void whereLoopIn
24b70 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  it(WhereLoop *p)
24b80 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  {.  p->aLTerm = 
24b90 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a  p->aLTermSpace;.
24ba0 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b    p->nLTerm = 0;
24bb0 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41  .  p->nLSlot = A
24bc0 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65  rraySize(p->aLTe
24bd0 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77  rmSpace);.  p->w
24be0 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f  sFlags = 0;.}../
24bf0 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57  *.** Clear the W
24c00 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e  hereLoop.u union
24c10 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f  .  Leave WhereLo
24c20 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74  op.pLTerm intact
24c30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24c40 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
24c50 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  nion(sqlite3 *db
24c60 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
24c70 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
24c80 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55  s & (WHERE_VIRTU
24c90 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 54 45  ALTABLE|WHERE_TE
24ca0 4d 50 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  MP_INDEX) ){.   
24cb0 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
24cc0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
24cd0 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e  TABLE)!=0 && p->
24ce0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
24cf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24d00 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e  _free(p->u.vtab.
24d10 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70  idxStr);.      p
24d20 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
24d30 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  e = 0;.      p->
24d40 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
24d50 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
24d60 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
24d70 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
24d80 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65  !=0 && p->u.btre
24d90 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  e.pIndex!=0 ){. 
24da0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
24db0 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
24dc0 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66  e.pIndex->zColAf
24dd0 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
24de0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
24df0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a  .btree.pIndex);.
24e00 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65        p->u.btree
24e10 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
24e20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
24e30 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72  Deallocate inter
24e40 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  nal memory used 
24e50 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  by a WhereLoop o
24e60 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
24e70 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c  void whereLoopCl
24e80 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ear(sqlite3 *db,
24e90 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
24ea0 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
24eb0 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
24ec0 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
24ed0 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
24ee0 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
24ef0 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20  Union(db, p);.  
24f00 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
24f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  ;.}../*.** Incre
24f20 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ase the memory a
24f30 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c  llocation for pL
24f40 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f  oop->aLTerm[] to
24f50 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a   be at least n..
24f60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
24f70 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71  ereLoopResize(sq
24f80 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
24f90 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b  Loop *p, int n){
24fa0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70  .  WhereTerm **p
24fb0 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  aNew;.  if( p->n
24fc0 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72  LSlot>=n ) retur
24fd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e  n SQLITE_OK;.  n
24fe0 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70   = (n+7)&~7;.  p
24ff0 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
25000 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
25010 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
25020 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e  ])*n);.  if( paN
25030 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
25040 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
25050 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e  emcpy(paNew, p->
25060 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70  aLTerm, sizeof(p
25070 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e  ->aLTerm[0])*p->
25080 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70  nLSlot);.  if( p
25090 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
250a0 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
250b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
250c0 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c  aLTerm);.  p->aL
250d0 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20  Term = paNew;.  
250e0 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20  p->nLSlot = n;. 
250f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25100 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  K;.}../*.** Tran
25110 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f  sfer content fro
25120 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f  m the second pLo
25130 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73  op into the firs
25140 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
25150 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73   whereLoopXfer(s
25160 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
25170 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72  eLoop *pTo, Wher
25180 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20  eLoop *pFrom){. 
25190 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
251a0 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46  size(db, pTo, pF
251b0 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 20 72  rom->nLTerm) ) r
251c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
251d0 45 4d 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  EM;.  whereLoopC
251e0 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54  learUnion(db, pT
251f0 6f 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f  o);.  memcpy(pTo
25200 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c  , pFrom, WHERE_L
25210 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20  OOP_XFER_SZ);.  
25220 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
25230 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
25240 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
25250 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
25260 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46  m[0]));.  if( pF
25270 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
25280 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
25290 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E ){.    pFrom->
252a0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
252b0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
252c0 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73   (pFrom->wsFlags
252d0 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
252e0 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  DEX)!=0 ){.    p
252f0 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49  From->u.btree.pI
25300 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
25310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
25330 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  e a WhereLoop ob
25340 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
25350 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c  oid whereLoopDel
25360 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
25370 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
25380 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
25390 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  (db, p);.  sqlit
253a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
253b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
253c0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
253d0 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
253e0 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
253f0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
25400 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
25410 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
25420 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77  pWInfo) ){.    w
25430 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
25440 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
25450 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
25460 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20  ->pLoops ){.    
25470 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d    WhereLoop *p =
25480 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b   pWInfo->pLoops;
25490 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
254a0 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
254b0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72  Loop;.      wher
254c0 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
254d0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
254e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
254f0 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
25500 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20  /*.** Insert or 
25510 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c  replace a WhereL
25520 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20  oop entry using 
25530 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70  the template sup
25540 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  plied..**.** An 
25550 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
25560 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62  op entry might b
25570 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
25580 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
25590 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61  e.** is better a
255a0 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70  nd has fewer dep
255b0 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74  endencies.  Or t
255c0 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c  he template will
255d0 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61   be ignored.** a
255e0 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c  nd no insert wil
255f0 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78  l occur if an ex
25600 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
25610 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68   is faster and h
25620 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65  as.** fewer depe
25630 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
25640 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68  e template.  Oth
25650 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65  erwise a new Whe
25660 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64  reLoop is.** add
25670 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
25680 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  template..**.** 
25690 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65  If pBuilder->pBe
256a0 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  st is not NULL t
256b0 68 65 6e 20 77 65 20 6f 6e 6c 79 20 63 61 72 65  hen we only care
256c0 20 61 62 6f 75 74 20 74 68 65 20 76 65 72 79 0a   about the very.
256d0 2a 2a 20 62 65 73 74 20 74 65 6d 70 6c 61 74 65  ** best template
256e0 20 61 6e 64 20 74 68 61 74 20 74 65 6d 70 6c 61   and that templa
256f0 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  te should be sto
25700 72 65 64 20 69 6e 20 70 42 75 69 6c 64 65 72 2d  red in pBuilder-
25710 3e 70 42 65 73 74 2e 0a 2a 2a 20 49 66 20 70 42  >pBest..** If pB
25720 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73  uilder->pBest is
25730 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 6c 69 73   NULL then a lis
25740 74 20 6f 66 20 74 68 65 20 62 65 73 74 20 74 65  t of the best te
25750 6d 70 6c 61 74 65 73 20 61 72 65 20 73 74 6f 72  mplates are stor
25760 65 64 0a 2a 2a 20 69 6e 20 70 42 75 69 6c 64 65  ed.** in pBuilde
25770 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  r->pWInfo->pLoop
25780 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63  s..**.** When ac
25790 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69  cumulating multi
257a0 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20  ple loops (when 
257b0 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20  pBuilder->pBest 
257c0 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73  is NULL) we.** s
257d0 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77  till might overw
257e0 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f  rite similar loo
257f0 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ps with the new 
25800 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a  template if the.
25810 2a 2a 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62  ** template is b
25820 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61  etter.  Loops ma
25830 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  y be overwritten
25840 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
25850 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  g .** conditions
25860 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
25870 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76     (1)  They hav
25880 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e  e the same iTab.
25890 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79  .**    (2)  They
258a0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
258b0 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28  SortIdx..**    (
258c0 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  3)  The template
258d0 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77   has same or few
258e0 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
258f0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
25900 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20   loop.**    (4) 
25910 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
25920 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
25930 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68  wer cost than th
25940 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
25950 2a 20 20 20 20 28 35 29 20 20 54 68 65 20 74 65  *    (5)  The te
25960 6d 70 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65  mplate uses more
25970 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61   terms of the sa
25980 6d 65 20 69 6e 64 65 78 20 62 75 74 20 68 61 73  me index but has
25990 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a   no additional.*
259a0 2a 20 20 20 20 20 20 20 20 20 64 65 70 65 6e 64  *         depend
259b0 65 6e 63 69 65 73 20 20 20 20 20 20 20 20 20 20  encies          
259c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
259d0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
259e0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
259f0 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
25a00 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
25a10 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
25a20 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65  ppPrev, *p, *pNe
25a30 78 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 49  xt = 0;.  WhereI
25a40 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
25a50 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
25a60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
25a70 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
25a80 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75  db;..  /* If pBu
25a90 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73 20  ilder->pBest is 
25aa0 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
25ab0 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
25ac0 20 74 68 65 20 73 69 6e 67 6c 65 0a 20 20 2a 2a   the single.  **
25ad0 20 62 65 73 74 20 57 68 65 72 65 4c 6f 6f 70 2e   best WhereLoop.
25ae0 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73    pBuilder->pBes
25af0 74 2d 3e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 69  t->maskSelf==0 i
25b00 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 6e 6f  ndicates that no
25b10 0a 20 20 2a 2a 20 70 72 69 6f 72 20 57 68 65 72  .  ** prior Wher
25b20 65 4c 6f 6f 70 73 20 68 61 76 65 20 62 65 65 6e  eLoops have been
25b30 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74   evaluated and t
25b40 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
25b50 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2a 20 69  pTemplate.  ** i
25b60 73 20 74 68 65 72 65 66 6f 72 65 20 74 68 65 20  s therefore the 
25b70 66 69 72 73 74 20 61 6e 64 20 68 65 6e 63 65 20  first and hence 
25b80 74 68 65 20 62 65 73 74 20 61 6e 64 20 73 68 6f  the best and sho
25b90 75 6c 64 20 62 65 20 72 65 74 61 69 6e 65 64 2e  uld be retained.
25ba0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 20 3d  .  */.  if( (p =
25bb0 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74   pBuilder->pBest
25bc0 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
25bd0 70 2d 3e 6d 61 73 6b 53 65 6c 66 21 3d 30 20 29  p->maskSelf!=0 )
25be0 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6f 73  {.      WhereCos
25bf0 74 20 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43  t rCost = whereC
25c00 6f 73 74 41 64 64 28 70 2d 3e 72 52 75 6e 2c 70  ostAdd(p->rRun,p
25c10 2d 3e 72 53 65 74 75 70 29 3b 0a 20 20 20 20 20  ->rSetup);.     
25c20 20 57 68 65 72 65 43 6f 73 74 20 72 54 65 6d 70   WhereCost rTemp
25c30 6c 61 74 65 20 3d 20 77 68 65 72 65 43 6f 73 74  late = whereCost
25c40 41 64 64 28 70 54 65 6d 70 6c 61 74 65 2d 3e 72  Add(pTemplate->r
25c50 52 75 6e 2c 70 54 65 6d 70 6c 61 74 65 2d 3e 72  Run,pTemplate->r
25c60 53 65 74 75 70 29 3b 0a 20 20 20 20 20 20 69 66  Setup);.      if
25c70 28 20 72 43 6f 73 74 20 3c 20 72 54 65 6d 70 6c  ( rCost < rTempl
25c80 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 74  ate ){.        t
25c90 65 73 74 63 61 73 65 28 20 72 43 6f 73 74 3d 3d  estcase( rCost==
25ca0 72 54 65 6d 70 6c 61 74 65 2d 31 20 29 3b 0a 20  rTemplate-1 );. 
25cb0 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72         goto wher
25cc0 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70  eLoopInsert_noop
25cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25ce0 69 66 28 20 72 43 6f 73 74 3d 3d 72 54 65 6d 70  if( rCost==rTemp
25cf0 6c 61 74 65 20 26 26 20 28 70 2d 3e 70 72 65 72  late && (p->prer
25d00 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
25d10 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72  prereq)==p->prer
25d20 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  eq ){.        go
25d30 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  to whereLoopInse
25d40 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d  rt_noop;.      }
25d50 0a 20 20 20 20 7d 0a 23 69 66 20 57 48 45 52 45  .    }.#if WHERE
25d60 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
25d70 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
25d80 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
25d90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
25da0 62 75 67 50 72 69 6e 74 66 28 70 2d 3e 6d 61 73  bugPrintf(p->mas
25db0 6b 53 65 6c 66 3d 3d 30 20 3f 20 22 69 6e 73 2d  kSelf==0 ? "ins-
25dc0 69 6e 69 74 3a 20 22 20 3a 20 22 69 6e 73 2d 62  init: " : "ins-b
25dd0 65 73 74 3a 20 22 29 3b 0a 20 20 20 20 20 20 77  est: ");.      w
25de0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
25df0 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d  emplate, pWInfo-
25e00 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20  >pTabList);.    
25e10 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65  }.#endif.    whe
25e20 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70  reLoopXfer(db, p
25e30 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
25e40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25e50 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  OK;.  }..  /* Se
25e60 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
25e70 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74  ting WhereLoop t
25e80 6f 20 6f 76 65 72 77 72 69 74 65 2c 20 6f 72 20  o overwrite, or 
25e90 77 68 69 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a  which takes.  **
25ea0 20 70 72 69 6f 72 69 74 79 20 6f 76 65 72 20 70   priority over p
25eb0 54 65 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20  Template..  */. 
25ec0 20 66 6f 72 28 70 70 50 72 65 76 3d 26 70 57 49   for(ppPrev=&pWI
25ed0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a  nfo->pLoops, p=*
25ee0 70 70 50 72 65 76 3b 20 70 3b 20 70 70 50 72 65  ppPrev; p; ppPre
25ef0 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c  v=&p->pNextLoop,
25f00 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20   p=*ppPrev){.   
25f10 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
25f20 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c  emplate->iTab ||
25f30 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54   p->iSortIdx!=pT
25f40 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64  emplate->iSortId
25f50 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  x ) continue;.  
25f60 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
25f70 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
25f80 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
25f90 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74  .     && p->rSet
25fa0 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up<=pTemplate->r
25fb0 53 65 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d  Setup.     && p-
25fc0 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65  >rRun<=pTemplate
25fd0 2d 3e 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20  ->rRun.    ){.  
25fe0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
25ff0 63 68 20 74 61 6b 65 6e 20 77 68 65 6e 20 70 20  ch taken when p 
26000 69 73 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74  is equal or bett
26010 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  er than pTemplat
26020 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61  e in .      ** a
26030 6c 6c 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64  ll of (1) depend
26040 65 6e 63 65 73 20 28 32 29 20 73 65 74 75 70 2d  ences (2) setup-
26050 63 6f 73 74 2c 20 61 6e 64 20 28 33 29 20 72 75  cost, and (3) ru
26060 6e 2d 63 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20  n-cost. */.     
26070 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 72 52   testcase( p->rR
26080 75 6e 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un==pTemplate->r
26090 52 75 6e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Run );.      if(
260a0 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65 6d 70   p->nLTerm<pTemp
260b0 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20 20 20  late->nLTerm.   
260c0 20 20 20 20 26 26 20 28 70 2d 3e 77 73 46 6c 61      && (p->wsFla
260d0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
260e0 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26  ED)!=0.       &&
260f0 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46   (pTemplate->wsF
26100 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
26110 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
26120 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  && p->u.btree.pI
26130 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  ndex==pTemplate-
26140 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 0a  >u.btree.pIndex.
26150 20 20 20 20 20 20 20 26 26 20 70 2d 3e 70 72 65         && p->pre
26160 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  req==pTemplate->
26170 70 72 65 72 65 71 0a 20 20 20 20 20 20 29 7b 0a  prereq.      ){.
26180 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77          /* Overw
26190 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67  rite an existing
261a0 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
261b0 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65 20 74  an similar one t
261c0 68 61 74 20 75 73 65 73 0a 20 20 20 20 20 20 20  hat uses.       
261d0 20 2a 2a 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f   ** more terms o
261e0 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  f the index */. 
261f0 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
26200 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
26210 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26220 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e    }else if( p->n
26230 4f 75 74 3e 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  Out>pTemplate->n
26240 4f 75 74 0a 20 20 20 20 20 20 20 26 26 20 70 2d  Out.       && p-
26250 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61  >rSetup==pTempla
26260 74 65 2d 3e 72 53 65 74 75 70 0a 20 20 20 20 20  te->rSetup.     
26270 20 20 26 26 20 70 2d 3e 72 52 75 6e 3d 3d 70 54    && p->rRun==pT
26280 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20  emplate->rRun.  
26290 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
262a0 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65  * Overwrite an e
262b0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
262c0 70 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  p with the same 
262d0 63 6f 73 74 20 62 75 74 20 6d 6f 72 65 0a 20 20  cost but more.  
262e0 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 73        ** outputs
262f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 78   */.        pNex
26300 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  t = p->pNextLoop
26310 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
26320 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26330 20 20 20 20 20 20 2f 2a 20 70 54 65 6d 70 6c 61        /* pTempla
26340 74 65 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75  te is not helpfu
26350 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65  l..        ** Re
26360 74 75 72 6e 20 77 69 74 68 6f 75 74 20 63 68 61  turn without cha
26370 6e 67 69 6e 67 20 6f 72 20 61 64 64 69 6e 67 20  nging or adding 
26380 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20  anything */.    
26390 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f      goto whereLo
263a0 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20  opInsert_noop;. 
263b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
263c0 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 70   testcase( (p->p
263d0 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
263e0 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70  e->prereq)==p->p
263f0 72 65 72 65 71 0a 20 20 20 20 20 20 20 20 20 20  rereq.          
26400 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
26410 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
26420 74 75 70 0a 20 20 20 20 20 20 20 20 20 20 20 20  tup.            
26430 20 20 26 26 20 70 2d 3e 72 52 75 6e 3d 3d 70 54    && p->rRun==pT
26440 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2b 31 20  emplate->rRun+1 
26450 29 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  );.    if( (p->p
26460 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
26470 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
26480 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
26490 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3e     && p->rSetup>
264a0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
264b0 75 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  up.     && p->rR
264c0 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un>=pTemplate->r
264d0 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Run.    ){.     
264e0 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e   /* Overwrite an
264f0 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
26500 6f 6f 70 20 77 69 74 68 20 61 20 62 65 74 74 65  oop with a bette
26510 72 20 6f 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20  r one: one that 
26520 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74  is.      ** bett
26530 65 72 20 61 74 20 6f 6e 65 20 6f 66 20 28 31 29  er at one of (1)
26540 20 64 65 70 65 6e 64 65 6e 63 65 73 2c 20 28 32   dependences, (2
26550 29 20 73 65 74 75 70 2d 63 6f 73 74 2c 20 6f 72  ) setup-cost, or
26560 20 28 33 29 20 72 75 6e 2d 63 6f 73 74 0a 20 20   (3) run-cost.  
26570 20 20 20 20 2a 2a 20 61 6e 64 20 69 73 20 6e 6f      ** and is no
26580 20 77 6f 72 73 65 20 69 6e 20 61 6e 79 20 6f 66   worse in any of
26590 20 74 68 6f 73 65 20 63 61 74 65 67 6f 72 69 65   those categorie
265a0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  s. */.      test
265b0 63 61 73 65 28 20 70 2d 3e 72 53 65 74 75 70 3d  case( p->rSetup=
265c0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
265d0 75 70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  up );.      test
265e0 63 61 73 65 28 20 70 2d 3e 72 52 75 6e 3d 3d 70  case( p->rRun==p
265f0 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 29  Template->rRun )
26600 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  ;.      pNext = 
26610 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
26620 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26630 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
26640 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
26650 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
26660 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
26670 71 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q.              
26680 26 26 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54  && p->rSetup>=pT
26690 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a  emplate->rSetup.
266a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
266b0 20 70 2d 3e 72 52 75 6e 3d 3d 70 54 65 6d 70 6c   p->rRun==pTempl
266c0 61 74 65 2d 3e 72 52 75 6e 2d 31 20 29 3b 0a 20  ate->rRun-1 );. 
266d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
266e0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20  each this point 
266f0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69  it means that ei
26700 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20  ther p[] should 
26710 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20  be overwritten. 
26720 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61   ** with pTempla
26730 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73  te[] if p[] exis
26740 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c  ts, or if p==NUL
26750 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  L then allocate 
26760 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65  a new.  ** Where
26770 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20  Loop and insert 
26780 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45  it..  */.#if WHE
26790 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
267a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
267b0 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
267c0 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b  .    if( p!=0 ){
267d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
267e0 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64  bugPrintf("ins-d
267f0 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20 77  el:  ");.      w
26800 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c  hereLoopPrint(p,
26810 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
26820 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
26830 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
26840 28 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29 3b 0a  ("ins-new:  ");.
26850 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
26860 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57  nt(pTemplate, pW
26870 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b  Info->pTabList);
26880 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
26890 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20  ( p==0 ){.    p 
268a0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
268b0 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
268c0 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20  WhereLoop));.   
268d0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
268e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
268f0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  .    whereLoopIn
26900 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 77 68 65  it(p);.  }.  whe
26910 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70  reLoopXfer(db, p
26920 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
26930 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 70  p->pNextLoop = p
26940 4e 65 78 74 3b 0a 20 20 2a 70 70 50 72 65 76 20  Next;.  *ppPrev 
26950 3d 20 70 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77  = p;.  if( (p->w
26960 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
26970 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
26980 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
26990 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65  ndex = p->u.btre
269a0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  e.pIndex;.    if
269b0 28 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64  ( pIndex && pInd
269c0 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20  ex->tnum==0 ){. 
269d0 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e       p->u.btree.
269e0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
269f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
26a00 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
26a10 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
26a20 20 69 6e 73 65 72 74 20 69 73 20 61 20 6e 6f 2d   insert is a no-
26a30 6f 70 20 2a 2f 0a 77 68 65 72 65 4c 6f 6f 70 49  op */.whereLoopI
26a40 6e 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23 69 66 20  nsert_noop:.#if 
26a50 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
26a60 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
26a70 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
26a80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
26a90 65 62 75 67 50 72 69 6e 74 66 28 70 42 75 69 6c  ebugPrintf(pBuil
26aa0 64 65 72 2d 3e 70 42 65 73 74 20 3f 20 22 69 6e  der->pBest ? "in
26ab0 73 2d 73 6b 69 70 3a 20 22 20 3a 20 22 69 6e 73  s-skip: " : "ins
26ac0 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20 77  -noop: ");.    w
26ad0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
26ae0 65 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d  emplate, pWInfo-
26af0 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 7d 0a  >pTabList);.  }.
26b00 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
26b10 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d 0a 0a  SQLITE_OK;  .}..
26b20 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f  /*.** We have so
26b30 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75   far matched pBu
26b40 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
26b50 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f  tree.nEq terms o
26b60 66 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e 64  f the index pInd
26b70 65 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 61  ex..** Try to ma
26b80 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a  tch one more..**
26b90 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
26ba0 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
26bb0 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
26bc0 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
26bd0 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
26be0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
26bf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
26c00 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
26c10 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
26c20 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
26c30 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
26c40 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
26c50 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
26c60 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
26c70 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
26c80 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
26c90 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
26ca0 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26cc0 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
26cd0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
26ce0 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20  nInMul          
26cf0 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
26d00 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
26d10 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
26d20 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
26d30 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
26d40 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
26d50 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
26d60 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
26d70 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
26d80 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
26d90 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
26da0 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
26db0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
26dc0 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
26dd0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
26de0 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
26df0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
26e00 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
26e10 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
26e20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
26e30 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
26e40 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
26e50 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
26e60 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
26e70 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
26e80 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
26e90 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
26ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
26eb0 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
26ec0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
26ed0 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
26ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26ef0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
26f00 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
26f10 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
26f20 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
26f30 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
26f40 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
26f50 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
26f60 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
26f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
26f80 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
26f90 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
26fa0 20 69 6e 74 20 73 61 76 65 64 5f 6e 45 71 3b 20   int saved_nEq; 
26fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fc0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
26fd0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
26fe0 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 33 32  ree.nEq */.  u32
26ff0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20   saved_wsFlags; 
27000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27010 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
27020 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  f pNew->wsFlags 
27030 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 73  */.  WhereCost s
27040 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20  aved_nOut;      
27050 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
27060 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
27070 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nOut */.  int iC
27080 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
27090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
270a0 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
270b0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
270c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
270d0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
270e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
270f0 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  e */.  WhereCost
27100 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20   nRowEst;       
27110 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61         /* Estima
27120 74 65 64 20 69 6e 64 65 78 20 73 65 6c 65 63 74  ted index select
27130 69 76 69 74 79 20 2a 2f 0a 20 20 57 68 65 72 65  ivity */.  Where
27140 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  Cost rLogSize;  
27150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
27160 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65  garithm of table
27170 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65   size */.  Where
27180 54 65 72 6d 20 2a 70 54 6f 70 2c 20 2a 70 42 74  Term *pTop, *pBt
27190 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  m;         /* To
271a0 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e  p and bottom ran
271b0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ge constraints *
271c0 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  /..  pNew = pBui
271d0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66  lder->pNew;.  if
271e0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
271f0 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
27200 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73  TE_NOMEM;..  ass
27210 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
27220 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
27230 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
27240 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
27250 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27260 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29  _TOP_LIMIT)==0 )
27270 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73  ;.  if( pNew->ws
27280 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
27290 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f  M_LIMIT ){.    o
272a0 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f  pMask = WO_LT|WO
272b0 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _LE;.  }else if(
272c0 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30   pProbe->tnum<=0
272d0 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74   || (pSrc->joint
272e0 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
272f0 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  0 ){.    opMask 
27300 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
27310 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
27320 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WO_LE;.  }else{.
27330 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
27340 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
27350 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  LL|WO_GT|WO_GE|W
27360 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a  O_LT|WO_LE;.  }.
27370 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55    if( pProbe->bU
27380 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73  nordered ) opMas
27390 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f  k &= ~(WO_GT|WO_
273a0 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b  GE|WO_LT|WO_LE);
273b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
273c0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70  ->u.btree.nEq<=p
273d0 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Probe->nColumn )
273e0 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e  ;.  if( pNew->u.
273f0 62 74 72 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f  btree.nEq < pPro
27400 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  be->nColumn ){. 
27410 20 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65     iCol = pProbe
27420 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d  ->aiColumn[pNew-
27430 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20  >u.btree.nEq];. 
27440 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 77 68 65     nRowEst = whe
27450 72 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61  reCost(pProbe->a
27460 69 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e  iRowEst[pNew->u.
27470 62 74 72 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a 20  btree.nEq+1]);. 
27480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c   }else{.    iCol
27490 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 52 6f 77 45   = -1;.    nRowE
274a0 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54  st = 0;.  }.  pT
274b0 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49  erm = whereScanI
274c0 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c  nit(&scan, pBuil
274d0 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e  der->pWC, pSrc->
274e0 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20  iCursor, iCol,. 
274f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27500 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70         opMask, p
27510 50 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f  Probe);.  saved_
27520 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74  nEq = pNew->u.bt
27530 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64  ree.nEq;.  saved
27540 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e  _nLTerm = pNew->
27550 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f  nLTerm;.  saved_
27560 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  wsFlags = pNew->
27570 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64  wsFlags;.  saved
27580 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e  _prereq = pNew->
27590 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f  prereq;.  saved_
275a0 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  nOut = pNew->nOu
275b0 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  t;.  pNew->rSetu
275c0 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a  p = 0;.  rLogSiz
275d0 65 20 3d 20 65 73 74 4c 6f 67 28 77 68 65 72 65  e = estLog(where
275e0 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52  Cost(pProbe->aiR
275f0 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 20 20 66 6f  owEst[0]));.  fo
27600 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
27610 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70  K && pTerm!=0; p
27620 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
27630 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20  Next(&scan)){.  
27640 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 20    int nIn = 0;. 
27650 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
27660 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77  ereqRight & pNew
27670 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e  ->maskSelf ) con
27680 74 69 6e 75 65 3b 0a 20 20 20 20 70 4e 65 77 2d  tinue;.    pNew-
27690 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
276a0 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e  _wsFlags;.    pN
276b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
276c0 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20  = saved_nEq;.   
276d0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
276e0 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20  saved_nLTerm;.  
276f0 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
27700 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
27710 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20  pNew->nLTerm+1) 
27720 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20  ) break; /* OOM 
27730 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  */.    pNew->aLT
27740 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
27750 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ++] = pTerm;.   
27760 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
27770 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20  (saved_prereq | 
27780 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
27790 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73  ht) & ~pNew->mas
277a0 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65 77 2d  kSelf;.    pNew-
277b0 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65  >rRun = rLogSize
277c0 3b 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 63 6f  ; /* Baseline co
277d0 73 74 20 69 73 20 6c 6f 67 32 28 4e 29 2e 20 20  st is log2(N).  
277e0 41 64 6a 75 73 74 6d 65 6e 74 73 20 62 65 6c 6f  Adjustments belo
277f0 77 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65  w */.    if( pTe
27800 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
27810 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  WO_IN ){.      E
27820 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
27830 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
27840 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
27850 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  = WHERE_COLUMN_I
27860 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  N;.      if( Exp
27870 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
27880 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
27890 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
278a0 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  "x IN (SELECT ..
278b0 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68  .)":  TUNING: th
278c0 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73  e SELECT returns
278d0 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20   25 rows */.    
278e0 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61      nIn = 46;  a
278f0 73 73 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65  ssert( 46==where
27900 43 6f 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20  Cost(25) );.    
27910 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
27920 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
27930 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t && pExpr->x.pL
27940 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
27950 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
27960 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
27970 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ..)" */.        
27980 6e 49 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 28  nIn = whereCost(
27990 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
279a0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  nExpr);.      }.
279b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
279c0 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 70   += nIn;.      p
279d0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
279e0 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ++;.      pNew->
279f0 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b  nOut = nRowEst +
27a00 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20   nInMul + nIn;. 
27a10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
27a20 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
27a30 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20 20  (WO_EQ) ){.     
27a40 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
27a50 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
27a60 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45  _COLUMN_NULL|WHE
27a70 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d  RE_COLUMN_IN))!=
27a80 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
27a90 20 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30      || nInMul==0
27aa0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
27ab0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
27ac0 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
27ad0 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 20 0a 20    if( iCol<0  . 
27ae0 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 62 65        || (pProbe
27af0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
27b00 6e 65 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 0a  ne && nInMul==0.
27b10 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4e             && pN
27b20 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  ew->u.btree.nEq=
27b30 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  =pProbe->nColumn
27b40 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  -1).      ){.   
27b50 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4e       assert( (pN
27b60 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
27b70 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d  ERE_COLUMN_IN)==
27b80 30 20 7c 7c 20 69 43 6f 6c 3c 30 20 29 3b 0a 20  0 || iCol<0 );. 
27b90 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
27ba0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
27bb0 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  EROW;.      }.  
27bc0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
27bd0 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70  e.nEq++;.      p
27be0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77  New->nOut = nRow
27bf0 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b 0a 20 20  Est + nInMul;.  
27c00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
27c10 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
27c20 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20  WO_ISNULL) ){.  
27c30 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
27c40 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
27c50 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 4e  N_NULL;.      pN
27c60 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
27c70 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  +;.      /* TUNI
27c80 4e 47 3a 20 49 53 20 4e 55 4c 4c 20 73 65 6c 65  NG: IS NULL sele
27c90 63 74 73 20 32 20 72 6f 77 73 20 2a 2f 0a 20 20  cts 2 rows */.  
27ca0 20 20 20 20 6e 49 6e 20 3d 20 31 30 3b 20 20 61      nIn = 10;  a
27cb0 73 73 65 72 74 28 20 31 30 3d 3d 77 68 65 72 65  ssert( 10==where
27cc0 43 6f 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20  Cost(2) );.     
27cd0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52   pNew->nOut = nR
27ce0 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b  owEst + nInMul +
27cf0 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20   nIn;.    }else 
27d00 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
27d10 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f  ator & (WO_GT|WO
27d20 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65  _GE) ){.      te
27d30 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
27d40 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54  Operator & WO_GT
27d50 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
27d60 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
27d70 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a  ator & WO_GE );.
27d80 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
27d90 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
27da0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
27db0 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
27dc0 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20   pBtm = pTerm;. 
27dd0 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20       pTop = 0;. 
27de0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27df0 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
27e00 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
27e10 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20  T|WO_LE) );.    
27e20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
27e30 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
27e40 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  O_LT );.      te
27e50 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
27e60 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
27e70 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
27e80 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
27e90 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
27ea0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
27eb0 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72       pTop = pTer
27ec0 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  m;.      pBtm = 
27ed0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
27ee0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
27ef0 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
27f00 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
27f10 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
27f20 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20  LTerm-2] : 0;.  
27f30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4e 65 77    }.    if( pNew
27f40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
27f50 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
27f60 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
27f70 74 20 6e 4f 75 74 20 61 6e 64 20 72 52 75 6e 20  t nOut and rRun 
27f80 66 6f 72 20 53 54 41 54 33 20 72 61 6e 67 65 20  for STAT3 range 
27f90 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20  values */.      
27fa0 57 68 65 72 65 43 6f 73 74 20 72 44 69 76 3b 0a  WhereCost rDiv;.
27fb0 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65        whereRange
27fc0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
27fd0 70 50 72 6f 62 65 2c 20 70 4e 65 77 2d 3e 75 2e  pProbe, pNew->u.
27fe0 62 74 72 65 65 2e 6e 45 71 2c 0a 20 20 20 20 20  btree.nEq,.     
27ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28000 20 20 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26     pBtm, pTop, &
28010 72 44 69 76 29 3b 0a 20 20 20 20 20 20 70 4e 65  rDiv);.      pNe
28020 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
28030 6e 4f 75 74 3e 72 44 69 76 2b 31 30 20 3f 20 73  nOut>rDiv+10 ? s
28040 61 76 65 64 5f 6e 4f 75 74 20 2d 20 72 44 69 76  aved_nOut - rDiv
28050 20 3a 20 31 30 3b 0a 20 20 20 20 7d 0a 23 69 66   : 10;.    }.#if
28060 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
28070 45 5f 53 54 41 54 33 0a 20 20 20 20 69 66 28 20  E_STAT3.    if( 
28080 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28090 71 3d 3d 31 20 26 26 20 70 50 72 6f 62 65 2d 3e  q==1 && pProbe->
280a0 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20  nSample ){.     
280b0 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20   tRowcnt nOut = 
280c0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  0;.      if( (pT
280d0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
280e0 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
280f0 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  L))!=0 ){.      
28100 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
28110 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
28120 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
28130 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
28140 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
28150 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
28160 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
28170 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
28180 20 70 50 72 6f 62 65 2c 20 70 54 65 72 6d 2d 3e   pProbe, pTerm->
28190 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
281a0 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  nOut);.      }el
281b0 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
281c0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
281d0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
281e0 26 20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  &  !ExprHasPrope
281f0 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
28200 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
28210 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
28220 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
28230 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20  pParse, pProbe, 
28240 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e  pTerm->pExpr->x.
28250 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  pList, &nOut);. 
28260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
28270 77 2d 3e 6e 4f 75 74 20 3d 20 77 68 65 72 65 43  w->nOut = whereC
28280 6f 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20 7d  ost(nOut);.    }
28290 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
282a0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
282b0 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
282c0 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20  |WHERE_IPK))==0 
282d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68  ){.      /* Each
282e0 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20   row involves a 
282f0 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65  step of the inde
28300 78 2c 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79  x, then a binary
28310 20 73 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20   search of.     
28320 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62   ** the main tab
28330 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  le */.      pNew
28340 2d 3e 72 52 75 6e 20 3d 20 20 77 68 65 72 65 43  ->rRun =  whereC
28350 6f 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  ostAdd(pNew->rRu
28360 6e 2c 20 72 4c 6f 67 53 69 7a 65 3e 32 37 20 3f  n, rLogSize>27 ?
28370 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20 31   rLogSize-17 : 1
28380 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
28390 20 53 74 65 70 20 63 6f 73 74 20 66 6f 72 20 65   Step cost for e
283a0 61 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20 2a  ach output row *
283b0 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  /.    pNew->rRun
283c0 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
283d0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77  pNew->rRun, pNew
283e0 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20  ->nOut);.    /* 
283f0 54 42 44 3a 20 41 64 6a 75 73 74 20 6e 4f 75 74  TBD: Adjust nOut
28400 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
28410 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
28420 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
28430 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
28440 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28  , pNew);.    if(
28450 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
28460 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
28470 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e  T)==0.     && pN
28480 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
28490 28 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  (pProbe->nColumn
284a0 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d   + (pProbe->zNam
284b0 65 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20 20  e!=0)).    ){.  
284c0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
284d0 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
284e0 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
284f0 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a  e, nInMul+nIn);.
28500 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
28510 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64  ->prereq = saved
28520 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d  _prereq;.  pNew-
28530 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
28540 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77  aved_nEq;.  pNew
28550 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
28560 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65  d_wsFlags;.  pNe
28570 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
28580 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  nOut;.  pNew->nL
28590 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
285a0 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  erm;.  return rc
285b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
285c0 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20  n True if it is 
285d0 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49  possible that pI
285e0 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73  ndex might be us
285f0 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65  eful in.** imple
28600 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45  menting the ORDE
28610 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70  R BY clause in p
28620 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52  Builder..**.** R
28630 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70  eturn False if p
28640 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74  Builder does not
28650 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45   contain an ORDE
28660 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a  R BY clause or.*
28670 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * if there is no
28680 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20   way for pIndex 
28690 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20  to be useful in 
286a0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61  implementing tha
286b0 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  t.** ORDER BY cl
286c0 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
286d0 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65  int indexMightHe
286e0 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20  lpWithOrderBy(. 
286f0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
28700 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49  r *pBuilder,.  I
28710 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20  ndex *pIndex,.  
28720 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20  int iCursor.){. 
28730 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a   ExprList *pOB;.
28740 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20    int ii, jj;.. 
28750 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e   if( pIndex->bUn
28760 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e  ordered ) return
28770 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d   0;.  if( (pOB =
28780 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
28790 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20  o->pOrderBy)==0 
287a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
287b0 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
287c0 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
287d0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
287e0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
287f0 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69  ollate(pOB->a[ii
28800 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
28810 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
28820 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
28830 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  0;.    if( pExpr
28840 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f  ->iTable==iCurso
28850 72 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  r ){.      for(j
28860 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e  j=0; jj<pIndex->
28870 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b 2b 29 7b 0a  nColumn; jj++){.
28880 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
28890 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  r->iColumn==pInd
288a0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d  ex->aiColumn[jj]
288b0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
288c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
288d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
288e0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74  .** Return a bit
288f0 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e  mask where 1s in
28900 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
28910 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
28920 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74  lumn of.** the t
28930 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20  able is used by 
28940 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  an index.  Only 
28950 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
28960 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65  umns are conside
28970 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  red..*/.static B
28980 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e  itmask columnsIn
28990 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
289a0 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20  x){.  Bitmask m 
289b0 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
289c0 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(j=pIdx->nCol
289d0 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  umn-1; j>=0; j--
289e0 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
289f0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
28a00 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
28a10 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  x==BMS-1 );.    
28a20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
28a30 2d 32 20 29 3b 0a 20 20 20 20 69 66 28 20 78 3c  -2 );.    if( x<
28a40 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53  BMS-1 ) m |= MAS
28a50 4b 42 49 54 28 78 29 3b 0a 20 20 7d 0a 20 20 72  KBIT(x);.  }.  r
28a60 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn m;.}.../*.
28a70 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
28a80 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 20 73  Loop objects a s
28a90 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74  ingle table of t
28aa0 68 65 20 6a 6f 69 6e 20 77 65 72 65 20 74 68 65  he join were the
28ab0 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65   table.** is ide
28ac0 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65  nfied by pBuilde
28ad0 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
28ae0 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
28af0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a  aranteed to be.*
28b00 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65  * a b-tree table
28b10 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  , not a virtual 
28b20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
28b30 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
28b40 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c  dBtree(.  WhereL
28b50 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
28b60 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63  lder, /* WHERE c
28b70 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
28b80 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  n */.  Bitmask m
28b90 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
28ba0 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72     /* Extra prer
28bb0 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73  equesites for us
28bc0 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a  ing this table *
28bd0 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
28be0 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
28bf0 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c     /* WHERE anal
28c00 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ysis context */.
28c10 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b    Index *pProbe;
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28c30 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65   An index we are
28c40 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20   evaluating */. 
28c50 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20   Index sPk;     
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28c70 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a  A fake index obj
28c80 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d  ect for the prim
28c90 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f  ary key */.  tRo
28ca0 77 63 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b  wcnt aiRowEstPk[
28cb0 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  2];      /* The 
28cc0 61 69 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65  aiRowEst[] value
28cd0 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
28ce0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f  ex */.  int aiCo
28cf0 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20  lumnPk = -1;    
28d00 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75      /* The aColu
28d10 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  mn[] value for t
28d20 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
28d30 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
28d40 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ist;          /*
28d50 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
28d60 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
28d70 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
28d80 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
28d90 61 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20  ause btree term 
28da0 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72  to add */.  Wher
28db0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
28dc0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
28dd0 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ate WhereLoop ob
28de0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
28df0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
28e00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
28e10 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  code */.  int iS
28e20 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20  ortIdx = 1;     
28e30 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e        /* Index n
28e40 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62  umber */.  int b
28e50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28e60 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c         /* A bool
28e70 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 57  ean value */.  W
28e80 68 65 72 65 43 6f 73 74 20 72 53 69 7a 65 3b 20  hereCost rSize; 
28e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75             /* nu
28ea0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
28eb0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
28ec0 68 65 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a  hereCost rLogSiz
28ed0 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  e;         /* Lo
28ee0 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e  garithm of the n
28ef0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
28f00 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
28f10 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
28f20 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e  er->pNew;.  pWIn
28f30 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
28f40 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73  WInfo;.  pTabLis
28f50 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
28f60 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20 70  List;.  pSrc = p
28f70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
28f80 77 2d 3e 69 54 61 62 3b 0a 20 20 61 73 73 65 72  w->iTab;.  asser
28f90 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 53  t( !IsVirtual(pS
28fa0 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20  rc->pTab) );..  
28fb0 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  if( pSrc->pIndex
28fc0 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e   ){.    /* An IN
28fd0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
28fe0 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74  specifies a part
28ff0 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20  icular index to 
29000 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62  use */.    pProb
29010 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  e = pSrc->pIndex
29020 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
29030 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
29040 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
29050 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
29060 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
29070 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
29080 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
29090 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
290a0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
290b0 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
290c0 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
290d0 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
290e0 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
290f0 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
29100 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
29110 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
29120 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
29130 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
29140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29150 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
29160 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
29170 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
29180 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
29190 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
291a0 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20  .nColumn = 1;.  
291b0 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d    sPk.aiColumn =
291c0 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20   &aiColumnPk;.  
291d0 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d    sPk.aiRowEst =
291e0 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20   aiRowEstPk;.   
291f0 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f   sPk.onError = O
29200 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73  E_Replace;.    s
29210 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53 72 63  Pk.pTable = pSrc
29220 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 69 52 6f  ->pTab;.    aiRo
29230 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53 72 63  wEstPk[0] = pSrc
29240 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b  ->pTab->nRowEst;
29250 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
29260 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46 69 72  1] = 1;.    pFir
29270 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  st = pSrc->pTab-
29280 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  >pIndex;.    if(
29290 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65   pSrc->notIndexe
292a0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
292b0 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65   The real indice
292c0 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
292d0 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
292e0 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
292f0 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71  ** NOT INDEXED q
29300 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74  ualifier is omit
29310 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f  ted from the FRO
29320 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
29330 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
29340 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
29350 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
29360 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 77 68 65   }.  rSize = whe
29370 72 65 43 6f 73 74 28 70 53 72 63 2d 3e 70 54 61  reCost(pSrc->pTa
29380 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a 20 20 72  b->nRowEst);.  r
29390 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67  LogSize = estLog
293a0 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 41  (rSize);..  /* A
293b0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
293c0 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c   */.  if( !pBuil
293d0 64 65 72 2d 3e 70 42 65 73 74 0a 20 20 20 26 26  der->pBest.   &&
293e0 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65   (pWInfo->pParse
293f0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
29400 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21  LITE_AutoIndex)!
29410 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70  =0.   && pSrc->p
29420 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21  Index==0.   && !
29430 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69  pSrc->viaCorouti
29440 6e 65 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  ne.   && !pSrc->
29450 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26  notIndexed.   &&
29460 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c   !pSrc->isCorrel
29470 61 74 65 64 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  ated.  ){.    /*
29480 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69   Generate auto-i
29490 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20  ndex WhereLoops 
294a0 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75  */.    WhereClau
294b0 73 65 20 2a 70 57 43 20 3d 20 70 42 75 69 6c 64  se *pWC = pBuild
294c0 65 72 2d 3e 70 57 43 3b 0a 20 20 20 20 57 68 65  er->pWC;.    Whe
294d0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
294e0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57     WhereTerm *pW
294f0 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
29500 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  pWC->nTerm;.    
29510 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
29520 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
29530 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  && pTerm<pWCEnd;
29540 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
29550 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
29560 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
29570 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
29580 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74  nue;.      if( t
29590 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
295a0 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29  (pTerm, pSrc, 0)
295b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
295c0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
295d0 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
295e0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
295f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 0;.        pNe
29600 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  w->nLTerm = 1;. 
29610 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
29620 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
29630 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
29640 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74  G: One-time cost
29650 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74   for computing t
29660 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
29670 65 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  ex is.        **
29680 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 36   approximately 6
29690 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65  *N*log2(N) where
296a0 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
296b0 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20   of rows in.    
296c0 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65      ** the table
296d0 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 2e 20   being indexed. 
296e0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
296f0 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69  >rSetup = rLogSi
29700 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20 32 36 3b  ze + rSize + 26;
29710 20 20 61 73 73 65 72 74 28 20 32 36 3d 3d 77 68    assert( 26==wh
29720 65 72 65 43 6f 73 74 28 36 29 20 29 3b 0a 20 20  ereCost(6) );.  
29730 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
29740 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b   Each index look
29750 75 70 20 79 69 65 6c 64 73 20 31 30 20 72 6f 77  up yields 10 row
29760 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
29770 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
29780 6e 4f 75 74 20 3d 20 33 33 3b 20 20 61 73 73 65  nOut = 33;  asse
29790 72 74 28 20 33 33 3d 3d 77 68 65 72 65 43 6f 73  rt( 33==whereCos
297a0 74 28 31 30 29 20 29 3b 0a 20 20 20 20 20 20 20  t(10) );.       
297b0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68   pNew->rRun = wh
297c0 65 72 65 43 6f 73 74 41 64 64 28 72 4c 6f 67 53  ereCostAdd(rLogS
297d0 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  ize,pNew->nOut);
297e0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
297f0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 54  sFlags = WHERE_T
29800 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  EMP_INDEX;.     
29810 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
29820 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d  = mExtra | pTerm
29830 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
29840 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
29850 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
29860 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
29870 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
29880 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
29890 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a  ll indices.  */.
298a0 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
298b0 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b  TE_OK && pProbe;
298c0 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e   pProbe=pProbe->
298d0 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b  pNext, iSortIdx+
298e0 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  +){.    pNew->u.
298f0 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20  btree.nEq = 0;. 
29900 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
29910 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
29920 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
29930 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
29940 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  0;.    pNew->pre
29950 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20  req = mExtra;.  
29960 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
29970 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b  pIndex = pProbe;
29980 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69  .    b = indexMi
29990 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
299a0 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72  By(pBuilder, pPr
299b0 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  obe, pSrc->iCurs
299c0 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  or);.    /* The 
299d0 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
299e0 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75  flags never occu
299f0 72 73 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  rs together with
29a00 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20   ORDER BY */.   
29a10 20 61 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f   assert( (pWInfo
29a20 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
29a30 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
29a40 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30  IRED)==0 || b==0
29a50 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f   );.    if( pPro
29a60 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20  be->tnum<=0 ){. 
29a70 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
29a80 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
29a90 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  x */.      pNew-
29aa0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
29ab0 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  _IPK;..      /* 
29ac0 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  Full table scan 
29ad0 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  */.      pNew->i
29ae0 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
29af0 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20  ortIdx : 0;.    
29b00 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
29b10 53 69 7a 65 3b 0a 20 20 20 20 20 20 2f 2a 20 54  Size;.      /* T
29b20 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66  UNING: Cost of f
29b30 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69  ull table scan i
29b40 73 20 33 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29  s 3*(N + log2(N)
29b50 29 2e 0a 20 20 20 20 20 20 2a 2a 20 20 2b 20 20  )..      **  +  
29b60 54 68 65 20 65 78 74 72 61 20 33 20 66 61 63 74  The extra 3 fact
29b70 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f 75 72 61  or is to encoura
29b80 67 65 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e  ge the use of in
29b90 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20  dexed lookups.  
29ba0 20 20 20 20 2a 2a 20 20 20 20 20 6f 76 65 72 20      **     over 
29bb0 66 75 6c 6c 20 73 63 61 6e 73 2e 20 20 41 20 73  full scans.  A s
29bc0 6d 61 6c 6c 65 72 20 63 6f 6e 73 74 61 6e 74 20  maller constant 
29bd0 32 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f  2 is used for co
29be0 76 65 72 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  vering.      ** 
29bf0 20 20 20 20 69 6e 64 65 78 20 73 63 61 6e 73 20      index scans 
29c00 73 6f 20 74 68 61 74 20 61 20 63 6f 76 65 72 69  so that a coveri
29c10 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 77 69  ng index scan wi
29c20 6c 6c 20 62 65 20 66 61 76 6f 72 65 64 20 6f 76  ll be favored ov
29c30 65 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  er.      **     
29c40 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 2a 2f  a table scan. */
29c50 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
29c60 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64  n = whereCostAdd
29c70 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29  (rSize,rLogSize)
29c80 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 72 63 20   + 16;.      rc 
29c90 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
29ca0 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
29cb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
29cc0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c  ) break;.    }el
29cd0 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  se{.      Bitmas
29ce0 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55  k m = pSrc->colU
29cf0 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e  sed & ~columnsIn
29d00 49 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20  Index(pProbe);. 
29d10 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
29d20 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57  gs = (m==0) ? (W
29d30 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48  HERE_IDX_ONLY|WH
29d40 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57  ERE_INDEXED) : W
29d50 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 0a 20  HERE_INDEXED;.. 
29d60 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61       /* Full sca
29d70 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20  n via index */. 
29d80 20 20 20 20 20 69 66 28 20 62 0a 20 20 20 20 20       if( b.     
29d90 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20    || ( m==0.    
29da0 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
29db0 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20  bUnordered==0.  
29dc0 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
29dd0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
29de0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
29df0 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  SIRED)==0.      
29e00 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f     && sqlite3Glo
29e10 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
29e20 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  s.         && Op
29e30 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
29e40 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
29e50 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76  ->db, SQLITE_Cov
29e60 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20  erIdxScan).     
29e70 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a       ).      ){.
29e80 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53          pNew->iS
29e90 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
29ea0 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20  rtIdx : 0;.     
29eb0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
29ec0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
29ed0 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( m==0 ){.     
29ee0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
29ef0 43 6f 73 74 20 6f 66 20 61 20 63 6f 76 65 72 69  Cost of a coveri
29f00 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73  ng index scan is
29f10 20 32 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29   2*(N + log2(N))
29f20 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  ..          **  
29f30 2b 20 20 54 68 65 20 65 78 74 72 61 20 32 20 66  +  The extra 2 f
29f40 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f  actor is to enco
29f50 75 72 61 67 65 20 74 68 65 20 75 73 65 20 6f 66  urage the use of
29f60 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73   indexed lookups
29f70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
29f80 20 20 6f 76 65 72 20 69 6e 64 65 78 20 73 63 61    over index sca
29f90 6e 73 2e 20 20 41 20 74 61 62 6c 65 20 73 63 61  ns.  A table sca
29fa0 6e 20 75 73 65 73 20 61 20 66 61 63 74 6f 72 20  n uses a factor 
29fb0 6f 66 20 33 20 73 6f 20 74 68 61 74 0a 20 20 20  of 3 so that.   
29fc0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
29fd0 64 65 78 20 73 63 61 6e 73 20 61 72 65 20 66 61  dex scans are fa
29fe0 76 6f 72 65 64 20 6f 76 65 72 20 74 61 62 6c 65  vored over table
29ff0 20 73 63 61 6e 73 2e 0a 20 20 20 20 20 20 20 20   scans..        
2a000 20 20 2a 2a 20 20 2b 20 20 49 66 20 74 68 69 73    **  +  If this
2a010 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
2a020 6d 69 67 68 74 20 61 6c 73 6f 20 68 65 6c 70 20  might also help 
2a030 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
2a040 52 20 42 59 0a 20 20 20 20 20 20 20 20 20 20 2a  R BY.          *
2a050 2a 20 20 20 20 20 63 6c 61 75 73 65 2c 20 74 68  *     clause, th
2a060 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 66  en the cost is f
2a070 75 64 67 65 64 20 64 6f 77 6e 20 73 6c 69 67 68  udged down sligh
2a080 74 6c 79 20 73 6f 20 74 68 61 74 20 74 68 69 73  tly so that this
2a090 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20  .          **   
2a0a0 20 20 69 6e 64 65 78 20 69 73 20 66 61 76 6f 72    index is favor
2a0b0 65 64 20 61 62 6f 76 65 20 6f 74 68 65 72 20 69  ed above other i
2a0c0 6e 64 69 63 65 73 20 74 68 61 74 20 68 61 76 65  ndices that have
2a0d0 20 6e 6f 20 68 6f 70 65 20 6f 66 0a 20 20 20 20   no hope of.    
2a0e0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 68 65 6c        **     hel
2a0f0 70 69 6e 67 20 77 69 74 68 20 74 68 65 20 4f 52  ping with the OR
2a100 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20 20 20  DER BY. */.     
2a110 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2a120 3d 20 31 30 20 2b 20 77 68 65 72 65 43 6f 73 74  = 10 + whereCost
2a130 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69  Add(rSize,rLogSi
2a140 7a 65 29 20 2d 20 62 3b 0a 20 20 20 20 20 20 20  ze) - b;.       
2a150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a160 20 20 61 73 73 65 72 74 28 20 62 21 3d 30 20 29    assert( b!=0 )
2a170 3b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ; .          /* 
2a180 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20  TUNING: Cost of 
2a190 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e 2d 63  scanning a non-c
2a1a0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 69 73  overing index is
2a1b0 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29 0a 20   (N+1)*log2(N). 
2a1c0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63           ** whic
2a1d0 68 20 77 65 20 77 69 6c 6c 20 73 69 6d 70 6c 69  h we will simpli
2a1e0 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c 6f 67  fy to just N*log
2a1f0 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  2(N) */.        
2a200 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
2a210 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a 65 3b  Size + rLogSize;
2a220 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a230 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2a240 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
2a250 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
2a260 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
2a270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a280 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2a290 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
2a2a0 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
2a2b0 50 72 6f 62 65 2c 20 30 29 3b 0a 0a 20 20 20 20  Probe, 0);..    
2a2c0 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
2a2d0 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
2a2e0 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ause, then only 
2a2f0 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69  that one index i
2a300 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  s.    ** conside
2a310 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
2a320 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62  pSrc->pIndex ) b
2a330 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
2a340 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
2a350 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2a360 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
2a370 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
2a380 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
2a390 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
2a3a0 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  in identified by
2a3b0 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  .** pBuilder->pN
2a3c0 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20  ew->iTab.  That 
2a3d0 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74  table is guarant
2a3e0 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74  eed to be a virt
2a3f0 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
2a400 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
2a410 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20  opAddVirtual(.  
2a420 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2a430 20 2a 70 42 75 69 6c 64 65 72 20 20 20 2f 2a 20   *pBuilder   /* 
2a440 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
2a450 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  ormation */.){. 
2a460 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2a470 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fo;           /*
2a480 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
2a490 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
2a4a0 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
2a4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a4c0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
2a4d0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
2a4e0 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
2a4f0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
2a500 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
2a510 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2a520 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  *pSrc;   /* The 
2a530 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
2a540 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
2a550 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
2a560 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71  qlite3 *db;.  sq
2a570 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
2a580 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74   *pIdxInfo;.  st
2a590 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2a5a0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
2a5b0 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
2a5c0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
2a5d0 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
2a5e0 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
2a5f0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
2a600 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
2a610 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20  iTerm, mxTerm;. 
2a620 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
2a630 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d  ;.  int seenIn =
2a640 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2a650 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49   /* True if an I
2a660 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65  N operator is se
2a670 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e  en */.  int seen
2a680 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Var = 0;        
2a690 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a6a0 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63  a non-constant c
2a6b0 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65  onstraint is see
2a6c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73  n */.  int iPhas
2a6d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2a6e0 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20      /* 0: const 
2a6f0 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74  w/o IN, 1: const
2a700 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20  , 2: no IN,  2: 
2a710 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  IN */.  WhereLoo
2a720 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  p *pNew;.  int r
2a730 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2a740 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
2a750 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
2a760 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
2a770 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
2a780 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43  Parse->db;.  pWC
2a790 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
2a7a0 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
2a7b0 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72  der->pNew;.  pSr
2a7c0 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  c = &pWInfo->pTa
2a7d0 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69  bList->a[pNew->i
2a7e0 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70  Tab];.  pTab = p
2a7f0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73  Src->pTab;.  ass
2a800 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70  ert( IsVirtual(p
2a810 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e  Tab) );.  pIdxIn
2a820 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64  fo = allocateInd
2a830 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  exInfo(pParse, p
2a840 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64  WC, pSrc, pBuild
2a850 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  er->pOrderBy);. 
2a860 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
2a870 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2a880 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e  _NOMEM;.  pNew->
2a890 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e  prereq = 0;.  pN
2a8a0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2a8b0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2a8c0 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
2a8d0 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  ABLE;.  pNew->nL
2a8e0 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77  Term = 0;.  pNew
2a8f0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2a900 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20  e = 0;.  pUsage 
2a910 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
2a920 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
2a930 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  nConstraint = pI
2a940 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
2a950 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65  int;.  if( where
2a960 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
2a970 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  New, nConstraint
2a980 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
2a990 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49  DbFree(db, pIdxI
2a9a0 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nfo);.    return
2a9b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2a9c0 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65   }..  for(iPhase
2a9d0 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69  =0; iPhase<=3; i
2a9e0 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66  Phase++){.    if
2a9f0 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50  ( !seenIn && (iP
2aa00 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20  hase&1)!=0 ){.  
2aa10 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20      iPhase++;.  
2aa20 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e 33      if( iPhase>3
2aa30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
2aa40 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61 72      if( !seenVar
2aa50 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20 62   && iPhase>1 ) b
2aa60 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f  reak;.    pIdxCo
2aa70 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
2aa80 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2aa90 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
2aaa0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
2aab0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2aac0 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
2aad0 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
2aae0 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a  Cons++){.      j
2aaf0 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
2ab00 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
2ab10 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
2ab20 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  j];.      switch
2ab30 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20  ( iPhase ){.    
2ab40 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f      case 0:    /
2ab50 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  * Constants with
2ab60 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  out IN operator 
2ab70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  */.          pId
2ab80 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2ab90 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
2aba0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2abb0 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
2abc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
2abd0 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  enIn = 1;.      
2abe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2abf0 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
2ac00 71 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20 20  qRight!=0 ){.   
2ac10 20 20 20 20 20 20 20 20 20 73 65 65 6e 56 61 72           seenVar
2ac20 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2ac30 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
2ac40 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2ac50 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _IN)==0 ){.     
2ac60 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2ac70 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
2ac80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ac90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2aca0 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20    case 1:    /* 
2acb0 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49  Constants with I
2acc0 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  N operators */. 
2acd0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2ace0 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20   seenIn );.     
2acf0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
2ad00 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e  sable = (pTerm->
2ad10 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29 3b  prereqRight==0);
2ad20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2ad30 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32  ;.        case 2
2ad40 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  :    /* Variable
2ad50 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a  s without IN */.
2ad60 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2ad70 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20  ( seenVar );.   
2ad80 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2ad90 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
2ada0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2adb0 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  _IN)==0;.       
2adc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2add0 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20    default:   /* 
2ade0 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49  Variables with I
2adf0 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
2ae00 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26  ssert( seenVar &
2ae10 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  & seenIn );.    
2ae20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2ae30 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
2ae40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ae50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d     }.    }.    m
2ae60 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
2ae70 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
2ae80 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ])*pIdxInfo->nCo
2ae90 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69  nstraint);.    i
2aea0 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
2aeb0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20  dToFreeIdxStr ) 
2aec0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
2aed0 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
2aee0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
2aef0 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49  xStr = 0;.    pI
2af00 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
2af10 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
2af20 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2af30 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  tr = 0;.    pIdx
2af40 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
2af50 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70  sumed = 0;.    p
2af60 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
2af70 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
2af80 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c  BIG_DBL / (doubl
2af90 65 29 32 3b 0a 20 20 20 20 72 63 20 3d 20 76 74  e)2;.    rc = vt
2afa0 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72  abBestIndex(pPar
2afb0 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e  se, pTab, pIdxIn
2afc0 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fo);.    if( rc 
2afd0 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70  ) goto whereLoop
2afe0 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20  AddVtab_exit;.  
2aff0 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
2b000 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
2b010 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
2b020 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
2b030 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65  straint;.    pNe
2b040 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20  w->prereq = 0;. 
2b050 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a     mxTerm = -1;.
2b060 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
2b070 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74  ->nLSlot>=nConst
2b080 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72  raint );.    for
2b090 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
2b0a0 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e  int; i++) pNew->
2b0b0 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20  aLTerm[i] = 0;. 
2b0c0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2b0d0 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  omitMask = 0;.  
2b0e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
2b0f0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
2b100 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
2b110 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70    if( (iTerm = p
2b120 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
2b130 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20  ex - 1)>=0 ){.  
2b140 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f        j = pIdxCo
2b150 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
2b160 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
2b170 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a  rm>=nConstraint.
2b180 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a           || j<0.
2b190 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70           || j>=p
2b1a0 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20  WC->nTerm.      
2b1b0 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65     || pNew->aLTe
2b1c0 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20  rm[iTerm]!=0.   
2b1d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2b1e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2b1f0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ROR;.          s
2b200 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2b210 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74  Parse, "%s.xBest
2b220 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74  Index() malfunct
2b230 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ion", pTab->zNam
2b240 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
2b250 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
2b260 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  tab_exit;.      
2b270 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
2b280 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f  case( iTerm==nCo
2b290 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20  nstraint-1 );.  
2b2a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b2b0 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  j==0 );.        
2b2c0 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43  testcase( j==pWC
2b2d0 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20  ->nTerm-1 );.   
2b2e0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
2b2f0 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  C->a[j];.       
2b300 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d   pNew->prereq |=
2b310 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
2b320 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
2b330 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d  ert( iTerm<pNew-
2b340 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
2b350 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2b360 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a  iTerm] = pTerm;.
2b370 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
2b380 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72  m>mxTerm ) mxTer
2b390 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  m = iTerm;.     
2b3a0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
2b3b0 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20  rm==15 );.      
2b3c0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
2b3d0 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20  m==16 );.       
2b3e0 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26   if( iTerm<16 &&
2b3f0 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20   pUsage[i].omit 
2b400 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f  ) pNew->u.vtab.o
2b410 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54  mitMask |= 1<<iT
2b420 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
2b430 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2b440 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
2b450 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2b460 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d  pUsage[i].omit==
2b470 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2b480 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   /* Do not attem
2b490 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20  pt to use an IN 
2b4a0 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68  constraint if th
2b4b0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a  e virtual table.
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
2b4d0 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75  ays that the equ
2b4e0 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74  ivalent EQ const
2b4f0 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
2b500 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a  safely omitted..
2b510 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49              ** I
2b520 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20  f we do attempt 
2b530 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f  to use such a co
2b540 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72  nstraint, some r
2b550 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20  ows might be.   
2b560 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65           ** repe
2b570 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70  ated in the outp
2b580 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ut. */.         
2b590 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b5a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b5b0 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  /* A virtual tab
2b5c0 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  le that is const
2b5d0 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20  rained by an IN 
2b5e0 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20  clause may not. 
2b5f0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
2b600 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ume the ORDER BY
2b610 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20   clause because 
2b620 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66  (1) the order of
2b630 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20   IN terms.      
2b640 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65      ** is not ne
2b650 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65  cessarily relate
2b660 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f  d to the order o
2b670 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61  f output terms a
2b680 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
2b690 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74  (2) Multiple out
2b6a0 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67  puts from a sing
2b6b0 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c  le IN value will
2b6c0 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20   not merge.     
2b6d0 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72       ** together
2b6e0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2b6f0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
2b700 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
2b710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2b720 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2b730 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b  >=nConstraint ){
2b740 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
2b750 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a  erm = mxTerm+1;.
2b760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
2b770 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77  ew->nLTerm<=pNew
2b780 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
2b790 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
2b7a0 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f  dxNum = pIdxInfo
2b7b0 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20  ->idxNum;.      
2b7c0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2b7d0 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
2b7e0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2b7f0 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e  tr;.      pIdxIn
2b800 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2b810 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  xStr = 0;.      
2b820 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
2b830 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Str = pIdxInfo->
2b840 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e  idxStr;.      pN
2b850 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  ew->u.vtab.isOrd
2b860 65 72 65 64 20 3d 20 28 75 38 29 28 28 70 49 64  ered = (u8)((pId
2b870 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21  xInfo->nOrderBy!
2b880 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
2b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8a0 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
2b8b0 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
2b8c0 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70 4e  sumed);.      pN
2b8d0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2b8e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
2b8f0 20 3d 20 77 68 65 72 65 43 6f 73 74 46 72 6f 6d   = whereCostFrom
2b900 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d  Double(pIdxInfo-
2b910 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
2b920 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
2b930 3a 20 45 76 65 72 79 20 76 69 72 74 75 61 6c 20  : Every virtual 
2b940 74 61 62 6c 65 20 71 75 65 72 79 20 72 65 74 75  table query retu
2b950 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
2b960 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2b970 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
2b980 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29  6==whereCost(25)
2b990 20 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c   );.      whereL
2b9a0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2b9b0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2b9c0 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61   if( pNew->u.vta
2b9d0 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
2b9e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2b9f0 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  ee(pNew->u.vtab.
2ba00 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20  idxStr);.       
2ba10 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
2ba20 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  edFree = 0;.    
2ba30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a    }.    }.  }  .
2ba40 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61  .whereLoopAddVta
2ba50 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49  b_exit:.  if( pI
2ba60 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
2ba70 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74  eeIdxStr ) sqlit
2ba80 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f  e3_free(pIdxInfo
2ba90 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
2baa0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2bab0 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75  IdxInfo);.  retu
2bac0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
2bad0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
2bae0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
2baf0 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c  /*.** Add WhereL
2bb00 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68  oop entries to h
2bb10 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20  andle OR terms. 
2bb20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20   This works for 
2bb30 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73  either.** btrees
2bb40 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c   or virtual tabl
2bb50 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2bb60 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  t whereLoopAddOr
2bb70 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
2bb80 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74  r *pBuilder, Bit
2bb90 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20  mask mExtra){.  
2bba0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2bbb0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2bbc0 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61  Info;.  WhereCla
2bbd0 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72  use *pWC;.  Wher
2bbe0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57  eLoop *pNew;.  W
2bbf0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
2bc00 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20   *pWCEnd;.  int 
2bc10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2bc20 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68    int iCur;.  Wh
2bc30 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43  ereClause tempWC
2bc40 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  ;.  WhereLoopBui
2bc50 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a  lder sSubBuild;.
2bc60 20 20 57 68 65 72 65 4c 6f 6f 70 20 73 42 65 73    WhereLoop sBes
2bc70 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
2bc80 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2bc90 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
2bca0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28  lder->pWC;.  if(
2bcb0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2bcc0 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f  ags & WHERE_AND_
2bcd0 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51  ONLY ) return SQ
2bce0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e  LITE_OK;.  pWCEn
2bcf0 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
2bd00 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
2bd10 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2bd20 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ;..  for(pTerm=p
2bd30 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
2bd40 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  End && rc==SQLIT
2bd50 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  E_OK; pTerm++){.
2bd60 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2bd70 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
2bd80 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  R)!=0.     && (p
2bd90 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
2bda0 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65  >indexable & pNe
2bdb0 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  w->maskSelf)!=0 
2bdc0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68  .    ){.      Wh
2bdd0 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73  ereClause * cons
2bde0 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d  t pOrWC = &pTerm
2bdf0 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
2be00 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
2be10 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e   * const pOrWCEn
2be20 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f  d = &pOrWC->a[pO
2be30 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20  rWC->nTerm];.   
2be40 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
2be50 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 57 68 65  rTerm;.      Whe
2be60 72 65 43 6f 73 74 20 72 54 6f 74 61 6c 20 3d 20  reCost rTotal = 
2be70 30 3b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6f  0;.      WhereCo
2be80 73 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20  st nRow = 0;.   
2be90 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65     Bitmask prere
2bea0 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
2beb0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
2bec0 49 6e 69 74 28 26 73 42 65 73 74 29 3b 0a 20 20  Init(&sBest);.  
2bed0 20 20 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e      pItem = pWIn
2bee0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20  fo->pTabList->a 
2bef0 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
2bf00 20 20 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d      iCur = pItem
2bf10 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2bf20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42   sSubBuild = *pB
2bf30 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53  uilder;.      sS
2bf40 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79  ubBuild.pOrderBy
2bf50 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62   = 0;.      sSub
2bf60 42 75 69 6c 64 2e 70 42 65 73 74 20 3d 20 26 73  Build.pBest = &s
2bf70 42 65 73 74 3b 0a 0a 20 20 20 20 20 20 66 6f 72  Best;..      for
2bf80 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e  (pOrTerm=pOrWC->
2bf90 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  a; rc==SQLITE_OK
2bfa0 20 26 26 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57   && pOrTerm<pOrW
2bfb0 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
2bfc0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
2bfd0 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
2bfe0 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
2bff0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
2c000 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
2c010 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
2c020 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
2c030 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
2c040 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
2c050 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
2c060 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
2c070 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
2c080 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
2c090 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
2c0a0 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
2c0b0 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
2c0c0 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
2c0d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
2c0e0 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
2c0f0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
2c100 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
2c110 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
2c120 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2c130 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2c140 20 7d 0a 20 20 20 20 20 20 20 20 73 42 65 73 74   }.        sBest
2c150 2e 6d 61 73 6b 53 65 6c 66 20 3d 20 30 3b 0a 20  .maskSelf = 0;. 
2c160 20 20 20 20 20 20 20 73 42 65 73 74 2e 72 53 65         sBest.rSe
2c170 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tup = 0;.       
2c180 20 73 42 65 73 74 2e 72 52 75 6e 20 3d 20 30 3b   sBest.rRun = 0;
2c190 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c1a0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2c1b0 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  E.        if( Is
2c1c0 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
2c1d0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2c1e0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2c1f0 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62  AddVirtual(&sSub
2c200 42 75 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Build);.        
2c210 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2c220 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2c230 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2c240 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69  ddBtree(&sSubBui
2c250 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  ld, mExtra);.   
2c260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2c270 66 28 20 73 42 65 73 74 2e 6d 61 73 6b 53 65 6c  f( sBest.maskSel
2c280 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  f==0 ) break;.  
2c290 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 42        assert( sB
2c2a0 65 73 74 2e 72 53 65 74 75 70 3d 3d 30 20 29 3b  est.rSetup==0 );
2c2b0 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20  .        rTotal 
2c2c0 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72  = whereCostAdd(r
2c2d0 54 6f 74 61 6c 2c 20 73 42 65 73 74 2e 72 52 75  Total, sBest.rRu
2c2e0 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77  n);.        nRow
2c2f0 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
2c300 6e 52 6f 77 2c 20 73 42 65 73 74 2e 6e 4f 75 74  nRow, sBest.nOut
2c310 29 3b 0a 20 20 20 20 20 20 20 20 70 72 65 72 65  );.        prere
2c320 71 20 7c 3d 20 73 42 65 73 74 2e 70 72 65 72 65  q |= sBest.prere
2c330 71 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  q;.      }.     
2c340 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
2c350 4c 53 6c 6f 74 3e 3d 31 20 29 3b 0a 20 20 20 20  LSlot>=1 );.    
2c360 20 20 69 66 28 20 73 42 65 73 74 2e 6d 61 73 6b    if( sBest.mask
2c370 53 65 6c 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Self ){.        
2c380 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
2c390 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2c3a0 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
2c3b0 6d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  m;.        pNew-
2c3c0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2c3d0 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20  _MULTI_OR;.     
2c3e0 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
2c3f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 0;.        pNe
2c400 77 2d 3e 72 52 75 6e 20 3d 20 72 54 6f 74 61 6c  w->rRun = rTotal
2c410 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2c420 6e 4f 75 74 20 3d 20 6e 52 6f 77 3b 0a 20 20 20  nOut = nRow;.   
2c430 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
2c440 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20 20 20  q = prereq;.    
2c450 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65 77      memset(&pNew
2c460 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->u, 0, sizeof(p
2c470 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20  New->u));.      
2c480 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2c490 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2c4a0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
2c4b0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 43        whereLoopC
2c4c0 6c 65 61 72 28 70 57 49 6e 66 6f 2d 3e 70 50 61  lear(pWInfo->pPa
2c4d0 72 73 65 2d 3e 64 62 2c 20 26 73 42 65 73 74 29  rse->db, &sBest)
2c4e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2c4f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2c500 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
2c510 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
2c520 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73  all tables .*/.s
2c530 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2c540 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c  oopAddAll(WhereL
2c550 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
2c560 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
2c570 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
2c580 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
2c590 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20   Bitmask mExtra 
2c5a0 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  = 0;.  Bitmask m
2c5b0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Prior = 0;.  int
2c5c0 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74   iTab;.  SrcList
2c5d0 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
2c5e0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
2c5f0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2c600 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
2c610 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
2c620 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
2c630 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20  .  int nTabList 
2c640 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
2c650 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2c660 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69  ITE_OK;.  u8 pri
2c670 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a  orJoinType = 0;.
2c680 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
2c690 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  w;..  /* Loop ov
2c6a0 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  er the tables in
2c6b0 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20   the join, from 
2c6c0 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f  left to right */
2c6d0 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
2c6e0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72  er->pNew;.  wher
2c6f0 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b  eLoopInit(pNew);
2c700 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70  .  for(iTab=0, p
2c710 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  Item=pTabList->a
2c720 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b  ; iTab<nTabList;
2c730 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b   iTab++, pItem++
2c740 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  ){.    pNew->iTa
2c750 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
2c760 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67  ew->maskSelf = g
2c770 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
2c780 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d  sMaskSet, pItem-
2c790 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  >iCursor);.    i
2c7a0 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e  f( ((pItem->join
2c7b0 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79  type|priorJoinTy
2c7c0 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  pe) & (JT_LEFT|J
2c7d0 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a  T_CROSS))!=0 ){.
2c7e0 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d        mExtra = m
2c7f0 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Prior;.    }.   
2c800 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d   priorJoinType =
2c810 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65   pItem->jointype
2c820 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  ;.    if( IsVirt
2c830 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
2c840 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
2c850 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
2c860 61 6c 28 70 42 75 69 6c 64 65 72 29 3b 0a 20 20  al(pBuilder);.  
2c870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2c880 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2c890 42 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20  Btree(pBuilder, 
2c8a0 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  mExtra);.    }. 
2c8b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c8c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2c8d0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f   = whereLoopAddO
2c8e0 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  r(pBuilder, mExt
2c8f0 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  ra);.    }.    m
2c900 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d  Prior |= pNew->m
2c910 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28  askSelf;.    if(
2c920 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f   rc || db->mallo
2c930 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
2c940 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70  .  }.  whereLoop
2c950 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b  Clear(db, pNew);
2c960 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c970 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61  ./*.** Examine a
2c980 20 57 68 65 72 65 50 61 74 68 20 28 77 69 74 68   WherePath (with
2c990 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66   the addition of
2c9a0 20 74 68 65 20 65 78 74 72 61 20 57 68 65 72 65   the extra Where
2c9b0 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a  Loop of the 5th.
2c9c0 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20 74  ** parameters) t
2c9d0 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75 74 70  o see if it outp
2c9e0 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20  uts rows in the 
2c9f0 72 65 71 75 65 73 74 65 64 20 4f 52 44 45 52 20  requested ORDER 
2ca00 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20  BY.** (or GROUP 
2ca10 42 59 29 20 77 69 74 68 6f 75 74 20 72 65 71 75  BY) without requ
2ca20 69 72 69 6e 67 20 61 20 73 65 70 61 72 61 74 65  iring a separate
2ca30 20 73 6f 75 72 63 65 20 6f 70 65 72 61 74 69 6f   source operatio
2ca40 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a  n.  Return:.** .
2ca50 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44 45 52 20  **    0:  ORDER 
2ca60 42 59 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66  BY is not satisf
2ca70 69 65 64 2e 20 20 53 6f 72 74 69 6e 67 20 72 65  ied.  Sorting re
2ca80 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 31 3a 20  quired.**    1: 
2ca90 20 4f 52 44 45 52 20 42 59 20 69 73 20 73 61 74   ORDER BY is sat
2caa0 69 73 66 69 65 64 2e 20 20 20 20 20 20 4f 6d 69  isfied.      Omi
2cab0 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 20 20 2d  t sorting.**   -
2cac0 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61 74 20 74  1:  Unknown at t
2cad0 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2f 0a 73  his time.**.*/.s
2cae0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50  tatic int whereP
2caf0 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
2cb00 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  rBy(.  WhereInfo
2cb10 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20   *pWInfo,    /* 
2cb20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2cb30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2cb40 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f  pOrderBy,   /* O
2cb50 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
2cb60 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20   BY or DISTINCT 
2cb70 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20  clause to check 
2cb80 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
2cb90 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68  pPath,     /* Th
2cba0 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63  e WherePath to c
2cbb0 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63  heck */.  u16 wc
2cbc0 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
2cbd0 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e  /* Might contain
2cbe0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f   WHERE_GROUPBY o
2cbf0 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  r WHERE_DISTINCT
2cc00 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f  BY */.  u16 nLoo
2cc10 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
2cc20 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
2cc30 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f  es in pPath->aLo
2cc40 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  op[] */.  WhereL
2cc50 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20  oop *pLast,     
2cc60 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72  /* Add this Wher
2cc70 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64  eLoop to the end
2cc80 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   of pPath->aLoop
2cc90 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  [] */.  Bitmask 
2cca0 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a  *pRevMask     /*
2ccb0 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68   OUT: Mask of Wh
2ccc0 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20  ereLoops to run 
2ccd0 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
2cce0 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53   */.){.  u8 revS
2ccf0 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
2cd00 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73  * True if rev is
2cd10 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72   known */.  u8 r
2cd20 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
2cd30 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73    /* Composite s
2cd40 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
2cd50 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20  8 revIdx;       
2cd60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f       /* Index so
2cd70 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
2cd80 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2cd90 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72  ;   /* All prior
2cda0 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20   WhereLoops are 
2cdb0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a  order-distinct *
2cdc0 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43  /.  u8 distinctC
2cdd0 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75  olumns;   /* Tru
2cde0 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61  e if the loop ha
2cdf0 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c  s UNIQUE NOT NUL
2ce00 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  L columns */.  u
2ce10 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20  8 isMatch;      
2ce20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20       /* iColumn 
2ce30 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f  matches a term o
2ce40 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
2ce50 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e  lause */.  u16 n
2ce60 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
2ce70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2ce80 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20  lumns in pIndex 
2ce90 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42  */.  u16 nOrderB
2cea0 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
2ceb0 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68  mber terms in th
2cec0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2ced0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  e */.  int iLoop
2cee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2cef0 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f  Index of WhereLo
2cf00 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e  op in pPath bein
2cf10 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  g processed */. 
2cf20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
2cf30 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2cf40 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
2cf50 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
2cf60 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
2cf70 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ber for current 
2cf80 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69  WhereLoop */.  i
2cf90 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
2cfa0 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e       /* A column
2cfb0 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74   number within t
2cfc0 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57  able iCur */.  W
2cfd0 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
2cfe0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2cff0 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20  WhereLoop being 
2d000 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20  processed. */.  
2d010 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2d020 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c  ;     /* A singl
2d030 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
2d040 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2d050 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20  Expr *pOBExpr;  
2d060 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72        /* An expr
2d070 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
2d080 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2d090 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
2d0a0 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f  oll;       /* CO
2d0b0 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66  LLATE function f
2d0c0 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20  rom an ORDER BY 
2d0d0 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
2d0e0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
2d0f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
2d100 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
2d110 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73  ith pLoop */.  s
2d120 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
2d130 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
2d140 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
2d150 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  nnection */.  Bi
2d160 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b  tmask obSat = 0;
2d170 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f      /* Mask of O
2d180 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61  RDER BY terms sa
2d190 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a  tisfied so far *
2d1a0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f  /.  Bitmask obDo
2d1b0 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ne;       /* Mas
2d1c0 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42  k of all ORDER B
2d1d0 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  Y terms */.  Bit
2d1e0 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e  mask orderDistin
2d1f0 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b  ctMask;  /* Mask
2d200 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64   of all well-ord
2d210 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  ered loops */.  
2d220 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20  Bitmask ready;  
2d230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2d240 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f  ask of inner loo
2d250 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ps */..  /*.  **
2d260 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
2d270 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f  eLoop is "one-ro
2d280 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74  w" if it generat
2d290 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  es no more than 
2d2a0 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  one.  ** row of 
2d2b0 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65  output.  A Where
2d2c0 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20  Loop is one-row 
2d2d0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
2d2e0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
2d2f0 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20  :.  **  (a) All 
2d300 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61  index columns ma
2d310 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43  tch with WHERE_C
2d320 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20  OLUMN_EQ..  **  
2d330 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73  (b) The index is
2d340 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79   unique.  ** Any
2d350 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
2d360 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  an WHERE_COLUMN_
2d370 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  EQ constraint on
2d380 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e   the rowid is on
2d390 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72  e-row..  ** Ever
2d3a0 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c  y one-row WhereL
2d3b0 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68  oop will have th
2d3c0 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62  e WHERE_ONEROW b
2d3d0 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67  it set in wsFlag
2d3e0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  s..  **.  ** We 
2d3f0 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
2d400 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74  p is "order-dist
2d410 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74  inct" if the set
2d420 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d   of columns from
2d430 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65  .  ** that Where
2d440 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e  Loop that are in
2d450 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2d460 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65  ause are differe
2d470 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a  nt for every.  *
2d480 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65  * row of the Whe
2d490 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f  reLoop.  Every o
2d4a0 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
2d4b0 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
2d4c0 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73  y.  ** order-dis
2d4d0 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65  tinct.   A Where
2d4e0 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f  Loop that has no
2d4f0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2d500 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
2d510 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65    ** is not orde
2d520 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62  r-distinct. To b
2d530 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
2d540 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68   is not quite th
2d550 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a  e same as being.
2d560 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63    ** UNIQUE sinc
2d570 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d  e a UNIQUE colum
2d580 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68  n or index can h
2d590 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ave multiple row
2d5a0 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65  s that .  ** are
2d5b0 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76   NULL and NULL v
2d5c0 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61  alues are equiva
2d5d0 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72  lent for the pur
2d5e0 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69  pose of order-di
2d5f0 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20  stinct..  ** To 
2d600 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
2d610 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d  t, the columns m
2d620 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e  ust be UNIQUE an
2d630 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  d NOT NULL..  **
2d640 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20  .  ** The rowid 
2d650 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61  for a table is a
2d660 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64  lways UNIQUE and
2d670 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65   NOT NULL so whe
2d680 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72  never the.  ** r
2d690 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20  owid appears in 
2d6a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2d6b0 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  use, the corresp
2d6c0 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  onding WhereLoop
2d6d0 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74   is.  ** automat
2d6e0 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73  ically order-dis
2d6f0 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61  tinct..  */..  a
2d700 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
2d710 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74  =0 );..  /* Sort
2d720 61 62 69 6c 69 74 79 20 6f 66 20 76 69 72 74 75  ability of virtu
2d730 61 6c 20 74 61 62 6c 65 73 20 69 73 20 64 65 74  al tables is det
2d740 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 78  ermined by the x
2d750 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
2d760 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 76 69 72  .  ** of the vir
2d770 74 75 61 6c 20 74 61 62 6c 65 20 69 74 73 65 6c  tual table itsel
2d780 66 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74  f */.  if( pLast
2d790 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2d7a0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29  E_VIRTUALTABLE )
2d7b0 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
2d7c0 6e 4c 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54  nLoop>0 );  /* T
2d7d0 72 75 65 20 77 68 65 6e 20 6f 75 74 65 72 20 6c  rue when outer l
2d7e0 6f 6f 70 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77  oops are one-row
2d7f0 20 61 6e 64 20 6d 61 74 63 68 20 0a 20 20 20 20   and match .    
2d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d810 20 20 20 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45        ** no ORDE
2d820 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
2d830 20 20 72 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e    return pLast->
2d840 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64  u.vtab.isOrdered
2d850 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f  ;.  }.  if( nLoo
2d860 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  p && Optimizatio
2d870 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
2d880 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a  LITE_OrderByIdxJ
2d890 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
2d8a0 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ..  nOrderBy = p
2d8b0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
2d8c0 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64    testcase( nOrd
2d8d0 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  erBy==BMS-1 );. 
2d8e0 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d   if( nOrderBy>BM
2d8f0 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  S-1 ) return 0; 
2d900 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d   /* Cannot optim
2d910 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65  ize overly large
2d920 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20   ORDER BYs */.  
2d930 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2d940 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20  = 1;.  obDone = 
2d950 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79  MASKBIT(nOrderBy
2d960 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74  )-1;.  orderDist
2d970 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  inctMask = 0;.  
2d980 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72  ready = 0;.  for
2d990 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65  (iLoop=0; isOrde
2d9a0 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53  rDistinct && obS
2d9b0 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f  at<obDone && iLo
2d9c0 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  op<=nLoop; iLoop
2d9d0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f  ++){.    if( iLo
2d9e0 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20  op>0 ) ready |= 
2d9f0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
2da00 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f  .    pLoop = iLo
2da10 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68  op<nLoop ? pPath
2da20 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a  ->aLoop[iLoop] :
2da30 20 70 4c 61 73 74 3b 0a 20 20 20 20 61 73 73 65   pLast;.    asse
2da40 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
2da50 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
2da60 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
2da70 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66      iCur = pWInf
2da80 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
2da90 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72  Loop->iTab].iCur
2daa0 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  sor;..    /* Mar
2dab0 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20  k off any ORDER 
2dac0 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69  BY term X that i
2dad0 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  s a column in th
2dae0 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a  e table of.    *
2daf0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  * the current lo
2db00 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  op for which the
2db10 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68  re is term in th
2db20 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63  e WHERE.    ** c
2db30 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
2db40 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58  m X IS NULL or X
2db50 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  =? that referenc
2db60 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20  e only outer.   
2db70 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a   ** loops..    *
2db80 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
2db90 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
2dba0 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42  .      if( MASKB
2dbb0 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
2dbc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2dbd0 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
2dbe0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
2dbf0 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
2dc00 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
2dc10 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
2dc20 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
2dc30 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
2dc40 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
2dc50 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
2dc60 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66  .      pTerm = f
2dc70 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d  indTerm(&pWInfo-
2dc80 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45  >sWC, iCur, pOBE
2dc90 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  xpr->iColumn,.  
2dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dcb0 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f       ~ready, WO_
2dcc0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29  EQ|WO_ISNULL, 0)
2dcd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
2dce0 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
2dcf0 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
2dd00 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f  m->eOperator&WO_
2dd10 45 51 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70  EQ)!=0 && pOBExp
2dd20 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  r->iColumn>=0 ){
2dd30 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2dd40 68 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20  har *z1, *z2;.  
2dd50 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2dd60 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2dd70 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
2dd80 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2dd90 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2dda0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
2ddb0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
2ddc0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ll;.        z1 =
2ddd0 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
2dde0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
2ddf0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2de00 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
2de10 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b  , pTerm->pExpr);
2de20 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
2de30 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
2de40 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2de50 20 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d       z2 = pColl-
2de60 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
2de70 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
2de80 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20  mp(z1, z2)!=0 ) 
2de90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2dea0 7d 0a 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d  }.      obSat |=
2deb0 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
2dec0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f   }..    if( (pLo
2ded0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2dee0 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29  ERE_ONEROW)==0 )
2def0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f  {.      if( pLoo
2df00 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2df10 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20  RE_IPK ){.      
2df20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
2df30 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
2df40 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
2df50 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f  f( (pIndex = pLo
2df60 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2df70 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78  ex)==0 || pIndex
2df80 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a  ->bUnordered ){.
2df90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
2dfa0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2dfb0 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
2dfc0 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
2dfd0 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
2dfe0 72 44 69 73 74 69 6e 63 74 20 3d 20 70 49 6e 64  rDistinct = pInd
2dff0 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
2e000 4e 6f 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  None;.      }.. 
2e010 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
2e020 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  ough all columns
2e030 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
2e040 64 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20  d deal with the 
2e050 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  ones.      ** th
2e060 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74  at are not const
2e070 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20  rained by == or 
2e080 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  IN..      */.   
2e090 20 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20     rev = revSet 
2e0a0 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69  = 0;.      disti
2e0b0 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a  nctColumns = 0;.
2e0c0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2e0d0 3c 3d 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  <=nColumn; j++){
2e0e0 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63  .        u8 bOnc
2e0f0 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  e;   /* True to 
2e100 72 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  run the ORDER BY
2e110 20 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a   search loop */.
2e120 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70  .        /* Skip
2e130 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20   over == and IS 
2e140 4e 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20  NULL terms */.  
2e150 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f        if( j<pLoo
2e160 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
2e170 20 20 20 20 20 20 20 20 26 26 20 28 28 69 20 3d          && ((i =
2e180 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
2e190 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20  ]->eOperator) & 
2e1a0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
2e1b0 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ))!=0.        ){
2e1c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2e1d0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2e1f0 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
2e200 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20  tinct );.       
2e210 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
2e220 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
2e230 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e240 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
2e250 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2e260 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  * Get the column
2e270 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74   number in the t
2e280 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61  able (iColumn) a
2e290 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20  nd sort order.  
2e2a0 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78        ** (revIdx
2e2b0 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63  ) for the j-th c
2e2c0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
2e2d0 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ex..        */. 
2e2e0 20 20 20 20 20 20 20 69 66 28 20 6a 3c 6e 43 6f         if( j<nCo
2e2f0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
2e300 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64 65    /* Normal inde
2e310 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  x columns */.   
2e320 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
2e330 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
2e340 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[j];.          
2e350 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d  revIdx = pIndex-
2e360 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
2e370 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
2e380 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70  olumn==pIndex->p
2e390 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
2e3a0 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
2e3b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e3c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 52 4f 57        /* The ROW
2e3d0 49 44 20 63 6f 6c 75 6d 6e 20 61 74 20 74 68 65  ID column at the
2e3e0 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20   end */.        
2e3f0 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 6f    assert( j==nCo
2e400 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
2e410 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a    iColumn = -1;.
2e420 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
2e430 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
2e440 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75  .        /* An u
2e450 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c  nconstrained col
2e460 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62  umn that might b
2e470 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61  e NULL means tha
2e480 74 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  t this.        *
2e490 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e  * WhereLoop is n
2e4a0 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20  ot well-ordered 
2e4b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2e4c0 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
2e4d0 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20  istinct.        
2e4e0 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20   && iColumn>=0. 
2e4f0 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c          && j>=pL
2e500 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
2e510 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49 6e  .         && pIn
2e520 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  dex->pTable->aCo
2e530 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75  l[iColumn].notNu
2e540 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ll==0.        ){
2e550 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64  .          isOrd
2e560 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
2e570 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2e580 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f     /* Find the O
2e590 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68 61  RDER BY term tha
2e5a0 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
2e5b0 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
2e5c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
2e5d0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 61 6e 64  he index and and
2e5e0 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52   mark that ORDER
2e5f0 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20   BY term off .  
2e600 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2e610 20 62 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20   bOnce = 1;.    
2e620 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b      isMatch = 0;
2e630 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2e640 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72  ; bOnce && i<nOr
2e650 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
2e660 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
2e670 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
2e680 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2e690 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71      pOBExpr = sq
2e6a0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
2e6b0 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
2e6c0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
2e6d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e6e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2e6f0 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
2e700 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2e710 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
2e720 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
2e730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2e740 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28   (wctrlFlags & (
2e750 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48  WHERE_GROUPBY|WH
2e760 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29  ERE_DISTINCTBY))
2e770 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b  ==0 ) bOnce = 0;
2e780 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2e790 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
2e7a0 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
2e7b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e7c0 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
2e7d0 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
2e7e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e7f0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
2e800 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  !=iColumn ) cont
2e810 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2e820 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  if( iColumn>=0 )
2e830 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
2e840 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2e850 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
2e860 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  >pParse, pOrderB
2e870 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2e880 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e890 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
2e8a0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e8c0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
2e8d0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e  Coll->zName, pIn
2e8e0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21  dex->azColl[j])!
2e8f0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2e900 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e910 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31       isMatch = 1
2e920 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2e930 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2e940 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68       if( isMatch
2e950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2e960 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ( iColumn<0 ){. 
2e970 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2e980 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c  ase( distinctCol
2e990 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20  umns==0 );.     
2e9a0 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43         distinctC
2e9b0 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20  olumns = 1;.    
2e9c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e9d0 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
2e9e0 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 20  IT(i);.         
2e9f0 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
2ea00 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2ea10 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a  _GROUPBY)==0 ){.
2ea20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2ea30 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72  ake sure the sor
2ea40 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61  t order is compa
2ea50 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45  tible in an ORDE
2ea60 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  R BY clause..   
2ea70 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74           ** Sort
2ea80 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65   order is irrele
2ea90 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50  vant for a GROUP
2eaa0 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20   BY clause. */. 
2eab0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2eac0 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20  evSet ){.       
2ead0 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20         if( (rev 
2eae0 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65  ^ revIdx)!=pOrde
2eaf0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
2eb00 64 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  der ) return 0;.
2eb10 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
2eb20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
2eb30 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20   rev = revIdx ^ 
2eb40 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
2eb50 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
2eb60 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20          if( rev 
2eb70 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d  ) *pRevMask |= M
2eb80 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20  ASKBIT(iLoop);. 
2eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76               rev
2eba0 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Set = 1;.       
2ebb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ebc0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2ebd0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  {.          /* N
2ebe0 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f  o match found */
2ebf0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
2ec00 3d 3d 30 20 7c 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e  ==0 || j<nColumn
2ec10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ec20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
2ec30 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a  rDistinct!=0 );.
2ec40 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2ec50 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
2ec60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ec70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2ec80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
2ec90 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72  /* end Loop over
2eca0 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d   all index colum
2ecb0 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
2ecc0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
2ecd0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
2ece0 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
2ecf0 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  inct==0 );.     
2ed00 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2ed10 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ct = 1;.      }.
2ed20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20      } /* end-if 
2ed30 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a  not one-row */..
2ed40 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20      /* Mark off 
2ed50 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20  any other ORDER 
2ed60 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65  BY terms that re
2ed70 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f  ference pLoop */
2ed80 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72  .    if( isOrder
2ed90 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2eda0 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d    orderDistinctM
2edb0 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61  ask |= pLoop->ma
2edc0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f  skSelf;.      fo
2edd0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
2ede0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
2edf0 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20   Expr *p;.      
2ee00 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
2ee10 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
2ee20 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d  nue;.        p =
2ee30 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2ee40 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
2ee50 66 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61  f( (exprTableUsa
2ee60 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  ge(&pWInfo->sMas
2ee70 6b 53 65 74 2c 20 70 29 26 7e 6f 72 64 65 72 44  kSet, p)&~orderD
2ee80 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20  istinctMask)==0 
2ee90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53  ){.          obS
2eea0 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
2eeb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2eec0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a    }.    }.  } /*
2eed0 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76   End the loop ov
2eee0 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  er all WhereLoop
2eef0 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73  s from outer-mos
2ef00 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d  t down to inner-
2ef10 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62  most */.  if( ob
2ef20 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65  Sat==obDone ) re
2ef30 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 69  turn 1;.  if( !i
2ef40 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
2ef50 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
2ef60 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65  urn -1;.}..#ifde
2ef70 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2ef80 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75  BLED./* For debu
2ef90 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20  gging use only: 
2efa0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2efb0 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e  char *wherePathN
2efc0 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70  ame(WherePath *p
2efd0 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c  Path, int nLoop,
2efe0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
2eff0 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  t){.  static cha
2f000 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69  r zName[65];.  i
2f010 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
2f020 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20   i<nLoop; i++){ 
2f030 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68  zName[i] = pPath
2f040 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b  ->aLoop[i]->cId;
2f050 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29   }.  if( pLast )
2f060 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c   zName[i++] = pL
2f070 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d  ast->cId;.  zNam
2f080 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  e[i] = 0;.  retu
2f090 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
2f0a0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  if.../*.** Given
2f0b0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
2f0c0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 6f  reLoop objects o
2f0d0 6e 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  n pWInfo->pLoops
2f0e0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
2f0f0 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  * attempts to fi
2f100 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
2f110 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73  st path that vis
2f120 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f  its each WhereLo
2f130 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69  op.** once.  Thi
2f140 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c  s path is then l
2f150 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70  oaded into the p
2f160 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f  WInfo->a[].pWLoo
2f170 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  p fields..**.** 
2f180 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2f190 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
2f1a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
2f1b0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2f1c0 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
2f1d0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
2f1e0 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
2f1f0 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
2f200 6e 66 6f 2c 20 57 68 65 72 65 43 6f 73 74 20 6e  nfo, WhereCost n
2f210 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d  RowEst){.  int m
2f220 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20  xChoice;        
2f230 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2f240 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74  number of simult
2f250 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61  aneous paths tra
2f260 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  cked */.  int nL
2f270 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
2f280 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2f290 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f   terms in the jo
2f2a0 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  in */.  Parse *p
2f2b0 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
2f2c0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
2f2d0 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
2f2e0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2f2f0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2f300 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2f310 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
2f320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f330 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76   Loop counter ov
2f340 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
2f350 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e  the join */.  in
2f360 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20  t ii, jj;       
2f370 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2f380 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
2f390 65 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20  ereCost rCost;  
2f3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2f3b0 73 74 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a  st of a path */.
2f3c0 20 20 57 68 65 72 65 43 6f 73 74 20 6d 78 43 6f    WhereCost mxCo
2f3d0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
2f3e0 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f  * Maximum cost o
2f3f0 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73  f a set of paths
2f400 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
2f410 72 53 6f 72 74 43 6f 73 74 3b 20 20 20 20 20 20  rSortCost;      
2f420 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20 64 6f     /* Cost to do
2f430 20 61 20 73 6f 72 74 20 2a 2f 0a 20 20 69 6e 74   a sort */.  int
2f440 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20   nTo, nFrom;    
2f450 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f460 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65   of valid entrie
2f470 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61  s in aTo[] and a
2f480 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  From[] */.  Wher
2f490 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20  ePath *aFrom;   
2f4a0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72        /* All nFr
2f4b0 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20  om paths at the 
2f4c0 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a  previous level *
2f4d0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
2f4e0 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
2f4f0 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61   The nTo best pa
2f500 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65  ths at the curre
2f510 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  nt level */.  Wh
2f520 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20  erePath *pFrom; 
2f530 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
2f540 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d  ement of aFrom[]
2f550 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
2f560 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
2f570 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20  rePath *pTo;    
2f580 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
2f590 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68  ment of aTo[] th
2f5a0 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
2f5b0 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  g on */.  WhereL
2f5c0 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20  oop *pWLoop;    
2f5d0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
2f5e0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
2f5f0 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  cts */.  WhereLo
2f600 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20  op **pX;        
2f610 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69     /* Used to di
2f620 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65  vy up the pSpace
2f630 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61   memory */.  cha
2f640 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  r *pSpace;      
2f650 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
2f660 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ary memory used 
2f670 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
2f680 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
2f690 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
2f6a0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2f6b0 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e  ;.  nLoop = pWIn
2f6c0 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a  fo->nLevel;.  /*
2f6d0 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d   TUNING: For sim
2f6e0 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c  ple queries, onl
2f6f0 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68 20  y the best path 
2f700 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a  is tracked..  **
2f710 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73   For 2-way joins
2f720 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61 74  , the 5 best pat
2f730 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e  hs are followed.
2f740 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20  .  ** For joins 
2f750 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62  of 3 or more tab
2f760 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31  les, track the 1
2f770 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a  0 best paths */.
2f780 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c    mxChoice = (nL
2f790 6f 6f 70 3d 3d 31 29 20 3f 20 31 20 3a 20 28 6e  oop==1) ? 1 : (n
2f7a0 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30  Loop==2 ? 5 : 10
2f7b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  );.  assert( nLo
2f7c0 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62  op<=pWInfo->pTab
2f7d0 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
2f7e0 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32  WHERETRACE(0x002
2f7f0 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73  , ("---- begin s
2f800 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f  olver\n"));..  /
2f810 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2f820 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20  nitialize space 
2f830 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46 72 6f  for aTo and aFro
2f840 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73 69 7a  m */.  ii = (siz
2f850 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b 73  eof(WherePath)+s
2f860 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a  izeof(WhereLoop*
2f870 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63  )*nLoop)*mxChoic
2f880 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20 3d 20  e*2;.  pSpace = 
2f890 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
2f8a0 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20 69 66  aw(db, ii);.  if
2f8b0 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  ( pSpace==0 ) re
2f8c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2f8d0 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72  M;.  aTo = (Wher
2f8e0 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20  ePath*)pSpace;. 
2f8f0 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43   aFrom = aTo+mxC
2f900 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28  hoice;.  memset(
2f910 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  aFrom, 0, sizeof
2f920 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70  (aFrom[0]));.  p
2f930 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a  X = (WhereLoop**
2f940 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65  )(aFrom+mxChoice
2f950 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68  );.  for(ii=mxCh
2f960 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54  oice*2, pFrom=aT
2f970 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70  o; ii>0; ii--, p
2f980 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c  From++, pX += nL
2f990 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  oop){.    pFrom-
2f9a0 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d  >aLoop = pX;.  }
2f9b0 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20  ..  /* Seed the 
2f9c0 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69  search with a si
2f9d0 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63  ngle WherePath c
2f9e0 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57  ontaining zero W
2f9f0 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a  hereLoops..  **.
2fa00 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20    ** TUNING: Do 
2fa10 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62  not let the numb
2fa20 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
2fa30 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20 20 49   go above 25.  I
2fa40 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20  f the cost.  ** 
2fa50 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20  of computing an 
2fa60 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
2fa70 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b  is not paid back
2fa80 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
2fa90 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73 2c 20  t 25.  ** rows, 
2faa0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20  then do not use 
2fab0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
2fac0 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b  dex. */.  aFrom[
2fad0 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50  0].nRow = MIN(pP
2fae0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
2faf0 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74 28 20  , 46);  assert( 
2fb00 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35  46==whereCost(25
2fb10 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31  ) );.  nFrom = 1
2fb20 3b 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75  ;..  /* Precompu
2fb30 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  te the cost of s
2fb40 6f 72 74 69 6e 67 20 74 68 65 20 66 69 6e 61 6c  orting the final
2fb50 20 72 65 73 75 6c 74 20 73 65 74 2c 20 69 66 20   result set, if 
2fb60 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20  the caller.  ** 
2fb70 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
2fb80 65 67 69 6e 28 29 20 77 61 73 20 63 6f 6e 63 65  egin() was conce
2fb90 72 6e 65 64 20 61 62 6f 75 74 20 73 6f 72 74 69  rned about sorti
2fba0 6e 67 20 2a 2f 0a 20 20 72 53 6f 72 74 43 6f 73  ng */.  rSortCos
2fbb0 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 49  t = 0;.  if( pWI
2fbc0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
2fbd0 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29   || nRowEst==0 )
2fbe0 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69  {.    aFrom[0].i
2fbf0 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
2fc00 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
2fc10 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d  /* TUNING: Estim
2fc20 61 74 65 64 20 63 6f 73 74 20 6f 66 20 73 6f 72  ated cost of sor
2fc30 74 69 6e 67 20 69 73 20 4e 2a 6c 6f 67 32 28 4e  ting is N*log2(N
2fc40 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  ) where N is the
2fc50 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  .    ** number o
2fc60 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 20 2a  f output rows. *
2fc70 2f 0a 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20  /.    rSortCost 
2fc80 3d 20 6e 52 6f 77 45 73 74 20 2b 20 65 73 74 4c  = nRowEst + estL
2fc90 6f 67 28 6e 52 6f 77 45 73 74 29 3b 0a 20 20 20  og(nRowEst);.   
2fca0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30   WHERETRACE(0x00
2fcb0 32 2c 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f  2,("---- sort co
2fcc0 73 74 3d 25 2d 33 64 5c 6e 22 2c 20 72 53 6f 72  st=%-3d\n", rSor
2fcd0 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20  tCost));.  }..  
2fce0 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65  /* Compute succe
2fcf0 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57  ssively longer W
2fd00 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20  herePaths using 
2fd10 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e  the previous gen
2fd20 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20  eration.  ** of 
2fd30 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68  WherePaths as th
2fd40 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20  e basis for the 
2fd50 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63  next.  Keep trac
2fd60 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  k of the mxChoic
2fd70 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68  e.  ** best path
2fd80 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61  s at each genera
2fd90 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  tion */.  for(iL
2fda0 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
2fdb0 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
2fdc0 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66    nTo = 0;.    f
2fdd0 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61  or(ii=0, pFrom=a
2fde0 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  From; ii<nFrom; 
2fdf0 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a  ii++, pFrom++){.
2fe00 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70        for(pWLoop
2fe10 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b  =pWInfo->pLoops;
2fe20 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d   pWLoop; pWLoop=
2fe30 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f  pWLoop->pNextLoo
2fe40 70 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  p){.        Bitm
2fe50 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20 20 20  ask maskNew;.   
2fe60 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
2fe70 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mask = 0;.      
2fe80 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 56 61    u8 isOrderedVa
2fe90 6c 69 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  lid = pFrom->isO
2fea0 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20 20 20  rderedValid;.   
2feb0 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72 65       u8 isOrdere
2fec0 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  d = pFrom->isOrd
2fed0 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  ered;.        if
2fee0 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65  ( (pWLoop->prere
2fef0 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b  q & ~pFrom->mask
2ff00 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69  Loop)!=0 ) conti
2ff10 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
2ff20 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   (pWLoop->maskSe
2ff30 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  lf & pFrom->mask
2ff40 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69  Loop)!=0 ) conti
2ff50 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  nue;.        /* 
2ff60 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70  At this point, p
2ff70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69  WLoop is a candi
2ff80 64 61 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e  date to be the n
2ff90 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20  ext loop. .     
2ffa0 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74     ** Compute it
2ffb0 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20  s cost */.      
2ffc0 20 20 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43    rCost = whereC
2ffd0 6f 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72  ostAdd(pWLoop->r
2ffe0 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52  Setup,pWLoop->rR
2fff0 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  un + pFrom->nRow
30000 29 3b 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74  );.        rCost
30010 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
30020 72 43 6f 73 74 2c 20 70 46 72 6f 6d 2d 3e 72 43  rCost, pFrom->rC
30030 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 61  ost);.        ma
30040 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d  skNew = pFrom->m
30050 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
30060 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
30070 20 20 20 20 69 66 28 20 21 69 73 4f 72 64 65 72      if( !isOrder
30080 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  edValid ){.     
30090 20 20 20 20 20 73 77 69 74 63 68 28 20 77 68 65       switch( whe
300a0 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
300b0 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20  rderBy(pWInfo,. 
300c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300d0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
300e0 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70  rderBy, pFrom, p
300f0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
30100 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
30110 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c            iLoop,
30120 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73   pWLoop, &revMas
30130 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
30140 20 20 63 61 73 65 20 31 3a 20 20 2f 2a 20 59 65    case 1:  /* Ye
30150 73 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  s.  pFrom+pWLoop
30160 20 64 6f 65 73 20 73 61 74 69 73 66 79 20 74 68   does satisfy th
30170 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
30180 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
30190 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 31     isOrdered = 1
301a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
301b0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
301c0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
301d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
301e0 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 2f 2a       case 0:  /*
301f0 20 4e 6f 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f   No.  pFrom+pWLo
30200 6f 70 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  op will require 
30210 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20  a separate sort 
30220 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
30230 20 69 73 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a   isOrdered = 0;.
30240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
30250 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31  OrderedValid = 1
30260 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
30270 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73  rCost = whereCos
30280 74 41 64 64 28 72 43 6f 73 74 2c 20 72 53 6f 72  tAdd(rCost, rSor
30290 74 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  tCost);.        
302a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
302b0 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
302c0 3a 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c  : /* Cannot tell
302d0 20 79 65 74 2e 20 20 54 72 79 20 61 67 61 69 6e   yet.  Try again
302e0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 74 65   on the next ite
302f0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
30300 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
30310 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30330 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46      revMask = pF
30340 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
30350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30360 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
30370 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64  if pWLoop should
30380 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
30390 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 20 73   mxChoice best s
303a0 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
303b0 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61   for(jj=0, pTo=a
303c0 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b  To; jj<nTo; jj++
303d0 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
303e0 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73      if( pTo->mas
303f0 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 20 26  kLoop==maskNew &
30400 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  & pTo->isOrdered
30410 56 61 6c 69 64 3d 3d 69 73 4f 72 64 65 72 65 64  Valid==isOrdered
30420 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Valid ){.       
30430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
30440 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20  j==nTo-1 );.    
30450 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
30460 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30470 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
30480 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20   jj>=nTo ){.    
30490 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
304a0 78 43 68 6f 69 63 65 20 26 26 20 72 43 6f 73 74  xChoice && rCost
304b0 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23 69 66 64  >=mxCost ){.#ifd
304c0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
304d0 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20  ABLED.          
304e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
304f0 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
30500 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
30510 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
30520 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
30530 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
30540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30550 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
30560 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
30570 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20  WLoop), rCost,. 
30580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30590 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
305a0 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
305b0 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
305c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
305d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
305e0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
305f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30600 20 20 20 2f 2a 20 41 64 64 20 61 20 6e 65 77 20     /* Add a new 
30610 50 61 74 68 20 74 6f 20 74 68 65 20 61 54 6f 5b  Path to the aTo[
30620 5d 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 20  ] set */.       
30630 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f     if( nTo<mxCho
30640 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
30650 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74     /* Increase t
30660 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
30670 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f  To set by one */
30680 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
30690 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  = nTo++;.       
306a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
306b0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74        /* New pat
306c0 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70  h replaces the p
306d0 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65  rior worst to ke
306e0 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d  ep count below m
306f0 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20  xChoice */.     
30700 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 6e 54         for(jj=nT
30710 6f 2d 31 3b 20 61 54 6f 5b 6a 6a 5d 2e 72 43 6f  o-1; aTo[jj].rCo
30720 73 74 3c 6d 78 43 6f 73 74 3b 20 6a 6a 2d 2d 29  st<mxCost; jj--)
30730 7b 20 61 73 73 65 72 74 28 6a 6a 3e 30 29 3b 20  { assert(jj>0); 
30740 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
30750 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61          pTo = &a
30760 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57  To[jj];.#ifdef W
30770 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
30780 44 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  D.          if( 
30790 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
307a0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
307b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
307c0 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20  gPrintf("New    
307d0 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64  %s cost=%-3d ord
307e0 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
307f0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
30800 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
30810 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
30820 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cost,.          
30830 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
30840 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65  alid ? (isOrdere
30850 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
30860 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
30870 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
30880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30890 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73     if( pTo->rCos
308a0 74 3c 3d 72 43 6f 73 74 20 29 7b 0a 23 69 66 64  t<=rCost ){.#ifd
308b0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
308c0 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20 20  ABLED.          
308d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
308e0 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
308f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
30900 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
30910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30920 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f     "Skip   %s co
30930 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63  st=%-3d order=%c
30940 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
30950 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
30960 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
30970 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
30980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30990 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
309a0 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f  d ? (isOrdered ?
309b0 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
309c0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
309d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
309e0 69 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63  intf("   vs %s c
309f0 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  ost=%-3d order=%
30a00 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
30a10 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
30a20 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
30a30 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
30a40 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
30a50 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
30a60 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f  eredValid ? (pTo
30a70 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59  ->isOrdered ? 'Y
30a80 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
30a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
30aa0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
30ab0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
30ac0 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b  >rCost==rCost );
30ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
30ae0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
30af0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
30b00 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
30b10 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20  t==rCost+1 );.  
30b20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77          /* A new
30b30 20 61 6e 64 20 62 65 74 74 65 72 20 73 63 6f 72   and better scor
30b40 65 20 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73  e for a previous
30b50 6c 79 20 63 72 65 61 74 65 64 20 65 71 75 69 76  ly created equiv
30b60 61 6c 65 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69  alent path */.#i
30b70 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
30b80 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20  ENABLED.        
30b90 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
30ba0 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
30bb0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30bc0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
30bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
30be0 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25  Update %s cost=%
30bf0 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  -3d order=%c",. 
30c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
30c10 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
30c20 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
30c30 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20  p), rCost,.     
30c40 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
30c50 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f  eredValid ? (isO
30c60 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
30c70 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
30c80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
30c90 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61  ebugPrintf("  wa
30ca0 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f  s %s cost=%-3d o
30cb0 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
30cc0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
30cd0 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69  ePathName(pTo, i
30ce0 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d  Loop+1, 0), pTo-
30cf0 3e 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20  >rCost,.        
30d00 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f          pTo->isO
30d10 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70  rderedValid ? (p
30d20 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20  To->isOrdered ? 
30d30 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
30d40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
30d50 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a  endif.        }.
30d60 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f          /* pWLoo
30d70 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20 20  p is a winner.  
30d80 41 64 64 20 69 74 20 74 6f 20 74 68 65 20 73 65  Add it to the se
30d90 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61 72  t of best so far
30da0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 2d   */.        pTo-
30db0 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f  >maskLoop = pFro
30dc0 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57  m->maskLoop | pW
30dd0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
30de0 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65 76          pTo->rev
30df0 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a  Loop = revMask;.
30e00 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f          pTo->nRo
30e10 77 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20  w = pFrom->nRow 
30e20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a  + pWLoop->nOut;.
30e30 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f          pTo->rCo
30e40 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20  st = rCost;.    
30e50 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
30e60 65 64 56 61 6c 69 64 20 3d 20 69 73 4f 72 64 65  edValid = isOrde
30e70 72 65 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20  redValid;.      
30e80 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
30e90 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20 20   = isOrdered;.  
30ea0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f        memcpy(pTo
30eb0 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e  ->aLoop, pFrom->
30ec0 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68  aLoop, sizeof(Wh
30ed0 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29  ereLoop*)*iLoop)
30ee0 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 61  ;.        pTo->a
30ef0 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57  Loop[iLoop] = pW
30f00 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  Loop;.        if
30f10 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20  ( nTo>=mxChoice 
30f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43  ){.          mxC
30f30 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f  ost = aTo[0].rCo
30f40 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
30f50 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f  r(jj=1, pTo=&aTo
30f60 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65  [1]; jj<mxChoice
30f70 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
30f80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30f90 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73  pTo->rCost>mxCos
30fa0 74 20 29 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f  t ) mxCost = pTo
30fb0 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ->rCost;.       
30fc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
30fd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
30fe0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
30ff0 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
31000 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
31010 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71  e>=2 ){.      sq
31020 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
31030 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75  ("---- after rou
31040 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69  nd %d ----\n", i
31050 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Loop);.      for
31060 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20  (ii=0, pTo=aTo; 
31070 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54  ii<nTo; ii++, pT
31080 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  o++){.        sq
31090 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
310a0 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20  (" %s cost=%-3d 
310b0 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d  nrow=%-3d order=
310c0 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
310d0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
310e0 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
310f0 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
31100 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
31110 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
31120 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73  Valid ? (pTo->is
31130 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
31140 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
31150 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73       if( pTo->is
31160 4f 72 64 65 72 65 64 56 61 6c 69 64 20 26 26 20  OrderedValid && 
31170 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 29  pTo->isOrdered )
31180 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
31190 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
311a0 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20   rev=0x%llx\n", 
311b0 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20  pTo->revLoop);. 
311c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
311d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
311e0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
311f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31200 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
31210 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68  ..    /* Swap th
31220 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d  e roles of aFrom
31230 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65   and aTo for the
31240 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e   next generation
31250 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20   */.    pFrom = 
31260 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61  aTo;.    aTo = a
31270 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20  From;.    aFrom 
31280 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72  = pFrom;.    nFr
31290 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20  om = nTo;.  }.. 
312a0 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b   if( nFrom==0 ){
312b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
312c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
312d0 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22   query solution"
312e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
312f0 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
31300 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
31310 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
31320 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20   .  /* Find the 
31330 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
31340 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65  .  pFrom will be
31350 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
31360 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20  o that path */. 
31370 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a   pFrom = aFrom;.
31380 20 20 61 73 73 65 72 74 28 20 6e 46 72 6f 6d 3d    assert( nFrom=
31390 3d 31 20 29 3b 0a 23 69 66 20 30 20 2f 2a 20 54  =1 );.#if 0 /* T
313a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
313b0 6e 65 65 64 65 64 20 69 66 20 6e 46 72 6f 6d 20  needed if nFrom 
313c0 69 73 20 65 76 65 72 20 6d 6f 72 65 20 74 68 61  is ever more tha
313d0 6e 20 31 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  n 1 */.  for(ii=
313e0 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  1; ii<nFrom; ii+
313f0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  +){.    if( pFro
31400 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69  m->rCost>aFrom[i
31410 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d  i].rCost ) pFrom
31420 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20   = &aFrom[ii];. 
31430 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65   }.#endif.  asse
31440 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
31450 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f  el==nLoop );.  /
31460 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73  * Load the lowes
31470 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f  t cost path into
31480 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72   pWInfo */.  for
31490 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
314a0 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
314b0 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20  .    WhereLevel 
314c0 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f  *pLevel = pWInfo
314d0 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20  ->a + iLoop;.   
314e0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20   pLevel->pWLoop 
314f0 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  = pWLoop = pFrom
31500 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a  ->aLoop[iLoop];.
31510 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
31520 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62  m = pWLoop->iTab
31530 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54  ;.    pLevel->iT
31540 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e  abCur = pWInfo->
31550 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
31560 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73  el->iFrom].iCurs
31570 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  or;.  }.  if( (p
31580 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
31590 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
315a0 43 54 42 59 29 3d 3d 30 20 0a 20 20 20 26 26 20  CTBY)==0 .   && 
315b0 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63  pWInfo->pDistinc
315c0 74 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a  t.   && nRowEst.
315d0 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b    ){.    Bitmask
315e0 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e   notUsed;.    in
315f0 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
31600 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
31610 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
31620 3e 70 44 69 73 74 69 6e 63 74 2c 20 70 46 72 6f  >pDistinct, pFro
31630 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
31640 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e      WHERE_DISTIN
31650 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70  CTBY, nLoop-1, p
31660 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f  From->aLoop[nLoo
31670 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b  p-1], &notUsed);
31680 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 31 20 29  .    if( rc==1 )
31690 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
316a0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
316b0 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 7d  NCT_ORDERED;.  }
316c0 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73  .  if( pFrom->is
316d0 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 69  Ordered ){.    i
316e0 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
316f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
31700 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20  STINCTBY ){.    
31710 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
31720 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
31730 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20  INCT_ORDERED;.  
31740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
31750 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20  WInfo->bOBSat = 
31760 31 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  1;.      pWInfo-
31770 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d  >revMask = pFrom
31780 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d  ->revLoop;.    }
31790 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e  .  }.  pWInfo->n
317a0 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e  RowOut = pFrom->
317b0 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  nRow;..  /* Free
317c0 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   temporary memor
317d0 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63  y and return suc
317e0 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cess */.  sqlite
317f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61  3DbFree(db, pSpa
31800 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ce);.  return SQ
31810 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
31820 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75  * Most queries u
31830 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  se only a single
31840 20 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65   table (they are
31850 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20   not joins) and 
31860 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d  have.** simple =
31870 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67  = constraints ag
31880 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69  ainst indexed fi
31890 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74  elds.  This rout
318a0 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ine attempts.** 
318b0 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69  to plan those si
318c0 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67  mple cases using
318d0 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d   much less cerem
318e0 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20  ony than the.** 
318f0 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
31900 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61  query planner, a
31910 6e 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64  nd thereby yield
31920 20 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f   faster sqlite3_
31930 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d  prepare().** tim
31940 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  es for the commo
31950 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  n case..**.** Re
31960 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e  turn non-zero on
31970 20 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69   success, if thi
31980 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68  s query can be h
31990 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a  andled by this.*
319a0 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72  * no-frills quer
319b0 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75  y planner.  Retu
319c0 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20  rn zero if this 
319d0 71 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20  query needs the 
319e0 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  .** general-purp
319f0 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  ose query planne
31a00 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
31a10 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57   whereShortCut(W
31a20 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
31a30 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68  *pBuilder){.  Wh
31a40 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
31a50 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
31a60 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
31a70 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
31a80 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  C;.  WhereTerm *
31a90 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f  pTerm;.  WhereLo
31aa0 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74  op *pLoop;.  int
31ab0 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a   iCur;.  int j;.
31ac0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
31ad0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
31ae0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
31af0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
31b00 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
31b10 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46  lFlags & WHERE_F
31b20 4f 52 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74  ORCE_TABLE ) ret
31b30 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
31b40 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
31b50 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20  t->nSrc>=1 );.  
31b60 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
31b70 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70  pTabList->a;.  p
31b80 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
31b90 62 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  b;.  if( IsVirtu
31ba0 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
31bb0 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  n 0;.  if( pItem
31bc0 2d 3e 7a 49 6e 64 65 78 20 29 20 72 65 74 75 72  ->zIndex ) retur
31bd0 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49  n 0;.  iCur = pI
31be0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
31bf0 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
31c00 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42  WC;.  pLoop = pB
31c10 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
31c20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
31c30 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 66 69   0;.  pTerm = fi
31c40 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
31c50 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 2c 20  , -1, 0, WO_EQ, 
31c60 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  0);.  if( pTerm 
31c70 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  ){.    pLoop->ws
31c80 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
31c90 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50  LUMN_EQ|WHERE_IP
31ca0 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  K|WHERE_ONEROW;.
31cb0 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
31cc0 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
31cd0 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20    pLoop->nLTerm 
31ce0 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  = 1;.    pLoop->
31cf0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
31d00 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  .    /* TUNING: 
31d10 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20  Cost of a rowid 
31d20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a  lookup is 10 */.
31d30 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
31d40 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 77 68  = 33;  /* 33==wh
31d50 65 72 65 43 6f 73 74 28 31 30 29 20 2a 2f 0a 20  ereCost(10) */. 
31d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
31d70 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
31d80 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
31d90 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
31da0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
31db0 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63  ror==OE_None ) c
31dc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
31dd0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
31de0 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
31df0 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66         pTerm = f
31e00 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
31e10 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  r, pIdx->aiColum
31e20 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20  n[j], 0, WO_EQ, 
31e30 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
31e40 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
31e50 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 77 68 65  eak;.        whe
31e60 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 57 49  reLoopResize(pWI
31e70 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nfo->pParse->db,
31e80 20 70 4c 6f 6f 70 2c 20 6a 29 3b 0a 20 20 20 20   pLoop, j);.    
31e90 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
31ea0 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[j] = pTerm;.  
31eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
31ec0 6a 21 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  j!=pIdx->nColumn
31ed0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
31ee0 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
31ef0 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
31f00 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57  _EQ|WHERE_ONEROW
31f10 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a  |WHERE_INDEXED;.
31f20 20 20 20 20 20 20 69 66 28 20 28 70 49 74 65 6d        if( (pItem
31f30 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c  ->colUsed & ~col
31f40 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78  umnsInIndex(pIdx
31f50 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
31f60 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
31f70 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  |= WHERE_IDX_ONL
31f80 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
31f90 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d   pLoop->nLTerm =
31fa0 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   j;.      pLoop-
31fb0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a  >u.btree.nEq = j
31fc0 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
31fd0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
31fe0 70 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54  pIdx;.      /* T
31ff0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
32000 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f   unique index lo
32010 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20  okup is 15 */.  
32020 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
32030 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 77 68  = 39;  /* 39==wh
32040 65 72 65 43 6f 73 74 28 31 35 29 20 2a 2f 0a 20  ereCost(15) */. 
32050 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
32060 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
32070 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20  p->wsFlags ){.  
32080 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
32090 28 57 68 65 72 65 43 6f 73 74 29 31 3b 0a 20 20  (WhereCost)1;.  
320a0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
320b0 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20  WLoop = pLoop;. 
320c0 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65     pLoop->maskSe
320d0 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57  lf = getMask(&pW
320e0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
320f0 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66  iCur);.    pWInf
32100 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20  o->a[0].iTabCur 
32110 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e  = iCur;.    pWIn
32120 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b  fo->nRowOut = 1;
32130 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
32140 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e  >pOrderBy ) pWIn
32150 66 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 20 31 3b  fo->bOBSat =  1;
32160 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
32170 3e 70 44 69 73 74 69 6e 63 74 20 29 20 70 57 49  >pDistinct ) pWI
32180 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
32190 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
321a0 55 4e 49 51 55 45 3b 0a 23 69 66 64 65 66 20 53  UNIQUE;.#ifdef S
321b0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
321c0 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27  pLoop->cId = '0'
321d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
321e0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
321f0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
32200 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67  Generate the beg
32210 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f  inning of the lo
32220 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52  op used for WHER
32230 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
32240 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ing..** The retu
32250 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f  rn value is a po
32260 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71  inter to an opaq
32270 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ue structure tha
32280 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e  t contains.** in
32290 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64  formation needed
322a0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
322b0 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20  e loop.  Later, 
322c0 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
322d0 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e  ine.** should in
322e0 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72  voke sqlite3Wher
322f0 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20  eEnd() with the 
32300 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
32310 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
32320 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
32330 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20  plete the WHERE 
32340 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
32350 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
32360 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
32370 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
32380 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
32390 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20  e basic idea is 
323a0 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c  to do a nested l
323b0 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f  oop, one loop fo
323c0 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a  r each table in.
323d0 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
323e0 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20  se of a select. 
323f0 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44   (INSERT and UPD
32400 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ATE statements a
32410 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  re the.** same a
32420 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20  s a SELECT with 
32430 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
32440 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
32450 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a  clause.)  For.**
32460 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
32470 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a   SQL is this:.**
32480 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54  .**       SELECT
32490 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
324a0 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a  t3 WHERE ...;.**
324b0 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64  .** Then the cod
324c0 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63  e generated is c
324d0 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65  onceptually like
324e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
324f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61  **.**      forea
32500 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
32510 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
32520 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
32530 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
32540 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20  2 in t2 do      
32550 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
32560 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20  ereBegin().**   
32570 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
32580 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f  ow3 in t3 do   /
32590 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e  .**            .
325a0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65  ...**          e
325b0 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
325c0 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
325d0 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
325e0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
325f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32600 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
32610 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20  ereEnd().**     
32620 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
32630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
32640 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
32650 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e  he loops might n
32660 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20  ot be nested in 
32670 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
32680 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61  ch they.** appea
32690 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
326a0 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72  ause if a differ
326b0 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74  ent order is bet
326c0 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65  ter able to make
326d0 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63  .** use of indic
326e0 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  es.  Note also t
326f0 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20  hat when the IN 
32700 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73  operator appears
32710 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
32720 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68   clause, it migh
32730 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69  t result in addi
32740 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f  tional nested lo
32750 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e  ops for.** scann
32760 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
32770 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69  values on the ri
32780 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
32790 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54   the IN..**.** T
327a0 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63  here are Btree c
327b0 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
327c0 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c  d with each tabl
327d0 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73  e.  t1 uses curs
327e0 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61  or.** number pTa
327f0 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
32800 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68  sor.  t2 uses th
32810 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73  e cursor pTabLis
32820 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e  t->a[1].iCursor.
32830 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  .** And so forth
32840 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
32850 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
32860 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42  o open those VDB
32870 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64  E cursors.** and
32880 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
32890 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  () generates the
328a0 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74   code to close t
328b0 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  hem..**.** The c
328c0 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
328d0 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e  WhereBegin() gen
328e0 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68  erates leaves th
328f0 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a  e cursors named.
32900 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70  ** in pTabList p
32910 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72  ointing at their
32920 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
32930 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d  ries.  The [...]
32940 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65   code.** can use
32950 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f   OP_Column and O
32960 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20  P_Rowid opcodes 
32970 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73  on these cursors
32980 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64   to extract.** d
32990 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72  ata from the var
329a0 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74  ious tables of t
329b0 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  he loop..**.** I
329c0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
329d0 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  se is empty, the
329e0 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d   foreach loops m
329f0 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68  ust each scan th
32a00 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61  eir.** entire ta
32a10 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68  bles.  Thus a th
32a20 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20  ree-way join is 
32a30 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74  an O(N^3) operat
32a40 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20  ion.  But if.** 
32a50 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20  the tables have 
32a60 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72  indices and ther
32a70 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74  e are terms in t
32a80 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
32a90 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f  that.** refer to
32aa0 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20   those indices, 
32ab0 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65  a complete table
32ac0 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f   scan can be avo
32ad0 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ided and the.** 
32ae0 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75  code will run mu
32af0 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74  ch faster.  Most
32b00 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   of the work of 
32b10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
32b20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73  checking.** to s
32b30 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
32b40 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e  indices that can
32b50 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65   be used to spee
32b60 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  d up the loop..*
32b70 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68  *.** Terms of th
32b80 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
32b90 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  re also used to 
32ba0 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73  limit which rows
32bb0 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b   actually.** mak
32bc0 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e  e it to the "...
32bd0 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  " in the middle 
32be0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66  of the loop.  Af
32bf0 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63  ter each "foreac
32c00 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20  h",.** terms of 
32c10 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
32c20 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74   that use only t
32c30 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f  erms in that loo
32c40 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c  p and outer.** l
32c50 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74  oops are evaluat
32c60 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20  ed and if false 
32c70 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61  a jump is made a
32c80 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71  round all subseq
32c90 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f  uent.** inner lo
32ca0 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74  ops (or around t
32cb0 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20  he "..." if the 
32cc0 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68  test occurs with
32cd0 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a  in the inner-.**
32ce0 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a   most loop).**.*
32cf0 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a  * OUTER JOINS.**
32d00 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69  .** An outer joi
32d10 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61  n of tables t1 a
32d20 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74  nd t2 is concept
32d30 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f  ally coded as fo
32d40 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
32d50 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
32d60 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c  t1 do.**      fl
32d70 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66  ag = 0.**      f
32d80 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
32d90 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  2 do.**        s
32da0 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20  tart:.**        
32db0 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
32dc0 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20    flag = 1.**   
32dd0 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69     end.**      i
32de0 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a  f flag==0 then.*
32df0 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68  *        move th
32e00 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f  e row2 cursor to
32e10 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20   a null row.**  
32e20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74        goto start
32e30 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20  .**      fi.**  
32e40 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45    end.**.** ORDE
32e50 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43  R BY CLAUSE PROC
32e60 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72  ESSING.**.** pOr
32e70 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74  derBy is a point
32e80 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  er to the ORDER 
32e90 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  BY clause of a S
32ea0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
32eb0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
32ec0 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
32ed0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
32ee0 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
32ef0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
32f00 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
32f10 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
32f20 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f  atement, then pO
32f30 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
32f40 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
32f50 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
32f60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
32f70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
32f80 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
32f90 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
32fa0 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c  bList,    /* A l
32fb0 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
32fc0 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
32fd0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
32fe0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
32ff0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
33000 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
33010 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20  rderBy,   /* An 
33020 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
33030 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
33040 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
33050 74 2c 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63  t,  /* The selec
33060 74 2d 6c 69 73 74 20 66 6f 72 20 44 49 53 54 49  t-list for DISTI
33070 4e 43 54 20 71 75 65 72 69 65 73 20 2d 20 6f 72  NCT queries - or
33080 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20 77   NULL */.  u16 w
33090 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
330a0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
330b0 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66  HERE_* flags def
330c0 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
330d0 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  t.h */.  int iId
330e0 78 43 75 72 20 20 20 20 20 20 20 20 20 20 20 2f  xCur           /
330f0 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 54 41  * If WHERE_ONETA
33100 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c  BLE_ONLY is set,
33110 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75   index cursor nu
33120 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mber */.){.  int
33130 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20   nByteWInfo;    
33140 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20          /* Num. 
33150 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
33160 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74  for WhereInfo st
33170 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ruct */.  int nT
33180 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
33190 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
331a0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54  f elements in pT
331b0 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
331c0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
331d0 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62         /* Will b
331e0 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
331f0 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
33200 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  unction */.  Vdb
33210 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
33220 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76  Vdbe;   /* The v
33230 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
33240 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d  engine */.  Bitm
33250 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20  ask notReady;   
33260 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
33270 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79  s that are not y
33280 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f  et positioned */
33290 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
332a0 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a  der sWLB;     /*
332b0 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62   The WhereLoop b
332c0 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72  uilder */.  Wher
332d0 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
332e0 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78  et;    /* The ex
332f0 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
33300 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
33310 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20  l *pLevel;      
33320 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65    /* A single le
33330 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61  vel in pWInfo->a
33340 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  [] */.  int ii; 
33350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33360 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
33370 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
33380 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
33390 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
333a0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
333b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
333c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
333d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20  urn code */...  
333e0 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74  /* Variable init
333f0 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
33400 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c  memset(&sWLB, 0,
33410 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a   sizeof(sWLB));.
33420 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20    sWLB.pOrderBy 
33430 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = pOrderBy;..  /
33440 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
33450 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
33460 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
33470 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
33480 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
33490 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
334a0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
334b0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42  TabList->nSrc==B
334c0 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  MS );.  if( pTab
334d0 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29  List->nSrc>BMS )
334e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
334f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
33500 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73  t most %d tables
33510 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53   in a join", BMS
33520 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
33530 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
33540 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c  function normall
33550 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65  y generates a ne
33560 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c  sted loop for al
33570 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a  l tables in .  *
33580 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74  * pTabList.  But
33590 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e   if the WHERE_ON
335a0 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
335b0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65   is set, then we
335c0 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c   should.  ** onl
335d0 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  y generate code 
335e0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61  for the first ta
335f0 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20  ble in pTabList 
33600 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a  and assume that.
33610 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73    ** any cursors
33620 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
33630 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c   subsequent tabl
33640 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c  es are uninitial
33650 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61  ized..  */.  nTa
33660 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c  bList = (wctrlFl
33670 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
33680 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a  ABLE_ONLY) ? 1 :
33690 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b   pTabList->nSrc;
336a0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
336b0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
336c0 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
336d0 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
336e0 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a   become the.  **
336f0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41   return value. A
33700 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
33710 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  on is used to st
33720 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ore the WhereInf
33730 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74  o.  ** struct, t
33740 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57  he contents of W
33750 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68  hereInfo.a[], th
33760 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
33770 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64  ructure.  ** and
33780 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65   the WhereMaskSe
33790 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e  t structure. Sin
337a0 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  ce WhereClause c
337b0 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74  ontains an 8-byt
337c0 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79  e.  ** field (ty
337d0 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d  pe Bitmask) it m
337e0 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f  ust be aligned o
337f0 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  n an 8-byte boun
33800 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d  dary on.  ** som
33810 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e  e architectures.
33820 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44   Hence the ROUND
33830 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a  8() below..  */.
33840 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
33850 62 3b 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20  b;.  nByteWInfo 
33860 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
33870 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62  WhereInfo)+(nTab
33880 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57  List-1)*sizeof(W
33890 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70  hereLevel));.  p
338a0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  WInfo = sqlite3D
338b0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
338c0 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a  nByteWInfo + siz
338d0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
338e0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
338f0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
33900 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
33910 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57   pWInfo);.    pW
33920 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Info = 0;.    go
33930 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
33940 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
33950 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c  ->nLevel = nTabL
33960 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
33970 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
33980 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
33990 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
339a0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
339b0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
339c0 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63  pWInfo->pDistinc
339d0 74 20 3d 20 70 44 69 73 74 69 6e 63 74 3b 0a 20  t = pDistinct;. 
339e0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
339f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
33a00 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49  eLabel(v);.  pWI
33a10 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
33a20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20  = wctrlFlags;.  
33a30 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
33a40 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
33a50 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  ->nQueryLoop;.  
33a60 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e  pMaskSet = &pWIn
33a70 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20  fo->sMaskSet;.  
33a80 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57  sWLB.pWInfo = pW
33a90 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43  Info;.  sWLB.pWC
33aa0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
33ab0 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28  .  sWLB.pNew = (
33ac0 57 68 65 72 65 4c 6f 6f 70 2a 29 26 70 57 49 6e  WhereLoop*)&pWIn
33ad0 66 6f 2d 3e 61 5b 6e 54 61 62 4c 69 73 74 5d 3b  fo->a[nTabList];
33ae0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
33af0 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66  (sWLB.pNew);.#if
33b00 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
33b10 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49  .  sWLB.pNew->cI
33b20 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a  d = '*';.#endif.
33b30 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68  .  /* Disable th
33b40 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d  e DISTINCT optim
33b50 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  ization if SQLIT
33b60 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73  E_DistinctOpt is
33b70 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71   set via.  ** sq
33b80 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28  lite3_test_ctrl(
33b90 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
33ba0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e  OPTIMIZATIONS,..
33bb0 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .) */.  if( Opti
33bc0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
33bd0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74  (db, SQLITE_Dist
33be0 69 6e 63 74 4f 70 74 29 20 29 20 70 44 69 73 74  inctOpt) ) pDist
33bf0 69 6e 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  inct = 0;..  /* 
33c00 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
33c10 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
33c20 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
33c30 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
33c40 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
33c50 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
33c60 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
33c70 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
33c80 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b  skSet(pMaskSet);
33c90 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  .  whereClauseIn
33ca0 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
33cb0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69   pWInfo);.  sqli
33cc0 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
33cd0 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68  ants(pParse, pWh
33ce0 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  ere);.  whereSpl
33cf0 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  it(&pWInfo->sWC,
33d00 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
33d10 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35  ;   /* IMP: R-15
33d20 38 34 32 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20  842-53296 */.   
33d30 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63   .  /* Special c
33d40 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61  ase: a WHERE cla
33d50 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  use that is cons
33d60 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20  tant.  Evaluate 
33d70 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  the.  ** express
33d80 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a  ion and either j
33d90 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20  ump over all of 
33da0 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c  the code or fall
33db0 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66   thru..  */.  if
33dc0 28 20 70 57 68 65 72 65 20 26 26 20 28 6e 54 61  ( pWhere && (nTa
33dd0 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  bList==0 || sqli
33de0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
33df0 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29  tNotJoin(pWhere)
33e00 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
33e10 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
33e20 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e  se, pWhere, pWIn
33e30 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49  fo->iBreak, SQLI
33e40 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
33e50 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
33e60 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
33e70 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20  l case: No FROM 
33e80 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66  clause.  */.  if
33e90 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b  ( nTabList==0 ){
33ea0 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
33eb0 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53  y ) pWInfo->bOBS
33ec0 61 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  at = 1;.    if( 
33ed0 70 44 69 73 74 69 6e 63 74 20 29 20 70 57 49 6e  pDistinct ) pWIn
33ee0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
33ef0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
33f00 4e 49 51 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NIQUE;.  }..  /*
33f10 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
33f20 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
33f30 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
33f40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
33f50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
33f60 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73  assigning bitmas
33f70 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d  k values to FROM
33f80 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c   clause cursors,
33f90 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a   it must be.  **
33fa0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69   the case that i
33fb0 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
33fc0 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  sk for the N-th 
33fd0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
33fe0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62   then.  ** the b
33ff0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46  itmask for all F
34000 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
34010 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
34020 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20  the N-th term.  
34030 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41  ** is (X-1).   A
34040 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
34050 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  m the ON clause 
34060 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  of a LEFT JOIN c
34070 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20  an use.  ** its 
34080 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
34090 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69  able value to fi
340a0 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f  nd the bitmask o
340b0 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
340c0 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  e.  ** of the jo
340d0 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67  in.  Subtracting
340e0 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69   one from the ri
340f0 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73  ght table bitmas
34100 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62  k gives a.  ** b
34110 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74  itmask for all t
34120 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
34130 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  t of the join.  
34140 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
34150 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  ask.  ** for all
34160 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
34170 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
34180 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  in is important.
34190 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
341a0 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
341b0 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65  hat bitmasks are
341c0 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
341d0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
341e0 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70  tables in.  ** p
341f0 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73  TabList, not jus
34200 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62  t the first nTab
34210 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54  List tables.  nT
34220 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c  abList is normal
34230 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  ly.  ** equal to
34240 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
34250 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f  but might be sho
34260 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74  rtened to 1 if t
34270 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e  he.  ** WHERE_ON
34280 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
34290 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   is set..  */.  
342a0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
342b0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
342c0 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
342d0 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
342e0 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75  bList->a[ii].iCu
342f0 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
34300 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20  ef NDEBUG.  {.  
34310 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c    Bitmask toTheL
34320 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  eft = 0;.    for
34330 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
34340 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
34350 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
34360 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
34370 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
34380 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
34390 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d       assert( (m-
343a0 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b  1)==toTheLeft );
343b0 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74  .      toTheLeft
343c0 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d   |= m;.    }.  }
343d0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
343e0 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
343f0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
34400 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72    Note that expr
34410 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a  Analyze() might.
34420 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72    ** add new vir
34430 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20  tual terms onto 
34440 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
34450 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65  HERE clause.  We
34460 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e   do not.  ** wan
34470 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  t to analyze the
34480 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  se virtual terms
34490 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79  , so start analy
344a0 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  zing at the end.
344b0 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f    ** and work fo
344c0 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68  rward so that th
344d0 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20  e added virtual 
344e0 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20  terms are never 
344f0 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a  processed..  */.
34500 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
34510 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e  (pTabList, &pWIn
34520 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20  fo->sWC);.  if( 
34530 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
34540 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
34550 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
34560 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
34570 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
34580 50 20 42 59 29 20 63 6c 61 75 73 65 20 63 6f 6e  P BY) clause con
34590 74 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73  tains references
345a0 20 74 6f 20 67 65 6e 65 72 61 6c 0a 20 20 2a 2a   to general.  **
345b0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 74 68   expressions, th
345c0 65 6e 20 77 65 20 77 6f 6e 27 74 20 62 65 20 61  en we won't be a
345d0 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 69  ble to satisfy i
345e0 74 20 75 73 69 6e 67 20 69 6e 64 69 63 65 73 2c  t using indices,
345f0 20 73 6f 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61   so.  ** go ahea
34600 64 20 61 6e 64 20 64 69 73 61 62 6c 65 20 69 74  d and disable it
34610 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
34620 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 44 69   pOrderBy && pDi
34630 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f  stinct ){.    fo
34640 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 64 65  r(ii=0; ii<pOrde
34650 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
34660 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
34670 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
34680 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
34690 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 70 45  rderBy->a[ii].pE
346a0 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
346b0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
346c0 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
346d0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
346e0 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   = pOrderBy = 0;
346f0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
34700 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
34710 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
34720 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
34730 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
34740 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
34750 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
34760 20 71 75 61 6c 69 66 69 65 72 2c 20 69 66 20 74   qualifier, if t
34770 68 65 72 65 20 69 73 20 6f 6e 65 2c 20 69 73 20  here is one, is 
34780 72 65 64 75 6e 64 61 6e 74 2e 20 0a 20 20 2a 2a  redundant. .  **
34790 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
347a0 73 65 74 20 70 44 69 73 74 69 6e 63 74 20 74 6f  set pDistinct to
347b0 20 4e 55 4c 4c 20 61 6e 64 20 57 68 65 72 65 49   NULL and WhereI
347c0 6e 66 6f 2e 65 44 69 73 74 69 6e 63 74 20 74 6f  nfo.eDistinct to
347d0 0a 20 20 2a 2a 20 57 48 45 52 45 5f 44 49 53 54  .  ** WHERE_DIST
347e0 49 4e 43 54 5f 55 4e 49 51 55 45 20 74 6f 20 74  INCT_UNIQUE to t
347f0 65 6c 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  ell the caller t
34800 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 44 49 53  o ignore the DIS
34810 54 49 4e 43 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  TINCT..  */.  if
34820 28 20 70 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ( pDistinct ){. 
34830 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63     if( isDistinc
34840 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73  tRedundant(pPars
34850 65 2c 70 54 61 62 4c 69 73 74 2c 26 70 57 49 6e  e,pTabList,&pWIn
34860 66 6f 2d 3e 73 57 43 2c 70 44 69 73 74 69 6e 63  fo->sWC,pDistinc
34870 74 29 20 29 7b 0a 20 20 20 20 20 20 70 44 69 73  t) ){.      pDis
34880 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
34890 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
348a0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
348b0 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
348c0 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72  }else if( pOrder
348d0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  By==0 ){.      p
348e0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
348f0 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54 49  s |= WHERE_DISTI
34900 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57 49  NCTBY;.      pWI
34910 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  nfo->pOrderBy = 
34920 70 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 7d  pDistinct;.    }
34930 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  .  }..  /* Const
34940 72 75 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f  ruct the WhereLo
34950 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
34960 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
34970 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
34980 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29  r Start ***\n"))
34990 3b 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  ;.  if( nTabList
349a0 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72  !=1 || whereShor
349b0 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29  tCut(&sWLB)==0 )
349c0 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  {.    rc = where
349d0 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42  LoopAddAll(&sWLB
349e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
349f0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
34a00 72 72 6f 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  rror;.  .    /* 
34a10 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74  Display all of t
34a20 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
34a30 65 63 74 73 20 69 66 20 77 68 65 72 65 74 72 61  ects if wheretra
34a40 63 65 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  ce is enabled */
34a50 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
34a60 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
34a70 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
34a80 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 57 68  race ){.      Wh
34a90 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20  ereLoop *p;.    
34aa0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
34ab0 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a     static char z
34ac0 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34  Label[] = "01234
34ad0 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b  56789abcdefghijk
34ae0 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22  lmnopqrstuvwyxz"
34af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b10 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46 47          "ABCDEFG
34b20 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
34b30 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28  YXZ";.      for(
34b40 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  p=pWInfo->pLoops
34b50 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c  ; p; p=p->pNextL
34b60 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  oop){.        p-
34b70 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 28 69  >cId = zLabel[(i
34b80 2b 2b 29 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65  ++)%sizeof(zLabe
34b90 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65  l)];.        whe
34ba0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70  reLoopPrint(p, p
34bb0 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  TabList);.      
34bc0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
34bd0 20 0a 20 20 20 20 77 68 65 72 65 50 61 74 68 53   .    wherePathS
34be0 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29  olver(pWInfo, 0)
34bf0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
34c00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
34c10 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
34c20 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  r;.    if( pWInf
34c30 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  o->pOrderBy ){. 
34c40 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 53        wherePathS
34c50 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57  olver(pWInfo, pW
34c60 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a  Info->nRowOut);.
34c70 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
34c80 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
34c90 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
34ca0 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
34cb0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
34cc0 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e  erBy==0 && (db->
34cd0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
34ce0 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20  everseOrder)!=0 
34cf0 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ){.     pWInfo->
34d00 72 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61  revMask = (Bitma
34d10 73 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69  sk)(-1);.  }.  i
34d20 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
34d30 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c  || NEVER(db->mal
34d40 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20  locFailed) ){.  
34d50 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
34d60 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64  nError;.  }.#ifd
34d70 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
34d80 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
34d90 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
34da0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
34db0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
34dc0 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69  ntf("---- Soluti
34dd0 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49  on nRow=%d", pWI
34de0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20  nfo->nRowOut);. 
34df0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62     if( pWInfo->b
34e00 4f 42 53 61 74 20 29 7b 0a 20 20 20 20 20 20 73  OBSat ){.      s
34e10 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
34e20 66 28 22 20 4f 52 44 45 52 42 59 3d 30 78 25 6c  f(" ORDERBY=0x%l
34e30 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76  lx", pWInfo->rev
34e40 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mask);.    }.   
34e50 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d   switch( pWInfo-
34e60 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  >eDistinct ){.  
34e70 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
34e80 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
34e90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34ea0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
34eb0 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22  DISTINCT=unique"
34ec0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
34ed0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34ee0 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
34ef0 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20  NCT_ORDERED: {. 
34f00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
34f10 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
34f20 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b  TINCT=ordered");
34f30 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
34f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
34f50 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
34f60 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20  T_UNORDERED: {. 
34f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
34f80 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
34f90 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22  TINCT=unordered"
34fa0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
34fb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
34fc0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
34fd0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
34fe0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
34ff0 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a  TabList; ii++){.
35000 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
35010 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69  rint(pWInfo->a[i
35020 69 5d 2e 70 57 4c 6f 6f 70 2c 20 70 54 61 62 4c  i].pWLoop, pTabL
35030 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
35040 23 65 6e 64 69 66 0a 20 20 57 48 45 52 45 54 52  #endif.  WHERETR
35050 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a  ACE(0xffff,("***
35060 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73   Optimizer Finis
35070 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  hed ***\n"));.  
35080 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
35090 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57  nQueryLoop += pW
350a0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a  Info->nRowOut;..
350b0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
350c0 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  er is an UPDATE 
350d0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
350e0 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75  ent that is requ
350f0 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75  esting.  ** to u
35100 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c  se a one-pass al
35110 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69  gorithm, determi
35120 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70  ne if this is ap
35130 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20  propriate..  ** 
35140 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  The one-pass alg
35150 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b  orithm only work
35160 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  s if the WHERE c
35170 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
35180 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65  s.  ** the state
35190 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61  ment to update a
351a0 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a   single row..  *
351b0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
351c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
351d0 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
351e0 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==0 || pWInfo->n
351f0 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66  Level==1 );.  if
35200 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
35210 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
35220 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 26 26  SIRED)!=0 .   &&
35230 20 28 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70   (pWInfo->a[0].p
35240 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
35250 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d   WHERE_ONEROW)!=
35260 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  0 ){.    pWInfo-
35270 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a  >okOnePass = 1;.
35280 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
35290 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
352a0 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f   &= ~WHERE_IDX_O
352b0 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  NLY;.  }..  /* O
352c0 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
352d0 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
352e0 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
352f0 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
35300 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
35310 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
35320 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
35330 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
35340 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74  -1); /* Insert t
35350 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
35360 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74  er Goto */.  not
35370 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
35380 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 2c  k)0;.  for(ii=0,
35390 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
353a0 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  a; ii<nTabList; 
353b0 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b  ii++, pLevel++){
353c0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
353d0 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
353e0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  o open */.    in
353f0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
35400 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
35410 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
35420 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20  able/index */.  
35430 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
35440 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
35450 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
35460 70 4c 6f 6f 70 3b 0a 0a 20 20 20 20 70 54 61 62  pLoop;..    pTab
35470 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
35480 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
35490 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  m];.    pTab = p
354a0 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
354b0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
354c0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
354d0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
354e0 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
354f0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
35500 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
35510 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
35520 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62  eral)!=0 || pTab
35530 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
35540 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
35550 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69   */.    }else.#i
35560 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35570 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
35580 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
35590 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
355a0 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
355b0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
355c0 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f  har *pVTab = (co
355d0 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
355e0 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
355f0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74  pTab);.      int
35600 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
35610 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
35620 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35630 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20  p4(v, OP_VOpen, 
35640 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61  iCur, 0, 0, pVTa
35650 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20  b, P4_VTAB);.   
35660 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72   }else if( IsVir
35670 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
35680 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20      /* noop */. 
35690 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
356a0 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
356b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
356c0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
356d0 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
356e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
356f0 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30  T_OPEN_CLOSE)==0
35700 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
35710 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65   = pWInfo->okOne
35720 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72  Pass ? OP_OpenWr
35730 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61  ite : OP_OpenRea
35740 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
35750 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
35760 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
35770 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  sor, iDb, pTab, 
35780 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  op);.      testc
35790 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b  ase( !pWInfo->ok
357a0 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d  OnePass && pTab-
357b0 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
357c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
357d0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
357e0 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
357f0 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
35800 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  f( !pWInfo->okOn
35810 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
35820 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20  Col<BMS ){.     
35830 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
35840 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
35850 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
35860 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
35870 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
35880 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
35890 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
358a0 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
358b0 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
358c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
358d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
358e0 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
358f0 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  n), P4_INT32);. 
35900 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
35910 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
35920 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
35930 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
35940 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
35950 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
35960 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
35970 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  e);.    }.#ifnde
35980 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
35990 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
359a0 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
359b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  Flags & WHERE_TE
359c0 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a  MP_INDEX)!=0 ){.
359d0 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41        constructA
359e0 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50  utomaticIndex(pP
359f0 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  arse, &pWInfo->s
35a00 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f  WC, pTabItem, no
35a10 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b  tReady, pLevel);
35a20 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
35a30 66 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  f.    if( pLoop-
35a40 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
35a50 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
35a60 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70    Index *pIx = p
35a70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
35a80 6e 64 65 78 3b 0a 20 20 20 20 20 20 4b 65 79 49  ndex;.      KeyI
35a90 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  nfo *pKey = sqli
35aa0 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
35ab0 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20  pParse, pIx);.  
35ac0 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20 41      /* FIXME:  A
35ad0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
35ae0 6e 20 75 73 65 20 70 54 61 62 49 74 65 6d 2d 3e  n use pTabItem->
35af0 69 43 75 72 73 6f 72 20 69 66 20 57 48 45 52 45  iCursor if WHERE
35b00 5f 49 44 58 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 20  _IDX_ONLY */.   
35b10 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72     int iIndexCur
35b20 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
35b30 75 72 20 3d 20 69 49 64 78 43 75 72 20 3f 20 69  ur = iIdxCur ? i
35b40 49 64 78 43 75 72 20 3a 20 70 50 61 72 73 65 2d  IdxCur : pParse-
35b50 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
35b60 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
35b70 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
35b80 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ma );.      asse
35b90 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30  rt( iIndexCur>=0
35ba0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
35bb0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
35bc0 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 6e 64  P_OpenRead, iInd
35bd0 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  exCur, pIx->tnum
35be0 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
35bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
35c00 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  char*)pKey, P4_K
35c10 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
35c20 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
35c30 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78  nt((v, "%s", pIx
35c40 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ->zName));.    }
35c50 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
35c60 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
35c70 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e  rse, iDb);.    n
35c80 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
35c90 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
35ca0 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d  skSet, pTabItem-
35cb0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20  >iCursor);.  }. 
35cc0 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20   pWInfo->iTop = 
35cd0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
35ce0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
35cf0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
35d00 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
35d10 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  ginError;..  /* 
35d20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  Generate the cod
35d30 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72  e to do the sear
35d40 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74  ch.  Each iterat
35d50 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20  ion of the for. 
35d60 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67   ** loop below g
35d70 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f  enerates code fo
35d80 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65  r a single neste
35d90 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d  d loop of the VM
35da0 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20  .  ** program.. 
35db0 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
35dc0 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
35dd0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61  for(ii=0; ii<nTa
35de0 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  bList; ii++){.  
35df0 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
35e00 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 65  fo->a[ii];.    e
35e10 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50  xplainOneScan(pP
35e20 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
35e30 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76  pLevel, ii, pLev
35e40 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c  el->iFrom, wctrl
35e50 46 6c 61 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52  Flags);.    notR
35e60 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f  eady = codeOneLo
35e70 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20  opStart(pWInfo, 
35e80 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20  ii, notReady);. 
35e90 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
35ea0 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  inue = pLevel->a
35eb0 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20  ddrCont;.  }..  
35ec0 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 72 65  /* Done. */.  re
35ed0 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20  turn pWInfo;..  
35ee0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
35ef0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
35f00 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a  whereBeginError:
35f10 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b  .  if( pWInfo ){
35f20 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
35f30 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
35f40 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
35f50 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f  p;.    whereInfo
35f60 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
35f70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
35f80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
35f90 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
35fa0 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20  he WHERE loop.  
35fb0 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
35fc0 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
35fd0 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69  Begin() for addi
35fe0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
35ff0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
36000 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72  te3WhereEnd(Wher
36010 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
36020 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
36030 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
36040 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
36050 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
36060 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76  nt i;.  WhereLev
36070 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68  el *pLevel;.  Wh
36080 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
36090 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
360a0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
360b0 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  abList;.  sqlite
360c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
360d0 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  db;..  /* Genera
360e0 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
360f0 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
36100 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
36110 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
36120 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
36130 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20  nLevel-1; i>=0; 
36140 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i--){.    pLevel
36150 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
36160 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
36170 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20  evel->pWLoop;.  
36180 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
36190 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
361a0 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a  vel->addrCont);.
361b0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
361c0 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  op!=OP_Noop ){. 
361d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
361e0 41 64 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c  AddOp2(v, pLevel
361f0 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  ->op, pLevel->p1
36200 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20  , pLevel->p2);. 
36210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36220 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76  ChangeP5(v, pLev
36230 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20  el->p5);.    }. 
36240 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
36250 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
36260 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d  _ABLE && pLevel-
36270 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20  >u.in.nIn>0 ){. 
36280 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f       struct InLo
36290 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69  op *pIn;.      i
362a0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt j;.      sqli
362b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
362c0 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
362d0 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66  ddrNxt);.      f
362e0 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69  or(j=pLevel->u.i
362f0 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76  n.nIn, pIn=&pLev
36300 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
36310 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  [j-1]; j>0; j--,
36320 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20   pIn--){.       
36330 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
36340 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
36350 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20  rInTop+1);.     
36360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36370 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  dOp2(v, pIn->eEn
36380 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43  dLoopOp, pIn->iC
36390 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  ur, pIn->addrInT
363a0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  op);.        sql
363b0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
363c0 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
363d0 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  op-1);.      }. 
363e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
363f0 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  ee(db, pLevel->u
36400 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  .in.aInLoop);.  
36410 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
36420 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
36430 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  v, pLevel->addrB
36440 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  rk);.    if( pLe
36450 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
36460 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
36470 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
36480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
36490 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c  (v, OP_IfPos, pL
364a0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
364b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
364c0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
364d0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
364e0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
364f0 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  || (pLoop->wsFla
36500 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
36510 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)!=0 );.      
36520 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
36530 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
36540 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
36550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
36560 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
36570 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Row, pTabList->a
36580 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  [i].iCursor);.  
36590 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
365a0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
365b0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
365c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
365d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
365e0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
365f0 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
36600 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
36610 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65  Level->op==OP_Re
36620 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  turn ){.        
36630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36640 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
36650 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
36660 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
36670 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36680 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
36690 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
366a0 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
366b0 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
366c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
366d0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
366e0 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dr);.    }.  }..
366f0 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
36700 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
36710 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
36720 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
36730 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
36740 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
36750 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
36760 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
36770 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  ak);..  /* Close
36780 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73   all of the curs
36790 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70  ors that were op
367a0 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  ened by sqlite3W
367b0 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a  hereBegin..  */.
367c0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
367d0 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  ->nLevel==1 || p
367e0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70  WInfo->nLevel==p
367f0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
36800 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
36810 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
36820 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
36830 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
36840 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
36850 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
36860 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
36870 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
36880 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
36890 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  rom];.    Table 
368a0 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
368b0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
368c0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
368d0 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
368e0 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69  l->pWLoop;.    i
368f0 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
36900 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
36910 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54  l)==0.     && pT
36920 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20  ab->pSelect==0. 
36930 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
36940 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
36950 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
36960 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  SE)==0.    ){.  
36970 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f      int ws = pLo
36980 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  op->wsFlags;.   
36990 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
369a0 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73  okOnePass && (ws
369b0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
369c0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
369d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
369e0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
369f0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
36a00 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
36a10 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
36a20 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26  E_INDEXED)!=0 &&
36a30 20 28 77 73 20 26 20 28 57 48 45 52 45 5f 49 50   (ws & (WHERE_IP
36a40 4b 7c 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  K|WHERE_TEMP_IND
36a50 45 58 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  EX))==0 ){.     
36a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36a70 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
36a80 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
36a90 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
36aa0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
36ab0 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
36ac0 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20  ndex, make VDBE 
36ad0 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f  code substitutio
36ae0 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a  ns to read data.
36af0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
36b00 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
36b10 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
36b20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20  where possible. 
36b30 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20   In some cases. 
36b40 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d     ** this optim
36b50 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73  ization prevents
36b60 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
36b70 65 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c  ever being read,
36b80 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a   which can.    *
36b90 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66  * yield a signif
36ba0 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63  icant performanc
36bb0 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20  e boost..    ** 
36bc0 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
36bd0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
36be0 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
36bf0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
36c00 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
36c10 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
36c20 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
36c30 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
36c40 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
36c50 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
36c60 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
36c70 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
36c80 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
36c90 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
36ca0 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
36cb0 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
36cc0 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
36cd0 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
36ce0 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
36cf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
36d00 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
36d10 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c   (WHERE_INDEXED|
36d20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
36d30 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  ){.      pIdx = 
36d40 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
36d50 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
36d60 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
36d70 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
36d80 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49  I_OR ){.      pI
36d90 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  dx = pLevel->u.p
36da0 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20  Covidx;.    }.  
36db0 20 20 69 66 28 20 70 49 64 78 20 26 26 20 21 64    if( pIdx && !d
36dc0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
36dd0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20  ){.      int k, 
36de0 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56  j, last;.      V
36df0 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 20  dbeOp *pOp;..   
36e00 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
36e10 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49  VdbeGetOp(v, pWI
36e20 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20  nfo->iTop);.    
36e30 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33    last = sqlite3
36e40 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
36e50 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  v);.      for(k=
36e60 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c  pWInfo->iTop; k<
36e70 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b  last; k++, pOp++
36e80 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
36e90 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e  Op->p1!=pLevel->
36ea0 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
36eb0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
36ec0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
36ed0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
36ee0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
36ef0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  Idx->nColumn; j+
36f00 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
36f10 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64  if( pOp->p2==pId
36f20 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29  x->aiColumn[j] )
36f30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
36f40 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20  pOp->p2 = j;.   
36f50 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
36f60 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
36f70 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
36f80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
36f90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36fa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
36fb0 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
36fc0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
36fd0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 6a  DX_ONLY)==0 || j
36fe0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  <pIdx->nColumn )
36ff0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
37000 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
37010 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
37020 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
37030 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
37040 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
37050 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
37060 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
37070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
37080 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63   }..  /* Final c
37090 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50  leanup.  */.  pP
370a0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
370b0 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64   = pWInfo->saved
370c0 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68  NQueryLoop;.  wh
370d0 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
370e0 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
370f0 6e 3b 0a 7d 0a                                   n;.}.