/ Hex Artifact Content
Login

Artifact e5ecc3d12c5b9d66d13f786e80641614530d1957:


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 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  x ){.      /* If
25f60 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62   either the iTab
25f70 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c   or iSortIdx val
25f80 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72  ues for two Wher
25f90 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72  eLoop are differ
25fa0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ent.      ** the
25fb0 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f  n those WhereLoo
25fc0 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ps need to be co
25fd0 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74  nsidered separat
25fe0 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73  ely.  Neither is
25ff0 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64  .      ** a cand
26000 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65  idate to replace
26010 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20   the other. */. 
26020 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
26030 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74     }.    /* In t
26040 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
26050 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72  mentation, the r
26060 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65  Setup value is e
26070 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a  ither zero.    *
26080 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66  * or the cost of
26090 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74   building an aut
260a0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c  omatic index (Nl
260b0 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f  ogN) and the Nlo
260c0 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  gN.    ** is the
260d0 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74   same for compat
260e0 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e  ible WhereLoops.
260f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
26100 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20  p->rSetup==0 || 
26110 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
26120 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  p==0 .          
26130 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65         || p->rSe
26140 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
26150 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f  rSetup );..    /
26160 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  * whereLoopAddBt
26170 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e  ree() always gen
26180 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72  erates and inser
26190 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ts the automatic
261a0 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61   index.    ** ca
261b0 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65  se first.  Hence
261c0 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64   compatible cand
261d0 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73  idate WhereLoops
261e0 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61   never have a la
261f0 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74  rger.    ** rSet
26200 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45  up. Call this SE
26210 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f  TUP-INVARIANT */
26220 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
26230 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
26240 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
26250 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
26260 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
26270 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
26280 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74  .     && p->rSet
26290 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up<=pTemplate->r
262a0 53 65 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d  Setup.     && p-
262b0 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65  >rRun<=pTemplate
262c0 2d 3e 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20  ->rRun.    ){.  
262d0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
262e0 63 68 20 74 61 6b 65 6e 20 77 68 65 6e 20 70 20  ch taken when p 
262f0 69 73 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74  is equal or bett
26300 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  er than pTemplat
26310 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61  e in .      ** a
26320 6c 6c 20 6f 66 20 28 31 29 20 64 65 70 65 6e 64  ll of (1) depend
26330 65 6e 63 65 73 20 28 32 29 20 73 65 74 75 70 2d  ences (2) setup-
26340 63 6f 73 74 2c 20 61 6e 64 20 28 33 29 20 72 75  cost, and (3) ru
26350 6e 2d 63 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20  n-cost. */.     
26360 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74   assert( p->rSet
26370 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up==pTemplate->r
26380 53 65 74 75 70 20 29 3b 0a 20 20 20 20 20 20 69  Setup );.      i
26390 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65  f( p->nLTerm<pTe
263a0 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20  mplate->nLTerm. 
263b0 20 20 20 20 20 20 26 26 20 28 70 2d 3e 77 73 46        && (p->wsF
263c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
263d0 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
263e0 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  && (pTemplate->w
263f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
26400 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
26410 20 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e    && p->u.btree.
26420 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61 74  pIndex==pTemplat
26430 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  e->u.btree.pInde
26440 78 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e 70  x.       && p->p
26450 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65  rereq==pTemplate
26460 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 20 29  ->prereq.      )
26470 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65  {.        /* Ove
26480 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
26490 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74  ng WhereLoop wit
264a0 68 20 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65  h an similar one
264b0 20 74 68 61 74 20 75 73 65 73 0a 20 20 20 20 20   that uses.     
264c0 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65 72 6d 73     ** more terms
264d0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
264e0 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d  .        pNext =
264f0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20   p->pNextLoop;. 
26500 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26520 20 20 20 2f 2a 20 70 54 65 6d 70 6c 61 74 65 20     /* pTemplate 
26530 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a  is not helpful..
26540 20 20 20 20 20 20 20 20 2a 2a 20 52 65 74 75 72          ** Retur
26550 6e 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  n without changi
26560 6e 67 20 6f 72 20 61 64 64 69 6e 67 20 61 6e 79  ng or adding any
26570 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  thing */.       
26580 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49   goto whereLoopI
26590 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20  nsert_noop;.    
265a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
265b0 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
265c0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
265d0 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
265e0 65 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e  ereq.     && p->
265f0 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  rRun>=pTemplate-
26600 3e 72 52 75 6e 0a 20 20 20 20 20 26 26 20 41 4c  >rRun.     && AL
26610 57 41 59 53 28 70 2d 3e 72 53 65 74 75 70 3e 3d  WAYS(p->rSetup>=
26620 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
26630 70 29 20 2f 2a 20 53 65 65 20 53 45 54 55 50 2d  p) /* See SETUP-
26640 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20  INVARIANT above 
26650 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
26660 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20  /* Overwrite an 
26670 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
26680 6f 70 20 77 69 74 68 20 61 20 62 65 74 74 65 72  op with a better
26690 20 6f 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20 69   one: one that i
266a0 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  s.      ** bette
266b0 72 20 61 74 20 6f 6e 65 20 6f 66 20 28 31 29 20  r at one of (1) 
266c0 64 65 70 65 6e 64 65 6e 63 65 73 2c 20 28 32 29  dependences, (2)
266d0 20 73 65 74 75 70 2d 63 6f 73 74 2c 20 6f 72 20   setup-cost, or 
266e0 28 33 29 20 72 75 6e 2d 63 6f 73 74 0a 20 20 20  (3) run-cost.   
266f0 20 20 20 2a 2a 20 61 6e 64 20 69 73 20 6e 6f 20     ** and is no 
26700 77 6f 72 73 65 20 69 6e 20 61 6e 79 20 6f 66 20  worse in any of 
26710 74 68 6f 73 65 20 63 61 74 65 67 6f 72 69 65 73  those categories
26720 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78 74  . */.      pNext
26730 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
26740 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26750 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
26760 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
26770 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
26780 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
26790 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
267a0 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
267b0 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
267c0 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
267d0 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
267e0 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
267f0 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
26800 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
26810 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
26820 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
26830 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
26840 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
26850 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
26860 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26870 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20  ins-del:  ");.  
26880 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
26890 6e 74 28 70 2c 20 70 57 49 6e 66 6f 2d 3e 70 54  nt(p, pWInfo->pT
268a0 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  abList);.    }. 
268b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
268c0 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a 20  rintf("ins-new: 
268d0 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f   ");.    whereLo
268e0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
268f0 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  e, pWInfo->pTabL
26900 69 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ist);.  }.#endif
26910 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
26920 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
26930 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
26940 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
26950 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
26960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
26970 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65 4c  OMEM;.    whereL
26980 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a  oopInit(p);.  }.
26990 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28    whereLoopXfer(
269a0 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65  db, p, pTemplate
269b0 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  );.  p->pNextLoo
269c0 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70 70  p = pNext;.  *pp
269d0 50 72 65 76 20 3d 20 70 3b 0a 20 20 69 66 28 20  Prev = p;.  if( 
269e0 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
269f0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
26a00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65  )==0 ){.    Inde
26a10 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75  x *pIndex = p->u
26a20 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
26a30 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26     if( pIndex &&
26a40 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30   pIndex->tnum==0
26a50 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62   ){.      p->u.b
26a60 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
26a70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
26a80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
26a90 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
26aa0 66 20 74 68 65 20 69 6e 73 65 72 74 20 69 73 20  f the insert is 
26ab0 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72 65  a no-op */.where
26ac0 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3a  LoopInsert_noop:
26ad0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
26ae0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
26af0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
26b00 26 20 30 78 38 20 29 7b 0a 20 20 20 20 73 71 6c  & 0x8 ){.    sql
26b10 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26b20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20  pBuilder->pBest 
26b30 3f 20 22 69 6e 73 2d 73 6b 69 70 3a 20 22 20 3a  ? "ins-skip: " :
26b40 20 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a   "ins-noop: ");.
26b50 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
26b60 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57  nt(pTemplate, pW
26b70 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b  Info->pTabList);
26b80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
26b90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
26ba0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61   .}../*.** We ha
26bb0 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65  ve so far matche
26bc0 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  d pBuilder->pNew
26bd0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65  ->u.btree.nEq te
26be0 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
26bf0 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20   pIndex..** Try 
26c00 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72  to match one mor
26c10 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  e..**.** If pPro
26c20 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
26c30 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
26c40 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
26c50 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
26c60 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
26c70 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
26c80 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
26c90 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
26ca0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
26cb0 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
26cc0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
26cd0 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
26ce0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
26cf0 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
26d00 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
26d10 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
26d20 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d40 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
26d50 20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65   pSrc */.  Where
26d60 43 6f 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20  Cost nInMul     
26d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
26d80 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
26d90 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
26da0 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
26db0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
26dc0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
26dd0 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
26de0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
26df0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
26e00 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
26e10 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
26e20 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
26e30 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
26e40 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
26e50 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
26e60 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
26e70 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
26e80 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
26e90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
26ea0 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
26eb0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
26ec0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
26ed0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
26ee0 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
26ef0 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
26f00 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
26f10 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26f30 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
26f40 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
26f50 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
26f60 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
26f70 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
26f80 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
26f90 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
26fa0 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
26fb0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
26fc0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
26fd0 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
26fe0 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
26ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27000 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
27010 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
27020 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 5f   */.  int saved_
27030 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
27040 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
27050 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
27060 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
27070 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c    u32 saved_wsFl
27080 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
27090 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
270a0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46  lue of pNew->wsF
270b0 6c 61 67 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  lags */.  WhereC
270c0 6f 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20  ost saved_nOut; 
270d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
270e0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
270f0 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69  New->nOut */.  i
27100 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27120 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
27130 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
27140 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  le */.  int rc =
27150 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
27160 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
27170 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72  n code */.  Wher
27180 65 43 6f 73 74 20 6e 52 6f 77 45 73 74 3b 20 20  eCost nRowEst;  
27190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
271a0 73 74 69 6d 61 74 65 64 20 69 6e 64 65 78 20 73  stimated index s
271b0 65 6c 65 63 74 69 76 69 74 79 20 2a 2f 0a 20 20  electivity */.  
271c0 57 68 65 72 65 43 6f 73 74 20 72 4c 6f 67 53 69  WhereCost rLogSi
271d0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
271e0 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
271f0 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20  table size */.  
27200 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20  WhereTerm *pTop 
27210 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20  = 0, *pBtm = 0; 
27220 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f  /* Top and botto
27230 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  m range constrai
27240 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d  nts */..  pNew =
27250 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
27260 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
27270 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
27280 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
27290 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
272a0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
272b0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
272c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
272d0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
272e0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
272f0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ==0 );.  if( pNe
27300 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
27310 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
27320 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
27330 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
27340 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e  e if( pProbe->tn
27350 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e  um<=0 || (pSrc->
27360 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
27370 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70  FT)!=0 ){.    op
27380 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
27390 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  IN|WO_GT|WO_GE|W
273a0 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65  O_LT|WO_LE;.  }e
273b0 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  lse{.    opMask 
273c0 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
273d0 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f  _ISNULL|WO_GT|WO
273e0 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
273f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62  .  }.  if( pProb
27400 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  e->bUnordered ) 
27410 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47  opMask &= ~(WO_G
27420 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
27430 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  _LE);..  assert(
27440 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
27450 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq<=pProbe->nCol
27460 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  umn );.  if( pNe
27470 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3c  w->u.btree.nEq <
27480 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e   pProbe->nColumn
27490 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
274a0 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
274b0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
274c0 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  q];.    nRowEst 
274d0 3d 20 77 68 65 72 65 43 6f 73 74 28 70 50 72 6f  = whereCost(pPro
274e0 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65  be->aiRowEst[pNe
274f0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 31  w->u.btree.nEq+1
27500 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77  ]);.    if( nRow
27510 45 73 74 3d 3d 30 20 26 26 20 70 50 72 6f 62 65  Est==0 && pProbe
27520 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
27530 6e 65 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 31  ne ) nRowEst = 1
27540 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
27550 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 52  Col = -1;.    nR
27560 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  owEst = 0;.  }. 
27570 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
27580 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42  anInit(&scan, pB
27590 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72  uilder->pWC, pSr
275a0 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c  c->iCursor, iCol
275b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
275c0 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b            opMask
275d0 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76  , pProbe);.  sav
275e0 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75  ed_nEq = pNew->u
275f0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61  .btree.nEq;.  sa
27600 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
27610 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
27620 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
27630 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
27640 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
27650 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
27660 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
27670 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  nOut;.  pNew->rS
27680 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67  etup = 0;.  rLog
27690 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 77 68  Size = estLog(wh
276a0 65 72 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e  ereCost(pProbe->
276b0 61 69 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 20  aiRowEst[0]));. 
276c0 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
276d0 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30  E_OK && pTerm!=0
276e0 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53  ; pTerm = whereS
276f0 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b  canNext(&scan)){
27700 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30  .    int nIn = 0
27710 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
27720 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
27730 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
27740 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 4e  continue;.    pN
27750 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
27760 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20  ved_wsFlags;.   
27770 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
27780 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
27790 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
277a0 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
277b0 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f  .    if( whereLo
277c0 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
277d0 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  w, pNew->nLTerm+
277e0 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f  1) ) break; /* O
277f0 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  OM */.    pNew->
27800 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
27810 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm++] = pTerm;.
27820 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
27830 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65 71   = (saved_prereq
27840 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
27850 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e  Right) & ~pNew->
27860 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4e  maskSelf;.    pN
27870 65 77 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53  ew->rRun = rLogS
27880 69 7a 65 3b 20 2f 2a 20 42 61 73 65 6c 69 6e 65  ize; /* Baseline
27890 20 63 6f 73 74 20 69 73 20 6c 6f 67 32 28 4e 29   cost is log2(N)
278a0 2e 20 20 41 64 6a 75 73 74 6d 65 6e 74 73 20 62  .  Adjustments b
278b0 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66 28 20  elow */.    if( 
278c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
278d0 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
278e0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
278f0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
27900 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
27910 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
27920 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  N_IN;.      if( 
27930 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
27940 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
27950 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
27960 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
27970 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a   ...)":  TUNING:
27980 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
27990 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
279a0 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b         nIn = 46;
279b0 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77 68    assert( 46==wh
279c0 65 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a 20  ereCost(25) );. 
279d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
279e0 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
279f0 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
27a00 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
27a10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
27a20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
27a30 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
27a40 20 20 20 6e 49 6e 20 3d 20 77 68 65 72 65 43 6f     nIn = whereCo
27a50 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  st(pExpr->x.pLis
27a60 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
27a70 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72   }.      pNew->r
27a80 52 75 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20  Run += nIn;.    
27a90 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
27aa0 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65  nEq++;.      pNe
27ab0 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73  w->nOut = nRowEs
27ac0 74 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e  t + nInMul + nIn
27ad0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
27ae0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
27af0 20 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20   & (WO_EQ) ){.  
27b00 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4e 65      assert( (pNe
27b10 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  w->wsFlags & (WH
27b20 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c  ERE_COLUMN_NULL|
27b30 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
27b40 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
27b50 20 20 20 20 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c         || nInMul
27b60 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
27b70 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
27b80 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
27b90 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
27ba0 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72   .       || (pPr
27bb0 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  obe->onError!=OE
27bc0 5f 4e 6f 6e 65 20 26 26 20 6e 49 6e 4d 75 6c 3d  _None && nInMul=
27bd0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
27be0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
27bf0 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq==pProbe->nCol
27c00 75 6d 6e 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a  umn-1).      ){.
27c10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27c20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
27c30 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
27c40 29 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30 20 29  )==0 || iCol<0 )
27c50 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
27c60 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
27c70 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d  _ONEROW;.      }
27c80 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
27c90 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
27ca0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
27cb0 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b  RowEst + nInMul;
27cc0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
27cd0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27ce0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b  & (WO_ISNULL) ){
27cf0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
27d00 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
27d10 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  LUMN_NULL;.     
27d20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
27d30 45 71 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 54  Eq++;.      /* T
27d40 55 4e 49 4e 47 3a 20 49 53 20 4e 55 4c 4c 20 73  UNING: IS NULL s
27d50 65 6c 65 63 74 73 20 32 20 72 6f 77 73 20 2a 2f  elects 2 rows */
27d60 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 31 30 3b  .      nIn = 10;
27d70 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 77 68    assert( 10==wh
27d80 65 72 65 43 6f 73 74 28 32 29 20 29 3b 0a 20 20  ereCost(2) );.  
27d90 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
27da0 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75   nRowEst + nInMu
27db0 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c  l + nIn;.    }el
27dc0 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f  se if( pTerm->eO
27dd0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54  perator & (WO_GT
27de0 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20  |WO_GE) ){.     
27df0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
27e00 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
27e10 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
27e20 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
27e30 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20  perator & WO_GE 
27e40 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
27e50 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
27e60 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
27e70 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
27e80 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d      pBtm = pTerm
27e90 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30  ;.      pTop = 0
27ea0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27eb0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
27ec0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
27ed0 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20  O_LT|WO_LE) );. 
27ee0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
27ef0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27f00 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20  & WO_LT );.     
27f10 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
27f20 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
27f30 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  _LE );.      pNe
27f40 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
27f50 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
27f60 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
27f70 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70  ;.      pTop = p
27f80 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d  Term;.      pBtm
27f90 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67   = (pNew->wsFlag
27fa0 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
27fb0 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  MIT)!=0 ?.      
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
27fd0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
27fe0 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b  ->nLTerm-2] : 0;
27ff0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
28000 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
28010 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
28020 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  E ){.      /* Ad
28030 6a 75 73 74 20 6e 4f 75 74 20 61 6e 64 20 72 52  just nOut and rR
28040 75 6e 20 66 6f 72 20 53 54 41 54 33 20 72 61 6e  un for STAT3 ran
28050 67 65 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20  ge values */.   
28060 20 20 20 57 68 65 72 65 43 6f 73 74 20 72 44 69     WhereCost rDi
28070 76 3b 0a 20 20 20 20 20 20 77 68 65 72 65 52 61  v;.      whereRa
28080 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73  ngeScanEst(pPars
28090 65 2c 20 70 50 72 6f 62 65 2c 20 70 4e 65 77 2d  e, pProbe, pNew-
280a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2c 0a 20 20  >u.btree.nEq,.  
280b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280c0 20 20 20 20 20 20 70 42 74 6d 2c 20 70 54 6f 70        pBtm, pTop
280d0 2c 20 26 72 44 69 76 29 3b 0a 20 20 20 20 20 20  , &rDiv);.      
280e0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
280f0 65 64 5f 6e 4f 75 74 3e 72 44 69 76 2b 31 30 20  ed_nOut>rDiv+10 
28100 3f 20 73 61 76 65 64 5f 6e 4f 75 74 20 2d 20 72  ? saved_nOut - r
28110 44 69 76 20 3a 20 31 30 3b 0a 20 20 20 20 7d 0a  Div : 10;.    }.
28120 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
28130 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 69  ABLE_STAT3.    i
28140 66 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  f( pNew->u.btree
28150 2e 6e 45 71 3d 3d 31 20 26 26 20 70 50 72 6f 62  .nEq==1 && pProb
28160 65 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20  e->nSample ){.  
28170 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74      tRowcnt nOut
28180 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
28190 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
281a0 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
281b0 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20  NULL))!=0 ){.   
281c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
281d0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
281e0 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  & WO_EQ );.     
281f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
28200 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28210 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
28220 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 45       rc = whereE
28230 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
28240 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 54 65 72  se, pProbe, pTer
28250 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
28260 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
28270 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
28280 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
28290 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20 20 20  _IN).           
282a0 20 20 26 26 20 20 21 45 78 70 72 48 61 73 50 72    &&  !ExprHasPr
282b0 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
282c0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
282d0 74 29 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72  t)  ){.        r
282e0 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45  c = whereInScanE
282f0 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62  st(pParse, pProb
28300 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e, pTerm->pExpr-
28310 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29  >x.pList, &nOut)
28320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28330 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 77 68 65  pNew->nOut = whe
28340 72 65 43 6f 73 74 28 6e 4f 75 74 29 3b 0a 20 20  reCost(nOut);.  
28350 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
28360 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
28370 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  s & (WHERE_IDX_O
28380 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d  NLY|WHERE_IPK))=
28390 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45  =0 ){.      /* E
283a0 61 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73  ach row involves
283b0 20 61 20 73 74 65 70 20 6f 66 20 74 68 65 20 69   a step of the i
283c0 6e 64 65 78 2c 20 74 68 65 6e 20 61 20 62 69 6e  ndex, then a bin
283d0 61 72 79 20 73 65 61 72 63 68 20 6f 66 0a 20 20  ary search of.  
283e0 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20      ** the main 
283f0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70  table */.      p
28400 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 20 77 68 65  New->rRun =  whe
28410 72 65 43 6f 73 74 41 64 64 28 70 4e 65 77 2d 3e  reCostAdd(pNew->
28420 72 52 75 6e 2c 20 72 4c 6f 67 53 69 7a 65 3e 32  rRun, rLogSize>2
28430 37 20 3f 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20  7 ? rLogSize-17 
28440 3a 20 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  : 10);.    }.   
28450 20 2f 2a 20 53 74 65 70 20 63 6f 73 74 20 66 6f   /* Step cost fo
28460 72 20 65 61 63 68 20 6f 75 74 70 75 74 20 72 6f  r each output ro
28470 77 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72  w */.    pNew->r
28480 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 41  Run = whereCostA
28490 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  dd(pNew->rRun, p
284a0 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
284b0 2f 2a 20 54 42 44 3a 20 41 64 6a 75 73 74 20 6e  /* TBD: Adjust n
284c0 4f 75 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  Out for addition
284d0 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  al constraints *
284e0 2f 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  /.    rc = where
284f0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
28500 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
28510 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  if( (pNew->wsFla
28520 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
28530 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26  IMIT)==0.     &&
28540 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28550 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq<(pProbe->nCol
28560 75 6d 6e 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a  umn + (pProbe->z
28570 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20 20 29 7b  Name!=0)).    ){
28580 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
28590 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
285a0 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
285b0 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e  robe, nInMul+nIn
285c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
285d0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61  New->prereq = sa
285e0 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e  ved_prereq;.  pN
285f0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
28600 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70  = saved_nEq;.  p
28610 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
28620 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
28630 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
28640 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d  ed_nOut;.  pNew-
28650 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
28660 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e  nLTerm;.  return
28670 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
28680 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74 20  turn True if it 
28690 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
286a0 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62 65   pIndex might be
286b0 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d   useful in.** im
286c0 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
286d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
286e0 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a  n pBuilder..**.*
286f0 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20 69  * Return False i
28700 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73 20  f pBuilder does 
28710 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f  not contain an O
28720 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
28730 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
28740 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e 64   no way for pInd
28750 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  ex to be useful 
28760 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  in implementing 
28770 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59  that.** ORDER BY
28780 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
28790 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67 68  ic int indexMigh
287a0 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79  tHelpWithOrderBy
287b0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
287c0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
287d0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
287e0 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a 29  .  int iCursor.)
287f0 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
28800 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  B;.  int ii, jj;
28810 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ..  if( pIndex->
28820 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74  bUnordered ) ret
28830 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f  urn 0;.  if( (pO
28840 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
28850 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
28860 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
28870 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
28880 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  B->nExpr; ii++){
28890 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
288a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
288b0 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61  ipCollate(pOB->a
288c0 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
288d0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
288e0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
288f0 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 45  rn 0;.    if( pE
28900 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75  xpr->iTable==iCu
28910 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 66 6f  rsor ){.      fo
28920 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
28930 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a 2b 2b  x->nColumn; jj++
28940 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
28950 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
28960 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
28970 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  jj] ) return 1;.
28980 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28990 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
289a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
289b0 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73  bitmask where 1s
289c0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
289d0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
289e0 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
289f0 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20  e table is used 
28a00 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e  by an index.  On
28a10 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20  ly the first 63 
28a20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73  columns are cons
28a30 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idered..*/.stati
28a40 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e  c Bitmask column
28a50 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  sInIndex(Index *
28a60 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b  pIdx){.  Bitmask
28a70 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b   m = 0;.  int j;
28a80 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e  .  for(j=pIdx->n
28a90 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  Column-1; j>=0; 
28aa0 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  j--){.    int x 
28ab0 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
28ac0 5b 6a 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73  [j];.    testcas
28ad0 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  e( x==BMS-1 );. 
28ae0 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
28af0 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 69 66 28  BMS-2 );.    if(
28b00 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20   x<BMS-1 ) m |= 
28b10 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 7d 0a  MASKBIT(x);.  }.
28b20 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 0a    return m;.}...
28b30 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
28b40 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
28b50 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f  a single table o
28b60 66 20 74 68 65 20 6a 6f 69 6e 20 77 65 72 65 20  f the join were 
28b70 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
28b80 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69  idenfied by pBui
28b90 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
28ba0 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
28bb0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
28bc0 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61  e.** a b-tree ta
28bd0 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75  ble, not a virtu
28be0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
28bf0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
28c00 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
28c10 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
28c20 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
28c30 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
28c40 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
28c50 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
28c60 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
28c70 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
28c80 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
28c90 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
28ca0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
28cb0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
28cc0 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
28cd0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
28ce0 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
28cf0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
28d00 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
28d10 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
28d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d30 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
28d40 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
28d50 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
28d60 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74  tRowcnt aiRowEst
28d70 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54  Pk[2];      /* T
28d80 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61  he aiRowEst[] va
28d90 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
28da0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  index */.  int a
28db0 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20  iColumnPk = -1; 
28dc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43         /* The aC
28dd0 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f  olumn[] value fo
28de0 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
28df0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
28e00 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
28e10 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
28e20 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
28e30 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
28e40 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc;  /* The FROM
28e50 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65   clause btree te
28e60 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57  rm to add */.  W
28e70 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
28e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
28e90 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
28ea0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
28eb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
28ed0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
28ee0 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20   iSortIdx = 1;  
28ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
28f00 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  x number */.  in
28f10 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  t b;            
28f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62            /* A b
28f30 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a  oolean value */.
28f40 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 69 7a    WhereCost rSiz
28f50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
28f60 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
28f70 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
28f80 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f 67    WhereCost rLog
28f90 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Size;         /*
28fa0 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   Logarithm of th
28fb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
28fc0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
28fd0 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  .  .  pNew = pBu
28fe0 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
28ff0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
29000 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62  ->pWInfo;.  pTab
29010 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
29020 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20  TabList;.  pSrc 
29030 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  = pTabList->a + 
29040 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 61 73  pNew->iTab;.  as
29050 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c  sert( !IsVirtual
29060 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a  (pSrc->pTab) );.
29070 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e  .  if( pSrc->pIn
29080 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
29090 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
290a0 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
290b0 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
290c0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50  to use */.    pP
290d0 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e  robe = pSrc->pIn
290e0 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
290f0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
29100 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
29110 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
29120 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
29130 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
29140 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
29150 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
29160 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
29170 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
29180 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
29190 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
291a0 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
291b0 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
291c0 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
291d0 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
291e0 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
291f0 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29210 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
29220 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
29230 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
29240 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
29250 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
29260 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b  sPk.nColumn = 1;
29270 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d  .    sPk.aiColum
29280 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b  n = &aiColumnPk;
29290 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73  .    sPk.aiRowEs
292a0 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
292b0 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
292c0 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
292d0 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
292e0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  Src->pTab;.    a
292f0 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
29300 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45  Src->pTab->nRowE
29310 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  st;.    aiRowEst
29320 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70  Pk[1] = 1;.    p
29330 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54  First = pSrc->pT
29340 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
29350 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
29360 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  exed==0 ){.     
29370 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64   /* The real ind
29380 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ices of the tabl
29390 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69  e are only consi
293a0 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20  dered if the.   
293b0 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45     ** NOT INDEXE
293c0 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f  D qualifier is o
293d0 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
293e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
293f0 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d       sPk.pNext =
29400 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20   pFirst;.    }. 
29410 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b     pProbe = &sPk
29420 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20  ;.  }.  rSize = 
29430 77 68 65 72 65 43 6f 73 74 28 70 53 72 63 2d 3e  whereCost(pSrc->
29440 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a  pTab->nRowEst);.
29450 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
29460 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  Log(rSize);..  /
29470 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
29480 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42  xes */.  if( !pB
29490 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 0a 20 20  uilder->pBest.  
294a0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61   && (pWInfo->pPa
294b0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
294c0 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
294d0 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63  x)!=0.   && pSrc
294e0 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26  ->pIndex==0.   &
294f0 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f  & !pSrc->viaCoro
29500 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72  utine.   && !pSr
29510 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20  c->notIndexed.  
29520 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72   && !pSrc->isCor
29530 72 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20 20  related.  ){.   
29540 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74   /* Generate aut
29550 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f  o-index WhereLoo
29560 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43  ps */.    WhereC
29570 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75  lause *pWC = pBu
29580 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 20 20  ilder->pWC;.    
29590 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
295a0 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
295b0 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
295c0 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
295d0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
295e0 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
295f0 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
29600 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
29610 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
29620 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
29630 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
29640 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
29650 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
29660 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
29670 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
29680 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
29690 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
296a0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
296b0 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
296c0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
296d0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
296e0 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
296f0 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  m;.        /* TU
29700 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63  NING: One-time c
29710 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e  ost for computin
29720 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  g the automatic 
29730 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20  index is.       
29740 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74 65 6c   ** approximatel
29750 79 20 36 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68  y 6*N*log2(N) wh
29760 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
29770 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20  ber of rows in. 
29780 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61         ** the ta
29790 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
297a0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  d. */.        pN
297b0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f  ew->rSetup = rLo
297c0 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20  gSize + rSize + 
297d0 32 36 3b 20 20 61 73 73 65 72 74 28 20 32 36 3d  26;  assert( 26=
297e0 3d 77 68 65 72 65 43 6f 73 74 28 36 29 20 29 3b  =whereCost(6) );
297f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
29800 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c  NG: Each index l
29810 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 31 30 20  ookup yields 10 
29820 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
29830 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  e */.        pNe
29840 77 2d 3e 6e 4f 75 74 20 3d 20 33 33 3b 20 20 61  w->nOut = 33;  a
29850 73 73 65 72 74 28 20 33 33 3d 3d 77 68 65 72 65  ssert( 33==where
29860 43 6f 73 74 28 31 30 29 20 29 3b 0a 20 20 20 20  Cost(10) );.    
29870 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
29880 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 4c   whereCostAdd(rL
29890 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75  ogSize,pNew->nOu
298a0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  t);.        pNew
298b0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
298c0 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
298d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
298e0 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54  eq = mExtra | pT
298f0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
29900 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
29910 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
29920 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
29930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29940 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  }..  /* Loop ove
29950 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20  r all indices.  
29960 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53  */.  for(; rc==S
29970 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f  QLITE_OK && pPro
29980 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62  be; pProbe=pProb
29990 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49  e->pNext, iSortI
299a0 64 78 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d  dx++){.    pNew-
299b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30  >u.btree.nEq = 0
299c0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
299d0 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  rm = 0;.    pNew
299e0 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
299f0 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
29a00 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
29a10 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b  prereq = mExtra;
29a20 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
29a30 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
29a40 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
29a50 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
29a60 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
29a70 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
29a80 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54  ursor);.    /* T
29a90 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  he ONEPASS_DESIR
29aa0 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f  ED flags never o
29ab0 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77  ccurs together w
29ac0 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ith ORDER BY */.
29ad0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49      assert( (pWI
29ae0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
29af0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
29b00 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62  DESIRED)==0 || b
29b10 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
29b20 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29  Probe->tnum<=0 )
29b30 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
29b40 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
29b50 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
29b60 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
29b70 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
29b80 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
29b90 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
29ba0 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
29bb0 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
29bc0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
29bd0 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 2f  = rSize;.      /
29be0 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
29bf0 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  f full table sca
29c00 6e 20 69 73 20 33 2a 28 4e 20 2b 20 6c 6f 67 32  n is 3*(N + log2
29c10 28 4e 29 29 2e 0a 20 20 20 20 20 20 2a 2a 20 20  (N))..      **  
29c20 2b 20 20 54 68 65 20 65 78 74 72 61 20 33 20 66  +  The extra 3 f
29c30 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f  actor is to enco
29c40 75 72 61 67 65 20 74 68 65 20 75 73 65 20 6f 66  urage the use of
29c50 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73   indexed lookups
29c60 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 76  .      **     ov
29c70 65 72 20 66 75 6c 6c 20 73 63 61 6e 73 2e 20 20  er full scans.  
29c80 41 20 73 6d 61 6c 6c 65 72 20 63 6f 6e 73 74 61  A smaller consta
29c90 6e 74 20 32 20 69 73 20 75 73 65 64 20 66 6f 72  nt 2 is used for
29ca0 20 63 6f 76 65 72 69 6e 67 0a 20 20 20 20 20 20   covering.      
29cb0 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 73 63 61  **     index sca
29cc0 6e 73 20 73 6f 20 74 68 61 74 20 61 20 63 6f 76  ns so that a cov
29cd0 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
29ce0 20 77 69 6c 6c 20 62 65 20 66 61 76 6f 72 65 64   will be favored
29cf0 20 6f 76 65 72 0a 20 20 20 20 20 20 2a 2a 20 20   over.      **  
29d00 20 20 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e     a table scan.
29d10 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
29d20 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74  rRun = whereCost
29d30 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69  Add(rSize,rLogSi
29d40 7a 65 29 20 2b 20 31 36 3b 0a 20 20 20 20 20 20  ze) + 16;.      
29d50 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
29d60 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
29d70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  New);.      if( 
29d80 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
29d90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74  }else{.      Bit
29da0 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63  mask m = pSrc->c
29db0 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
29dc0 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29  sInIndex(pProbe)
29dd0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
29de0 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f  Flags = (m==0) ?
29df0 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
29e00 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20  |WHERE_INDEXED) 
29e10 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  : WHERE_INDEXED;
29e20 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  ..      /* Full 
29e30 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a  scan via index *
29e40 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20 20  /.      if( b.  
29e50 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20       || ( m==0. 
29e60 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
29e70 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  e->bUnordered==0
29e80 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
29e90 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
29ea0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
29eb0 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20  _DESIRED)==0.   
29ec0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
29ed0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
29ee0 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26  eCis.         &&
29ef0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
29f00 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61  bled(pWInfo->pPa
29f10 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
29f20 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
29f30 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
29f40 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
29f50 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
29f60 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
29f70 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
29f80 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20   = rSize;.      
29f90 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20    if( m==0 ){.  
29fa0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
29fb0 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 63 6f 76  G: Cost of a cov
29fc0 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
29fd0 20 69 73 20 32 2a 28 4e 20 2b 20 6c 6f 67 32 28   is 2*(N + log2(
29fe0 4e 29 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  N))..          *
29ff0 2a 20 20 2b 20 20 54 68 65 20 65 78 74 72 61 20  *  +  The extra 
2a000 32 20 66 61 63 74 6f 72 20 69 73 20 74 6f 20 65  2 factor is to e
2a010 6e 63 6f 75 72 61 67 65 20 74 68 65 20 75 73 65  ncourage the use
2a020 20 6f 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b   of indexed look
2a030 75 70 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ups.          **
2a040 20 20 20 20 20 6f 76 65 72 20 69 6e 64 65 78 20       over index 
2a050 73 63 61 6e 73 2e 20 20 41 20 74 61 62 6c 65 20  scans.  A table 
2a060 73 63 61 6e 20 75 73 65 73 20 61 20 66 61 63 74  scan uses a fact
2a070 6f 72 20 6f 66 20 33 20 73 6f 20 74 68 61 74 0a  or of 3 so that.
2a080 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
2a090 20 69 6e 64 65 78 20 73 63 61 6e 73 20 61 72 65   index scans are
2a0a0 20 66 61 76 6f 72 65 64 20 6f 76 65 72 20 74 61   favored over ta
2a0b0 62 6c 65 20 73 63 61 6e 73 2e 0a 20 20 20 20 20  ble scans..     
2a0c0 20 20 20 20 20 2a 2a 20 20 2b 20 20 49 66 20 74       **  +  If t
2a0d0 68 69 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  his covering ind
2a0e0 65 78 20 6d 69 67 68 74 20 61 6c 73 6f 20 68 65  ex might also he
2a0f0 6c 70 20 73 61 74 69 73 66 79 20 74 68 65 20 4f  lp satisfy the O
2a100 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 20 20  RDER BY.        
2a110 20 20 2a 2a 20 20 20 20 20 63 6c 61 75 73 65 2c    **     clause,
2a120 20 74 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69   then the cost i
2a130 73 20 66 75 64 67 65 64 20 64 6f 77 6e 20 73 6c  s fudged down sl
2a140 69 67 68 74 6c 79 20 73 6f 20 74 68 61 74 20 74  ightly so that t
2a150 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
2a160 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 66 61       index is fa
2a170 76 6f 72 65 64 20 61 62 6f 76 65 20 6f 74 68 65  vored above othe
2a180 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 68  r indices that h
2a190 61 76 65 20 6e 6f 20 68 6f 70 65 20 6f 66 0a 20  ave no hope of. 
2a1a0 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20           **     
2a1b0 68 65 6c 70 69 6e 67 20 77 69 74 68 20 74 68 65  helping with the
2a1c0 20 4f 52 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20   ORDER BY. */.  
2a1d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2a1e0 75 6e 20 3d 20 31 30 20 2b 20 77 68 65 72 65 43  un = 10 + whereC
2a1f0 6f 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f  ostAdd(rSize,rLo
2a200 67 53 69 7a 65 29 20 2d 20 62 3b 0a 20 20 20 20  gSize) - b;.    
2a210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a220 20 20 20 20 20 61 73 73 65 72 74 28 20 62 21 3d       assert( b!=
2a230 30 20 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ); .          
2a240 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
2a250 6f 66 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f  of scanning a no
2a260 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
2a270 20 69 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e   is (N+1)*log2(N
2a280 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77  ).          ** w
2a290 68 69 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d  hich we will sim
2a2a0 70 6c 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a  plify to just N*
2a2b0 6c 6f 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20  log2(N) */.     
2a2c0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2a2d0 3d 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69  = rSize + rLogSi
2a2e0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ze;.        }.  
2a2f0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2a300 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2a310 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2a320 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2a330 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2a340 7d 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  }.    rc = where
2a350 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
2a360 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
2a370 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 0a 20  , pProbe, 0);.. 
2a380 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
2a390 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
2a3a0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e   clause, then on
2a3b0 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65  ly that one inde
2a3c0 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  x is.    ** cons
2a3d0 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  idered. */.    i
2a3e0 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  f( pSrc->pIndex 
2a3f0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2a400 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
2a410 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a420 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
2a430 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
2a440 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
2a450 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  r a table of the
2a460 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64   join identified
2a470 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d   by.** pBuilder-
2a480 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
2a490 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
2a4a0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76  anteed to be a v
2a4b0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
2a4c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2a4d0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
2a4e0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2a4f0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 20 20 20  der *pBuilder   
2a500 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
2a510 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29  information */.)
2a520 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2a530 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
2a540 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
2a550 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
2a560 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a580 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
2a590 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
2a5a0 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
2a5b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
2a5c0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
2a5d0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2a5e0 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54  em *pSrc;   /* T
2a5f0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
2a600 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
2a610 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
2a620 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2a630 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
2a640 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
2a650 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
2a660 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2a670 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
2a680 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2a690 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
2a6a0 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
2a6b0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
2a6c0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
2a6d0 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d  nt iTerm, mxTerm
2a6e0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
2a6f0 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49  int;.  int seenI
2a700 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
2a710 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2a720 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  n IN operator is
2a730 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73   seen */.  int s
2a740 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20  eenVar = 0;     
2a750 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a760 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  if a non-constan
2a770 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  t constraint is 
2a780 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50  seen */.  int iP
2a790 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  hase;           
2a7a0 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e         /* 0: con
2a7b0 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f  st w/o IN, 1: co
2a7c0 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20  nst, 2: no IN,  
2a7d0 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65  2: IN */.  Where
2a7e0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Loop *pNew;.  in
2a7f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a800 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  ;..  pWInfo = pB
2a810 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2a820 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
2a830 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
2a840 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2a850 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
2a860 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  pWC;.  pNew = pB
2a870 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
2a880 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  pSrc = &pWInfo->
2a890 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77  pTabList->a[pNew
2a8a0 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20  ->iTab];.  pTab 
2a8b0 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
2a8c0 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
2a8d0 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64  l(pTab) );.  pId
2a8e0 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
2a8f0 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65  IndexInfo(pParse
2a900 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75  , pWC, pSrc, pBu
2a910 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29  ilder->pOrderBy)
2a920 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
2a930 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2a940 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65  ITE_NOMEM;.  pNe
2a950 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20  w->prereq = 0;. 
2a960 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2a970 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  0;.  pNew->wsFla
2a980 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
2a990 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d  ALTABLE;.  pNew-
2a9a0 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
2a9b0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2a9c0 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61  Free = 0;.  pUsa
2a9d0 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  ge = pIdxInfo->a
2a9e0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
2a9f0 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  .  nConstraint =
2aa00 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73   pIdxInfo->nCons
2aa10 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68  traint;.  if( wh
2aa20 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
2aa30 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61  , pNew, nConstra
2aa40 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  int) ){.    sqli
2aa50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
2aa60 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74  dxInfo);.    ret
2aa70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2aa80 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68  ;.  }..  for(iPh
2aa90 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33  ase=0; iPhase<=3
2aaa0 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20  ; iPhase++){.   
2aab0 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20   if( !seenIn && 
2aac0 28 69 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b  (iPhase&1)!=0 ){
2aad0 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b  .      iPhase++;
2aae0 0a 20 20 20 20 20 20 69 66 28 20 69 50 68 61 73  .      if( iPhas
2aaf0 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e>3 ) break;.   
2ab00 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e   }.    if( !seen
2ab10 56 61 72 20 26 26 20 69 50 68 61 73 65 3e 31 20  Var && iPhase>1 
2ab20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64  ) break;.    pId
2ab30 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
2ab40 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
2ab50 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
2ab60 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
2ab70 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  nt;.    for(i=0;
2ab80 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
2ab90 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
2aba0 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
2abb0 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
2abc0 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
2abd0 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
2abe0 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69  >a[j];.      swi
2abf0 74 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20  tch( iPhase ){. 
2ac00 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20         case 0:  
2ac10 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77    /* Constants w
2ac20 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74  ithout IN operat
2ac30 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
2ac40 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
2ac50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2ac60 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2ac70 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
2ac80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2ac90 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20   seenIn = 1;.   
2aca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2acb0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
2acc0 65 72 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a  ereqRight!=0 ){.
2acd0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
2ace0 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Var = 1;.       
2acf0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
2ad00 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2ad10 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20   WO_IN)==0 ){.  
2ad20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2ad30 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
2ad40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ad50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ad60 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 20       case 1:    
2ad70 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
2ad80 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a  h IN operators *
2ad90 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
2ada0 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20  rt( seenIn );.  
2adb0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2adc0 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
2add0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  m->prereqRight==
2ade0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
2adf0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
2ae00 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61  e 2:    /* Varia
2ae10 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20  bles without IN 
2ae20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
2ae30 65 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a  ert( seenVar );.
2ae40 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
2ae50 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54  ns->usable = (pT
2ae60 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2ae70 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20   WO_IN)==0;.    
2ae80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ae90 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20       default:   
2aea0 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74  /* Variables wit
2aeb0 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  h IN */.        
2aec0 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61    assert( seenVa
2aed0 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20  r && seenIn );. 
2aee0 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
2aef0 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
2af00 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2af10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2af20 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c    memset(pUsage,
2af30 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67   0, sizeof(pUsag
2af40 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e  e[0])*pIdxInfo->
2af50 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
2af60 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
2af70 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2af80 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
2af90 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2afa0 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  );.    pIdxInfo-
2afb0 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  >idxStr = 0;.   
2afc0 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
2afd0 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  m = 0;.    pIdxI
2afe0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2aff0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
2b000 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2b010 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
2b020 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
2b030 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49  matedCost = SQLI
2b040 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f  TE_BIG_DBL / (do
2b050 75 62 6c 65 29 32 3b 0a 20 20 20 20 72 63 20 3d  uble)2;.    rc =
2b060 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
2b070 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64  Parse, pTab, pId
2b080 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20  xInfo);.    if( 
2b090 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c  rc ) goto whereL
2b0a0 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
2b0b0 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
2b0c0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
2b0d0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
2b0e0 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
2b0f0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
2b100 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30  pNew->prereq = 0
2b110 3b 0a 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d  ;.    mxTerm = -
2b120 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
2b130 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
2b140 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20  nstraint );.    
2b150 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
2b160 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65  traint; i++) pNe
2b170 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30  w->aLTerm[i] = 0
2b180 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74  ;.    pNew->u.vt
2b190 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b  ab.omitMask = 0;
2b1a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b1b0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
2b1c0 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
2b1d0 20 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20       if( (iTerm 
2b1e0 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
2b1f0 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
2b200 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64  .        j = pId
2b210 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
2b220 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
2b230 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69  iTerm>=nConstrai
2b240 6e 74 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  nt.         || j
2b250 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a  <0.         || j
2b260 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20  >=pWC->nTerm.   
2b270 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61        || pNew->a
2b280 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a  LTerm[iTerm]!=0.
2b290 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2b2a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b2b0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
2b2c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2b2d0 67 28 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42  g(pParse, "%s.xB
2b2e0 65 73 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75  estIndex() malfu
2b2f0 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a  nction", pTab->z
2b300 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2b310 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
2b320 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
2b330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
2b340 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d  estcase( iTerm==
2b350 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b  nConstraint-1 );
2b360 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2b370 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( j==0 );.     
2b380 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
2b390 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
2b3a0 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
2b3b0 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
2b3c0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2b3d0 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
2b3e0 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
2b3f0 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e  assert( iTerm<pN
2b400 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
2b410 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
2b420 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72  rm[iTerm] = pTer
2b430 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  m;.        if( i
2b440 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78  Term>mxTerm ) mx
2b450 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20  Term = iTerm;.  
2b460 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b470 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20  iTerm==15 );.   
2b480 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2b490 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20  Term==16 );.    
2b4a0 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
2b4b0 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
2b4c0 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
2b4d0 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
2b4e0 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  <iTerm;.        
2b4f0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2b500 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
2b510 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2b520 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  f( pUsage[i].omi
2b530 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
2b540 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74      /* Do not at
2b550 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20  tempt to use an 
2b560 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66  IN constraint if
2b570 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
2b580 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
2b590 2a 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20  * says that the 
2b5a0 65 71 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f  equivalent EQ co
2b5b0 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
2b5c0 62 65 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65  be safely omitte
2b5d0 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  d..            *
2b5e0 2a 20 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d  * If we do attem
2b5f0 70 74 20 74 6f 20 75 73 65 20 73 75 63 68 20 61  pt to use such a
2b600 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d   constraint, som
2b610 65 20 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a  e rows might be.
2b620 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
2b630 65 70 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f  epeated in the o
2b640 75 74 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20  utput. */.      
2b650 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b660 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b670 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20     /* A virtual 
2b680 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f  table that is co
2b690 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20  nstrained by an 
2b6a0 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f  IN clause may no
2b6b0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
2b6c0 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52  onsume the ORDER
2b6d0 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75   BY clause becau
2b6e0 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72  se (1) the order
2b6f0 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20   of IN terms.   
2b700 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
2b710 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c   necessarily rel
2b720 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65  ated to the orde
2b730 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d  r of output term
2b740 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
2b750 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20  ** (2) Multiple 
2b760 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73  outputs from a s
2b770 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77  ingle IN value w
2b780 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20  ill not merge.  
2b790 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
2b7a0 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
2b7b0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
2b7c0 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
2b7d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b7e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2b7f0 28 20 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( i>=nConstraint
2b800 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
2b810 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b  nLTerm = mxTerm+
2b820 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
2b830 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
2b840 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
2b850 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
2b860 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49  b.idxNum = pIdxI
2b870 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20  nfo->idxNum;.   
2b880 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2b890 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
2b8a0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2b8b0 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64  dxStr;.      pId
2b8c0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
2b8d0 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
2b8e0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2b8f0 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
2b900 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20  o->idxStr;.     
2b910 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73   pNew->u.vtab.is
2b920 4f 72 64 65 72 65 64 20 3d 20 28 75 38 29 28 28  Ordered = (u8)((
2b930 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
2b940 42 79 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20  By!=0).         
2b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b960 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
2b970 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
2b980 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20  Consumed);.     
2b990 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2b9a0 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  0;.      pNew->r
2b9b0 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 46  Run = whereCostF
2b9c0 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e  romDouble(pIdxIn
2b9d0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
2b9e0 74 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  t);.      /* TUN
2b9f0 49 4e 47 3a 20 45 76 65 72 79 20 76 69 72 74 75  ING: Every virtu
2ba00 61 6c 20 74 61 62 6c 65 20 71 75 65 72 79 20 72  al table query r
2ba10 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a  eturns 25 rows *
2ba20 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  /.      pNew->nO
2ba30 75 74 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74  ut = 46;  assert
2ba40 28 20 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28  ( 46==whereCost(
2ba50 32 35 29 20 29 3b 0a 20 20 20 20 20 20 77 68 65  25) );.      whe
2ba60 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
2ba70 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
2ba80 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
2ba90 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
2baa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2bab0 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74  _free(pNew->u.vt
2bac0 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
2bad0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2bae0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
2baf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2bb00 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64    ..whereLoopAdd
2bb10 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28  Vtab_exit:.  if(
2bb20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
2bb30 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
2bb40 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
2bb50 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
2bb60 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2bb70 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72  , pIdxInfo);.  r
2bb80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
2bb90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2bba0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
2bbb0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65  /../*.** Add Whe
2bbc0 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74  reLoop entries t
2bbd0 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d  o handle OR term
2bbe0 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66  s.  This works f
2bbf0 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72  or either.** btr
2bc00 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ees or virtual t
2bc10 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
2bc20 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2bc30 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  dOr(WhereLoopBui
2bc40 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
2bc50 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b  Bitmask mExtra){
2bc60 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2bc70 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
2bc80 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65  >pWInfo;.  Where
2bc90 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
2bca0 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
2bcb0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
2bcc0 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69  rm, *pWCEnd;.  i
2bcd0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2bce0 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  K;.  int iCur;. 
2bcf0 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
2bd00 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
2bd10 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c  Builder sSubBuil
2bd20 64 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 73  d;.  WhereLoop s
2bd30 42 65 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  Best;.  struct S
2bd40 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2bd50 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70  em;.  .  pWC = p
2bd60 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
2bd70 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
2bd80 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  lFlags & WHERE_A
2bd90 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e  ND_ONLY ) return
2bda0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57   SQLITE_OK;.  pW
2bdb0 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
2bdc0 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e  pWC->nTerm;.  pN
2bdd0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
2bde0 4e 65 77 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72  New;..  for(pTer
2bdf0 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
2be00 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51  pWCEnd && rc==SQ
2be10 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b  LITE_OK; pTerm++
2be20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  ){.    if( (pTer
2be30 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2be40 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26  O_OR)!=0.     &&
2be50 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   (pTerm->u.pOrIn
2be60 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20  fo->indexable & 
2be70 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  pNew->maskSelf)!
2be80 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
2be90 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63   WhereClause * c
2bea0 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54  onst pOrWC = &pT
2beb0 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
2bec0 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  wc;.      WhereT
2bed0 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  erm * const pOrW
2bee0 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61  CEnd = &pOrWC->a
2bef0 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  [pOrWC->nTerm];.
2bf00 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
2bf10 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20  *pOrTerm;.      
2bf20 57 68 65 72 65 43 6f 73 74 20 72 54 6f 74 61 6c  WhereCost rTotal
2bf30 20 3d 20 30 3b 0a 20 20 20 20 20 20 57 68 65 72   = 0;.      Wher
2bf40 65 43 6f 73 74 20 6e 52 6f 77 20 3d 20 30 3b 0a  eCost nRow = 0;.
2bf50 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72        Bitmask pr
2bf60 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20  ereq = mExtra;. 
2bf70 20 20 20 0a 20 20 20 20 20 20 77 68 65 72 65 4c     .      whereL
2bf80 6f 6f 70 49 6e 69 74 28 26 73 42 65 73 74 29 3b  oopInit(&sBest);
2bf90 0a 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 70  .      pItem = p
2bfa0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2bfb0 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
2bfc0 0a 20 20 20 20 20 20 69 43 75 72 20 3d 20 70 49  .      iCur = pI
2bfd0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
2bfe0 20 20 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20      sSubBuild = 
2bff0 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20  *pBuilder;.     
2c000 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65   sSubBuild.pOrde
2c010 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
2c020 53 75 62 42 75 69 6c 64 2e 70 42 65 73 74 20 3d  SubBuild.pBest =
2c030 20 26 73 42 65 73 74 3b 0a 0a 20 20 20 20 20 20   &sBest;..      
2c040 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57  for(pOrTerm=pOrW
2c050 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f  C->a; pOrTerm<pO
2c060 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b  rWCEnd; pOrTerm+
2c070 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2c080 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
2c090 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30  tor & WO_AND)!=0
2c0a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
2c0b0 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70  ubBuild.pWC = &p
2c0c0 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
2c0d0 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
2c0e0 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
2c0f0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
2c100 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
2c110 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d   tempWC.pWInfo =
2c120 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
2c130 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
2c140 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
2c150 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70         tempWC.op
2c160 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
2c170 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72       tempWC.nTer
2c180 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
2c190 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54   tempWC.a = pOrT
2c1a0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  erm;.          s
2c1b0 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
2c1c0 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20  tempWC;.        
2c1d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2c1e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2c1f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 42 65     }.        sBe
2c200 73 74 2e 6d 61 73 6b 53 65 6c 66 20 3d 20 30 3b  st.maskSelf = 0;
2c210 0a 20 20 20 20 20 20 20 20 73 42 65 73 74 2e 72  .        sBest.r
2c220 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
2c230 20 20 20 73 42 65 73 74 2e 72 52 75 6e 20 3d 20     sBest.rRun = 
2c240 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
2c250 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2c260 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  BLE.        if( 
2c270 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
2c280 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
2c290 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2c2a0 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73 53  opAddVirtual(&sS
2c2b0 75 62 42 75 69 6c 64 29 3b 0a 20 20 20 20 20 20  ubBuild);.      
2c2c0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2c2d0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2c2e0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2c2f0 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42  pAddBtree(&sSubB
2c300 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20  uild, mExtra);. 
2c310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c320 20 2f 2a 20 73 42 65 73 74 2e 6d 61 73 6b 53 65   /* sBest.maskSe
2c330 6c 66 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72  lf is always zer
2c340 6f 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  o if an error oc
2c350 63 75 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  curs */.        
2c360 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2c370 54 45 5f 4f 4b 20 7c 7c 20 73 42 65 73 74 2e 6d  TE_OK || sBest.m
2c380 61 73 6b 53 65 6c 66 3d 3d 30 20 29 3b 0a 20 20  askSelf==0 );.  
2c390 20 20 20 20 20 20 69 66 28 20 73 42 65 73 74 2e        if( sBest.
2c3a0 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 29 20 62 72  maskSelf==0 ) br
2c3b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eak;.        ass
2c3c0 65 72 74 28 20 73 42 65 73 74 2e 72 53 65 74 75  ert( sBest.rSetu
2c3d0 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  p==0 );.        
2c3e0 72 54 6f 74 61 6c 20 3d 20 77 68 65 72 65 43 6f  rTotal = whereCo
2c3f0 73 74 41 64 64 28 72 54 6f 74 61 6c 2c 20 73 42  stAdd(rTotal, sB
2c400 65 73 74 2e 72 52 75 6e 29 3b 0a 20 20 20 20 20  est.rRun);.     
2c410 20 20 20 6e 52 6f 77 20 3d 20 77 68 65 72 65 43     nRow = whereC
2c420 6f 73 74 41 64 64 28 6e 52 6f 77 2c 20 73 42 65  ostAdd(nRow, sBe
2c430 73 74 2e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  st.nOut);.      
2c440 20 20 70 72 65 72 65 71 20 7c 3d 20 73 42 65 73    prereq |= sBes
2c450 74 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20  t.prereq;.      
2c460 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2c470 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 31 20  pNew->nLSlot>=1 
2c480 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 42 65  );.      if( sBe
2c490 73 74 2e 6d 61 73 6b 53 65 6c 66 20 29 7b 0a 20  st.maskSelf ){. 
2c4a0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
2c4b0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
2c4c0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
2c4d0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
2c4e0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2c4f0 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
2c500 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2c510 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
2c520 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2c530 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20   rTotal;.       
2c540 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52   pNew->nOut = nR
2c550 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ow;.        pNew
2c560 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72 65  ->prereq = prere
2c570 71 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  q;.        memse
2c580 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73  t(&pNew->u, 0, s
2c590 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b  izeof(pNew->u));
2c5a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
2c5b0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2c5c0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2c5d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 65       }.      whe
2c5e0 72 65 4c 6f 6f 70 43 6c 65 61 72 28 70 57 49 6e  reLoopClear(pWIn
2c5f0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  fo->pParse->db, 
2c600 26 73 42 65 73 74 29 3b 0a 20 20 20 20 7d 0a 20  &sBest);.    }. 
2c610 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c620 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
2c630 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2c640 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ts for all table
2c650 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s .*/.static int
2c660 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c   whereLoopAddAll
2c670 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
2c680 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
2c690 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2c6a0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2c6b0 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20  Info;.  Bitmask 
2c6c0 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69  mExtra = 0;.  Bi
2c6d0 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30  tmask mPrior = 0
2c6e0 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
2c6f0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2c700 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
2c710 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
2c720 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2c730 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
2c740 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
2c750 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54  se->db;.  int nT
2c760 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
2c770 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72  >nLevel;.  int r
2c780 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c790 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70   u8 priorJoinTyp
2c7a0 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f  e = 0;.  WhereLo
2c7b0 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20  op *pNew;..  /* 
2c7c0 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61  Loop over the ta
2c7d0 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
2c7e0 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
2c7f0 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d  ight */.  pNew =
2c800 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2c810 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
2c820 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54  (pNew);.  for(iT
2c830 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62  ab=0, pItem=pTab
2c840 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54  List->a; iTab<nT
2c850 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20  abList; iTab++, 
2c860 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e  pItem++){.    pN
2c870 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b  ew->iTab = iTab;
2c880 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  .    pNew->maskS
2c890 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70  elf = getMask(&p
2c8a0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
2c8b0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
2c8c0 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65  ;.    if( ((pIte
2c8d0 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f  m->jointype|prio
2c8e0 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28 4a 54  rJoinType) & (JT
2c8f0 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
2c900 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78  !=0 ){.      mEx
2c910 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20  tra = mPrior;.  
2c920 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69    }.    priorJoi
2c930 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a  nType = pItem->j
2c940 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28  ointype;.    if(
2c950 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
2c960 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
2c970 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2c980 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64  ddVirtual(pBuild
2c990 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
2c9a0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2c9b0 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
2c9c0 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
2c9d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2c9e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c9f0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2ca00 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65  oopAddOr(pBuilde
2ca10 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
2ca20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20  }.    mPrior |= 
2ca30 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
2ca40 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62      if( rc || db
2ca50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2ca60 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68   break;.  }.  wh
2ca70 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
2ca80 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
2ca90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   rc;.}../*.** Ex
2caa0 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74  amine a WherePat
2cab0 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69  h (with the addi
2cac0 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72  tion of the extr
2cad0 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74  a WhereLoop of t
2cae0 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65  he 5th.** parame
2caf0 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20  ters) to see if 
2cb00 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20  it outputs rows 
2cb10 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
2cb20 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72   ORDER BY.** (or
2cb30 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f   GROUP BY) witho
2cb40 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73  ut requiring a s
2cb50 65 70 61 72 61 74 65 20 73 6f 75 72 63 65 20 6f  eparate source o
2cb60 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72  peration.  Retur
2cb70 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a 20  n:.** .**    0: 
2cb80 20 4f 52 44 45 52 20 42 59 20 69 73 20 6e 6f 74   ORDER BY is not
2cb90 20 73 61 74 69 73 66 69 65 64 2e 20 20 53 6f 72   satisfied.  Sor
2cba0 74 69 6e 67 20 72 65 71 75 69 72 65 64 0a 2a 2a  ting required.**
2cbb0 20 20 20 20 31 3a 20 20 4f 52 44 45 52 20 42 59      1:  ORDER BY
2cbc0 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 20 20   is satisfied.  
2cbd0 20 20 20 20 4f 6d 69 74 20 73 6f 72 74 69 6e 67      Omit sorting
2cbe0 0a 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f  .**   -1:  Unkno
2cbf0 77 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 0a  wn at this time.
2cc00 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
2cc10 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
2cc20 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68  iesOrderBy(.  Wh
2cc30 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
2cc40 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2cc50 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
2cc60 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2cc70 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f     /* ORDER BY o
2cc80 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49  r GROUP BY or DI
2cc90 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f  STINCT clause to
2cca0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72   check */.  Wher
2ccb0 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20  ePath *pPath,   
2ccc0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61    /* The WherePa
2ccd0 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  th to check */. 
2cce0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
2ccf0 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20         /* Might 
2cd00 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52  contain WHERE_GR
2cd10 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44  OUPBY or WHERE_D
2cd20 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75  ISTINCTBY */.  u
2cd30 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20  16 nLoop,       
2cd40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2cd50 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61  f entries in pPa
2cd60 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
2cd70 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
2cd80 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  t,     /* Add th
2cd90 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  is WhereLoop to 
2cda0 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68  the end of pPath
2cdb0 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42  ->aLoop[] */.  B
2cdc0 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b  itmask *pRevMask
2cdd0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73       /* OUT: Mas
2cde0 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  k of WhereLoops 
2cdf0 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73  to run in revers
2ce00 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20  e order */.){.  
2ce10 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20  u8 revSet;      
2ce20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ce30 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f   rev is known */
2ce40 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20  .  u8 rev;      
2ce50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
2ce60 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72  osite sort order
2ce70 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b   */.  u8 revIdx;
2ce80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2ce90 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20  ndex sort order 
2cea0 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44  */.  u8 isOrderD
2ceb0 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c  istinct;   /* Al
2cec0 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f  l prior WhereLoo
2ced0 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73  ps are order-dis
2cee0 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69  tinct */.  u8 di
2cef0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20  stinctColumns;  
2cf00 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2cf10 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20  loop has UNIQUE 
2cf20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
2cf30 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68   */.  u8 isMatch
2cf40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
2cf50 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61  Column matches a
2cf60 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
2cf70 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2cf80 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20    u16 nColumn;  
2cf90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2cfa0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
2cfb0 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20  pIndex */.  u16 
2cfc0 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
2cfd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d    /* Number term
2cfe0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
2cff0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
2d000 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
2d010 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2d020 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61  WhereLoop in pPa
2d030 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  th being process
2d040 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  ed */.  int i, j
2d050 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d060 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2d070 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
2d080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2d090 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63  sor number for c
2d0a0 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
2d0b0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
2d0c0 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  n;          /* A
2d0d0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
2d0e0 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72  ithin table iCur
2d0f0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2d100 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 2f 2a 20 43  *pLoop;     /* C
2d110 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
2d120 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
2d130 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  . */.  WhereTerm
2d140 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20   *pTerm;     /* 
2d150 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
2d160 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2d170 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42  e */.  Expr *pOB
2d180 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Expr;        /* 
2d190 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
2d1a0 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  om the ORDER BY 
2d1b0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c  clause */.  Coll
2d1c0 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
2d1d0 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e    /* COLLATE fun
2d1e0 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52  ction from an OR
2d1f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
2d200 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  rm */.  Index *p
2d210 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a  Index;        /*
2d220 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63   The index assoc
2d230 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70  iated with pLoop
2d240 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2d250 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
2d260 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
2d270 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2d280 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53  */.  Bitmask obS
2d290 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61  at = 0;    /* Ma
2d2a0 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  sk of ORDER BY t
2d2b0 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73  erms satisfied s
2d2c0 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61  o far */.  Bitma
2d2d0 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20  sk obDone;      
2d2e0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2d2f0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
2d300 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65  /.  Bitmask orde
2d310 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20  rDistinctMask;  
2d320 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77  /* Mask of all w
2d330 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70  ell-ordered loop
2d340 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72  s */.  Bitmask r
2d350 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
2d360 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e     /* Mask of in
2d370 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20  ner loops */..  
2d380 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  /*.  ** We say t
2d390 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
2d3a0 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20  "one-row" if it 
2d3b0 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72  generates no mor
2d3c0 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20  e than one.  ** 
2d3d0 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20  row of output.  
2d3e0 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f  A WhereLoop is o
2d3f0 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66  ne-row if all of
2d400 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2d410 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28  re true:.  **  (
2d420 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c  a) All index col
2d430 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20  umns match with 
2d440 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e  WHERE_COLUMN_EQ.
2d450 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69  .  **  (b) The i
2d460 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20  ndex is unique. 
2d470 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f   ** Any WhereLoo
2d480 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f  p with an WHERE_
2d490 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72  COLUMN_EQ constr
2d4a0 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69  aint on the rowi
2d4b0 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20  d is one-row..  
2d4c0 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  ** Every one-row
2d4d0 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20   WhereLoop will 
2d4e0 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f  have the WHERE_O
2d4f0 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e  NEROW bit set in
2d500 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20   wsFlags..  **. 
2d510 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57   ** We say the W
2d520 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64  hereLoop is "ord
2d530 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20  er-distinct" if 
2d540 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d  the set of colum
2d550 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61  ns from.  ** tha
2d560 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  t WhereLoop that
2d570 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45   are in the ORDE
2d580 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
2d590 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
2d5a0 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ery.  ** row of 
2d5b0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  the WhereLoop.  
2d5c0 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
2d5d0 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d  ereLoop is autom
2d5e0 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72  atically.  ** or
2d5f0 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20  der-distinct.   
2d600 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  A WhereLoop that
2d610 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20   has no columns 
2d620 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
2d630 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e  clause.  ** is n
2d640 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ot order-distinc
2d650 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  t. To be order-d
2d660 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71  istinct is not q
2d670 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73  uite the same as
2d680 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51   being.  ** UNIQ
2d690 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55  UE since a UNIQU
2d6a0 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65  E column or inde
2d6b0 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  x can have multi
2d6c0 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20  ple rows that . 
2d6d0 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64   ** are NULL and
2d6e0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
2d6f0 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20   equivalent for 
2d700 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f  the purpose of o
2d710 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
2d720 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d   ** To be order-
2d730 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f  distinct, the co
2d740 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e  lumns must be UN
2d750 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
2d760 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  L..  **.  ** The
2d770 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62   rowid for a tab
2d780 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49  le is always UNI
2d790 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
2d7a0 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65   so whenever the
2d7b0 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65  .  ** rowid appe
2d7c0 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  ars in the ORDER
2d7d0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20   BY clause, the 
2d7e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
2d7f0 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20  ereLoop is.  ** 
2d800 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72  automatically or
2d810 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
2d820 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  */..  assert( pO
2d830 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 0a 20 20  rderBy!=0 );..  
2d840 2f 2a 20 53 6f 72 74 61 62 69 6c 69 74 79 20 6f  /* Sortability o
2d850 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  f virtual tables
2d860 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
2d870 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
2d880 20 6d 65 74 68 6f 64 0a 20 20 2a 2a 20 6f 66 20   method.  ** of 
2d890 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
2d8a0 65 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 69 66  e itself */.  if
2d8b0 28 20 70 4c 61 73 74 2d 3e 77 73 46 6c 61 67 73  ( pLast->wsFlags
2d8c0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
2d8d0 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 74 65 73  TABLE ){.    tes
2d8e0 74 63 61 73 65 28 20 6e 4c 6f 6f 70 3e 30 20 29  tcase( nLoop>0 )
2d8f0 3b 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20  ;  /* True when 
2d900 6f 75 74 65 72 20 6c 6f 6f 70 73 20 61 72 65 20  outer loops are 
2d910 6f 6e 65 2d 72 6f 77 20 61 6e 64 20 6d 61 74 63  one-row and matc
2d920 68 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h .             
2d930 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2d940 6e 6f 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  no ORDER BY term
2d950 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
2d960 70 4c 61 73 74 2d 3e 75 2e 76 74 61 62 2e 69 73  pLast->u.vtab.is
2d970 4f 72 64 65 72 65 64 3b 0a 20 20 7d 0a 20 20 69  Ordered;.  }.  i
2d980 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69  f( nLoop && Opti
2d990 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
2d9a0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65  (db, SQLITE_Orde
2d9b0 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65  rByIdxJoin) ) re
2d9c0 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65  turn 0;..  nOrde
2d9d0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  rBy = pOrderBy->
2d9e0 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73  nExpr;.  testcas
2d9f0 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53  e( nOrderBy==BMS
2da00 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  -1 );.  if( nOrd
2da10 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74  erBy>BMS-1 ) ret
2da20 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f  urn 0;  /* Canno
2da30 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c  t optimize overl
2da40 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59  y large ORDER BY
2da50 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69  s */.  isOrderDi
2da60 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62  stinct = 1;.  ob
2da70 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e  Done = MASKBIT(n
2da80 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72  OrderBy)-1;.  or
2da90 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20  derDistinctMask 
2daa0 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30  = 0;.  ready = 0
2dab0 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  ;.  for(iLoop=0;
2dac0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2dad0 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65   && obSat<obDone
2dae0 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70   && iLoop<=nLoop
2daf0 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
2db00 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65  if( iLoop>0 ) re
2db10 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61  ady |= pLoop->ma
2db20 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f  skSelf;.    pLoo
2db30 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20  p = iLoop<nLoop 
2db40 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  ? pPath->aLoop[i
2db50 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20  Loop] : pLast;. 
2db60 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
2db70 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2db80 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
2db90 3d 3d 30 20 29 3b 0a 20 20 20 20 69 43 75 72 20  ==0 );.    iCur 
2dba0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2dbb0 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
2dbc0 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20  b].iCursor;..   
2dbd0 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
2dbe0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 58   ORDER BY term X
2dbf0 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d   that is a colum
2dc00 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  n in the table o
2dc10 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  f.    ** the cur
2dc20 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68  rent loop for wh
2dc30 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65 72  ich there is ter
2dc40 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20  m in the WHERE. 
2dc50 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
2dc60 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55  the form X IS NU
2dc70 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72  LL or X=? that r
2dc80 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75  eference only ou
2dc90 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73  ter.    ** loops
2dca0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
2dcb0 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
2dcc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2dcd0 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
2dce0 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
2dcf0 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d  .      pOBExpr =
2dd00 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
2dd10 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
2dd20 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2dd30 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
2dd40 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
2dd50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2dd60 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
2dd70 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
2dd80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54  ntinue;.      pT
2dd90 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  erm = findTerm(&
2dda0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75  pWInfo->sWC, iCu
2ddb0 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  r, pOBExpr->iCol
2ddc0 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
2ddd0 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65 61              ~rea
2dde0 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e  dy, WO_EQ|WO_ISN
2ddf0 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ULL, 0);.      i
2de00 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f  f( pTerm==0 ) co
2de10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
2de20 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2de30 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 26 26  tor&WO_EQ)!=0 &&
2de40 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
2de50 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
2de60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20  const char *z1, 
2de70 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  *z2;.        pCo
2de80 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2de90 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
2dea0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
2deb0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2dec0 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
2ded0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
2dee0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2def0 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z1 = pColl->z
2df00 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43  Name;.        pC
2df10 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2df20 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
2df30 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  >pParse, pTerm->
2df40 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2df50 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
2df60 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
2df70 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  ll;.        z2 =
2df80 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
2df90 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2dfa0 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
2dfb0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2dfc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f  .      }.      o
2dfd0 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
2dfe0 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  i);.    }..    i
2dff0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
2e000 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
2e010 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  W)==0 ){.      i
2e020 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
2e030 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b  s & WHERE_IPK ){
2e040 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20  .        pIndex 
2e050 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  = 0;.        nCo
2e060 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  lumn = 0;.      
2e070 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65  }else if( (pInde
2e080 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
2e090 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c  ee.pIndex)==0 ||
2e0a0 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
2e0b0 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  red ){.        r
2e0c0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
2e0d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 43  else{.        nC
2e0e0 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
2e0f0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  nColumn;.       
2e100 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2e110 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
2e120 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20  or!=OE_None;.   
2e130 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c     }..      /* L
2e140 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
2e150 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
2e160 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69  ndex and deal wi
2e170 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20  th the ones.    
2e180 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f    ** that are no
2e190 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  t constrained by
2e1a0 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20   == or IN..     
2e1b0 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20   */.      rev = 
2e1c0 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20  revSet = 0;.    
2e1d0 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
2e1e0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  s = 0;.      for
2e1f0 28 6a 3d 30 3b 20 6a 3c 3d 6e 43 6f 6c 75 6d 6e  (j=0; j<=nColumn
2e200 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2e210 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54  u8 bOnce;   /* T
2e220 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f  rue to run the O
2e230 52 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c  RDER BY search l
2e240 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  oop */..        
2e250 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20  /* Skip over == 
2e260 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d  and IS NULL term
2e270 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
2e280 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   j<pLoop->u.btre
2e290 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26  e.nEq.         &
2e2a0 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61  & ((i = pLoop->a
2e2b0 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61  LTerm[j]->eOpera
2e2c0 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f  tor) & (WO_EQ|WO
2e2d0 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20  _ISNULL))!=0.   
2e2e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2e2f0 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53 4e    if( i & WO_ISN
2e300 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
2e310 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
2e320 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a  rderDistinct );.
2e330 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
2e340 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
2e350 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e360 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2e370 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20    .        }..  
2e380 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65        /* Get the
2e390 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
2e3a0 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f  n the table (iCo
2e3b0 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f  lumn) and sort o
2e3c0 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rder.        ** 
2e3d0 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65  (revIdx) for the
2e3e0 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   j-th column of 
2e3f0 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
2e400 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2e410 28 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ( j<nColumn ){. 
2e420 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d           /* Norm
2e430 61 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  al index columns
2e440 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 43   */.          iC
2e450 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
2e460 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
2e470 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
2e480 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
2e490 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  er[j];.         
2e4a0 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
2e4b0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  ndex->pTable->iP
2e4c0 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20  Key ) iColumn = 
2e4d0 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
2e4e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2e4f0 54 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  The ROWID column
2e500 20 61 74 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20   at the end */. 
2e510 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2e520 20 6a 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20   j==nColumn );. 
2e530 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
2e540 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
2e550 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20   revIdx = 0;.   
2e560 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2e570 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69  /* An unconstrai
2e580 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ned column that 
2e590 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65  might be NULL me
2e5a0 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20  ans that this.  
2e5b0 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f        ** WhereLo
2e5c0 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f  op is not well-o
2e5d0 72 64 65 72 65 64 20 0a 20 20 20 20 20 20 20 20  rdered .        
2e5e0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
2e5f0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20  sOrderDistinct. 
2e600 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75          && iColu
2e610 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26  mn>=0.         &
2e620 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  & j>=pLoop->u.bt
2e630 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
2e640 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62   && pIndex->pTab
2e650 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
2e660 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20  ].notNull==0.   
2e670 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2e680 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2e690 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
2e6a0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e  ..        /* Fin
2e6b0 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  d the ORDER BY t
2e6c0 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70  erm that corresp
2e6d0 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68  onds to the j-th
2e6e0 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20   column.        
2e6f0 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
2e700 61 6e 64 20 61 6e 64 20 6d 61 72 6b 20 74 68 61  and and mark tha
2e710 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  t ORDER BY term 
2e720 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  off .        */.
2e730 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20          bOnce = 
2e740 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74  1;.        isMat
2e750 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
2e760 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26  for(i=0; bOnce &
2e770 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  & i<nOrderBy; i+
2e780 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2e790 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
2e7a0 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
2e7b0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78  .          pOBEx
2e7c0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2e7d0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
2e7e0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2e7f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
2e800 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67  tcase( wctrlFlag
2e810 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42  s & WHERE_GROUPB
2e820 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Y );.          t
2e830 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
2e840 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
2e850 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20  INCTBY );.      
2e860 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
2e870 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f  ags & (WHERE_GRO
2e880 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49  UPBY|WHERE_DISTI
2e890 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e  NCTBY))==0 ) bOn
2e8a0 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
2e8b0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
2e8c0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
2e8d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2e8e0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2e8f0 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
2e900 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2e910 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2e920 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
2e930 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2e940 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
2e950 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
2e960 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2e970 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2e980 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
2e990 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2e9a0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2e9b0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
2e9c0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
2e9d0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
2e9e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2e9f0 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
2ea00 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  me, pIndex->azCo
2ea10 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74  ll[j])!=0 ) cont
2ea20 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2ea30 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61  }.          isMa
2ea40 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  tch = 1;.       
2ea50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2ea60 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2ea70 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  isMatch ){.     
2ea80 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
2ea90 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2eaa0 20 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74    testcase( dist
2eab0 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29  inctColumns==0 )
2eac0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
2ead0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
2eae0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
2eaf0 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
2eb00 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
2eb10 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49          if( (pWI
2eb20 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2eb30 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29  & WHERE_GROUPBY)
2eb40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2eb50 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
2eb60 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69  the sort order i
2eb70 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20  s compatible in 
2eb80 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2eb90 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
2eba0 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73  ** Sort order is
2ebb0 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20   irrelevant for 
2ebc0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2ebd0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
2ebe0 20 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a    if( revSet ){.
2ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2ec00 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29  ( (rev ^ revIdx)
2ec10 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  !=pOrderBy->a[i]
2ec20 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
2ec30 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20  urn 0;.         
2ec40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ec50 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65          rev = re
2ec60 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d  vIdx ^ pOrderBy-
2ec70 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
2ec80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2ec90 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61  f( rev ) *pRevMa
2eca0 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c  sk |= MASKBIT(iL
2ecb0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oop);.          
2ecc0 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a      revSet = 1;.
2ecd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2ece0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ecf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ed00 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66     /* No match f
2ed10 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
2ed20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c    if( j==0 || j<
2ed30 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
2ed40 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2ed50 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2ed60 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
2ed70 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
2ed80 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
2ed90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
2eda0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2edb0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f       } /* end Lo
2edc0 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65  op over all inde
2edd0 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  x columns */.   
2ede0 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43     if( distinctC
2edf0 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20  olumns ){.      
2ee00 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
2ee10 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29  derDistinct==0 )
2ee20 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
2ee30 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
2ee40 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20       }.    } /* 
2ee50 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72  end-if not one-r
2ee60 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61  ow */..    /* Ma
2ee70 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72  rk off any other
2ee80 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
2ee90 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70  that reference p
2eea0 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  Loop */.    if( 
2eeb0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2eec0 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69  ){.      orderDi
2eed0 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c  stinctMask |= pL
2eee0 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
2eef0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2ef00 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
2ef10 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b          Expr *p;
2ef20 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53  .        if( MAS
2ef30 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
2ef40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ef50 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79      p = pOrderBy
2ef60 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
2ef70 20 20 20 20 20 20 69 66 28 20 28 65 78 70 72 54        if( (exprT
2ef80 61 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e 66  ableUsage(&pWInf
2ef90 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 29 26  o->sMaskSet, p)&
2efa0 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61  ~orderDistinctMa
2efb0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
2efc0 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
2efd0 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
2efe0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2eff0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20  .  } /* End the 
2f000 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68  loop over all Wh
2f010 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75  ereLoops from ou
2f020 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f  ter-most down to
2f030 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20   inner-most */. 
2f040 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f   if( obSat==obDo
2f050 6e 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ne ) return 1;. 
2f060 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73   if( !isOrderDis
2f070 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
2f080 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ;.  return -1;.}
2f090 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
2f0a0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
2f0b0 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
2f0c0 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
2f0d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
2f0e0 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
2f0f0 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
2f100 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
2f110 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
2f120 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
2f130 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
2f140 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
2f150 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
2f160 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
2f170 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
2f180 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
2f190 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
2f1a0 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
2f1b0 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
2f1c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
2f1d0 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74  * Given the list
2f1e0 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
2f1f0 6a 65 63 74 73 20 6f 6e 20 70 57 49 6e 66 6f 2d  jects on pWInfo-
2f200 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f  >pLoops, this ro
2f210 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74  utine.** attempt
2f220 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f  s to find the lo
2f230 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74  west cost path t
2f240 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20  hat visits each 
2f250 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63  WhereLoop.** onc
2f260 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73  e.  This path is
2f270 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74   then loaded int
2f280 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b  o the pWInfo->a[
2f290 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e  ].pWLoop fields.
2f2a0 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68  .**.** Assume th
2f2b0 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  at the total num
2f2c0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
2f2d0 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65  ws that will nee
2f2e0 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a  d to be sorted.*
2f2f0 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73  * will be nRowEs
2f300 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67  t (in the 10*log
2f310 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  2 representation
2f320 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73  ).  Or, ignore s
2f330 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20  orting.** costs 
2f340 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a  if nRowEst==0..*
2f350 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
2f360 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
2f370 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
2f380 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   of a memory all
2f390 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72  ocation.** error
2f3a0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
2f3b0 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
2f3c0 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f  Solver(WhereInfo
2f3d0 20 2a 70 57 49 6e 66 6f 2c 20 57 68 65 72 65 43   *pWInfo, WhereC
2f3e0 6f 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20  ost nRowEst){.  
2f3f0 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20  int mxChoice;   
2f400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2f410 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
2f420 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68  imultaneous path
2f430 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69  s tracked */.  i
2f440 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt nLoop;       
2f450 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f460 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
2f470 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72  he join */.  Par
2f480 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
2f490 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
2f4a0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
2f4b0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
2f4c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f4d0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2f4e0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  ion */.  int iLo
2f4f0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
2f500 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2f510 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d  er over the term
2f520 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
2f530 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20  .  int ii, jj;  
2f540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f550 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
2f560 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 43 6f  .  WhereCost rCo
2f570 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
2f580 2f 2a 20 43 6f 73 74 20 6f 66 20 61 20 70 61 74  /* Cost of a pat
2f590 68 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  h */.  WhereCost
2f5a0 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20   mxCost = 0;    
2f5b0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
2f5c0 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20  ost of a set of 
2f5d0 70 61 74 68 73 20 2a 2f 0a 20 20 57 68 65 72 65  paths */.  Where
2f5e0 43 6f 73 74 20 72 53 6f 72 74 43 6f 73 74 3b 20  Cost rSortCost; 
2f5f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
2f600 74 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f 0a  to do a sort */.
2f610 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d    int nTo, nFrom
2f620 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
2f630 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65  umber of valid e
2f640 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20  ntries in aTo[] 
2f650 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20  and aFrom[] */. 
2f660 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f   WherePath *aFro
2f670 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  m;         /* Al
2f680 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74  l nFrom paths at
2f690 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65   the previous le
2f6a0 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
2f6b0 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20  th *aTo;        
2f6c0 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65     /* The nTo be
2f6d0 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20  st paths at the 
2f6e0 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f  current level */
2f6f0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46  .  WherePath *pF
2f700 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
2f710 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46  An element of aF
2f720 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72  rom[] that we ar
2f730 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
2f740 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f    WherePath *pTo
2f750 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
2f760 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f  n element of aTo
2f770 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
2f780 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
2f790 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70  hereLoop *pWLoop
2f7a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
2f7b0 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
2f7c0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68   objects */.  Wh
2f7d0 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20  ereLoop **pX;   
2f7e0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2f7f0 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70  to divy up the p
2f800 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  Space memory */.
2f810 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20    char *pSpace; 
2f820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f830 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
2f840 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  used by this rou
2f850 74 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73  tine */..  pPars
2f860 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
2f870 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
2f880 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d  e->db;.  nLoop =
2f890 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b   pWInfo->nLevel;
2f8a0 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f  .  /* TUNING: Fo
2f8b0 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73  r simple queries
2f8c0 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20  , only the best 
2f8d0 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e  path is tracked.
2f8e0 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20  .  ** For 2-way 
2f8f0 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73  joins, the 5 bes
2f900 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c  t paths are foll
2f910 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a  owed..  ** For j
2f920 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72  oins of 3 or mor
2f930 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20  e tables, track 
2f940 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68  the 10 best path
2f950 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20  s */.  mxChoice 
2f960 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20 31  = (nLoop==1) ? 1
2f970 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35   : (nLoop==2 ? 5
2f980 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74   : 10);.  assert
2f990 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d  ( nLoop<=pWInfo-
2f9a0 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  >pTabList->nSrc 
2f9b0 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
2f9c0 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65  0x002, ("---- be
2f9d0 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29 3b  gin solver\n"));
2f9e0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
2f9f0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73  and initialize s
2fa00 70 61 63 65 20 66 6f 72 20 61 54 6f 20 61 6e 64  pace for aTo and
2fa10 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20 3d   aFrom */.  ii =
2fa20 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61   (sizeof(WherePa
2fa30 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65  th)+sizeof(Where
2fa40 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78  Loop*)*nLoop)*mx
2fa50 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70 61  Choice*2;.  pSpa
2fa60 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ce = sqlite3DbMa
2fa70 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69 69 29 3b  llocRaw(db, ii);
2fa80 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30  .  if( pSpace==0
2fa90 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2faa0 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20  _NOMEM;.  aTo = 
2fab0 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61  (WherePath*)pSpa
2fac0 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54  ce;.  aFrom = aT
2fad0 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65  o+mxChoice;.  me
2fae0 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73  mset(aFrom, 0, s
2faf0 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29  izeof(aFrom[0]))
2fb00 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c  ;.  pX = (WhereL
2fb10 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43  oop**)(aFrom+mxC
2fb20 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69  hoice);.  for(ii
2fb30 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72  =mxChoice*2, pFr
2fb40 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69  om=aTo; ii>0; ii
2fb50 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20  --, pFrom++, pX 
2fb60 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70  += nLoop){.    p
2fb70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58  From->aLoop = pX
2fb80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 64  ;.  }..  /* Seed
2fb90 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68   the search with
2fba0 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50   a single WhereP
2fbb0 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a  ath containing z
2fbc0 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a  ero WhereLoops..
2fbd0 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47    **.  ** TUNING
2fbe0 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  : Do not let the
2fbf0 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61   number of itera
2fc00 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32  tions go above 2
2fc10 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a  5.  If the cost.
2fc20 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e    ** of computin
2fc30 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
2fc40 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64  ndex is not paid
2fc50 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65   back within the
2fc60 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20 72   first 25.  ** r
2fc70 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ows, then do not
2fc80 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74   use the automat
2fc90 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61  ic index. */.  a
2fca0 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d  From[0].nRow = M
2fcb0 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  IN(pParse->nQuer
2fcc0 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73 73  yLoop, 46);  ass
2fcd0 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43 6f  ert( 46==whereCo
2fce0 73 74 28 32 35 29 20 29 3b 0a 20 20 6e 46 72 6f  st(25) );.  nFro
2fcf0 6d 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 50 72 65  m = 1;..  /* Pre
2fd00 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 73 74  compute the cost
2fd10 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20   of sorting the 
2fd20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 65 74  final result set
2fd30 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 0a  , if the caller.
2fd40 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 57    ** to sqlite3W
2fd50 68 65 72 65 42 65 67 69 6e 28 29 20 77 61 73 20  hereBegin() was 
2fd60 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
2fd70 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 72 53 6f  sorting */.  rSo
2fd80 72 74 43 6f 73 74 20 3d 20 30 3b 0a 20 20 69 66  rtCost = 0;.  if
2fd90 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
2fda0 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74  By==0 || nRowEst
2fdb0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d  ==0 ){.    aFrom
2fdc0 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 56 61 6c  [0].isOrderedVal
2fdd0 69 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  id = 1;.  }else{
2fde0 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  .    /* TUNING: 
2fdf0 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f  Estimated cost o
2fe00 66 20 73 6f 72 74 69 6e 67 20 69 73 20 4e 2a 6c  f sorting is N*l
2fe10 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
2fe20 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  s the.    ** num
2fe30 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
2fe40 77 73 2e 20 2a 2f 0a 20 20 20 20 72 53 6f 72 74  ws. */.    rSort
2fe50 43 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b  Cost = nRowEst +
2fe60 20 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74 29   estLog(nRowEst)
2fe70 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
2fe80 28 30 78 30 30 32 2c 28 22 2d 2d 2d 2d 20 73 6f  (0x002,("---- so
2fe90 72 74 20 63 6f 73 74 3d 25 2d 33 64 5c 6e 22 2c  rt cost=%-3d\n",
2fea0 20 72 53 6f 72 74 43 6f 73 74 29 29 3b 0a 20 20   rSortCost));.  
2feb0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
2fec0 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e  successively lon
2fed0 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75  ger WherePaths u
2fee0 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  sing the previou
2fef0 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a  s generation.  *
2ff00 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20  * of WherePaths 
2ff10 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72  as the basis for
2ff20 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70   the next.  Keep
2ff30 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78   track of the mx
2ff40 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74  Choice.  ** best
2ff50 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67   paths at each g
2ff60 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66  eneration */.  f
2ff70 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
2ff80 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
2ff90 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a  ){.    nTo = 0;.
2ffa0 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46      for(ii=0, pF
2ffb0 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46  rom=aFrom; ii<nF
2ffc0 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d  rom; ii++, pFrom
2ffd0 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
2ffe0 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  WLoop=pWInfo->pL
2fff0 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57  oops; pWLoop; pW
30000 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65  Loop=pWLoop->pNe
30010 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
30020 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77   Bitmask maskNew
30030 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
30040 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20  k revMask = 0;. 
30050 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65         u8 isOrde
30060 72 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f 6d  redValid = pFrom
30070 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
30080 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73 4f  ;.        u8 isO
30090 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e  rdered = pFrom->
300a0 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
300b0 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
300c0 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d  prereq & ~pFrom-
300d0 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
300e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
300f0 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d    if( (pWLoop->m
30100 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d  askSelf & pFrom-
30110 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
30120 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
30130 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
30140 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20  nt, pWLoop is a 
30150 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20  candidate to be 
30160 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a  the next loop. .
30170 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75          ** Compu
30180 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20  te its cost */. 
30190 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77         rCost = w
301a0 68 65 72 65 43 6f 73 74 41 64 64 28 70 57 4c 6f  hereCostAdd(pWLo
301b0 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f  op->rSetup,pWLoo
301c0 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d  p->rRun + pFrom-
301d0 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  >nRow);.        
301e0 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73  rCost = whereCos
301f0 74 41 64 64 28 72 43 6f 73 74 2c 20 70 46 72 6f  tAdd(rCost, pFro
30200 6d 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20 20  m->rCost);.     
30210 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
30220 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
30230 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
30240 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
30250 4f 72 64 65 72 65 64 56 61 6c 69 64 20 29 7b 0a  OrderedValid ){.
30260 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
30270 28 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  ( wherePathSatis
30280 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
30290 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
302a0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
302b0 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
302c0 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
302d0 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
302e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
302f0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
30300 65 76 4d 61 73 6b 29 20 29 7b 0a 20 20 20 20 20  evMask) ){.     
30310 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20         case 1:  
30320 2f 2a 20 59 65 73 2e 20 20 70 46 72 6f 6d 2b 70  /* Yes.  pFrom+p
30330 57 4c 6f 6f 70 20 64 6f 65 73 20 73 61 74 69 73  WLoop does satis
30340 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
30350 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
30360 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
30370 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d = 1;.         
30380 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
30390 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  lid = 1;.       
303a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
303b0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 30            case 0
303c0 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70 46 72 6f 6d  :  /* No.  pFrom
303d0 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c 20 72 65 71  +pWLoop will req
303e0 75 69 72 65 20 61 20 73 65 70 61 72 61 74 65 20  uire a separate 
303f0 73 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  sort */.        
30400 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
30410 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
30420 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
30430 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d = 1;.         
30440 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68 65       rCost = whe
30450 72 65 43 6f 73 74 41 64 64 28 72 43 6f 73 74 2c  reCostAdd(rCost,
30460 20 72 53 6f 72 74 43 6f 73 74 29 3b 0a 20 20 20   rSortCost);.   
30470 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
30480 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65  ;.            de
30490 66 61 75 6c 74 3a 20 2f 2a 20 43 61 6e 6e 6f 74  fault: /* Cannot
304a0 20 74 65 6c 6c 20 79 65 74 2e 20 20 54 72 79 20   tell yet.  Try 
304b0 61 67 61 69 6e 20 6f 6e 20 74 68 65 20 6e 65 78  again on the nex
304c0 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  t iteration */. 
304d0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
304e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
304f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30500 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b           revMask
30510 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
30520 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
30530 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
30540 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73   see if pWLoop s
30550 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74  hould be added t
30560 6f 20 74 68 65 20 6d 78 43 68 6f 69 63 65 20 62  o the mxChoice b
30570 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  est so far */.  
30580 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20        for(jj=0, 
30590 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b  pTo=aTo; jj<nTo;
305a0 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
305b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
305c0 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b  ->maskLoop==mask
305d0 4e 65 77 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72  New && pTo->isOr
305e0 64 65 72 65 64 56 61 6c 69 64 3d 3d 69 73 4f 72  deredValid==isOr
305f0 64 65 72 65 64 56 61 6c 69 64 20 29 7b 0a 20 20  deredValid ){.  
30600 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
30610 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
30620 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
30630 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
30640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30650 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
30660 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
30670 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 26 26 20  To>=mxChoice && 
30680 72 43 6f 73 74 3e 3d 6d 78 43 6f 73 74 20 29 7b  rCost>=mxCost ){
30690 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
306a0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
306b0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
306c0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
306d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
306e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
306f0 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20  intf("Skip   %s 
30700 63 6f 73 74 3d 25 33 64 20 6f 72 64 65 72 3d 25  cost=%3d order=%
30710 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
30720 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
30730 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
30740 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
30750 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
30760 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
30770 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65  alid ? (isOrdere
30780 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
30790 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
307a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
307b0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
307c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
307d0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61          /* Add a
307e0 20 6e 65 77 20 50 61 74 68 20 74 6f 20 74 68 65   new Path to the
307f0 20 61 54 6f 5b 5d 20 73 65 74 20 2a 2f 0a 20 20   aTo[] set */.  
30800 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c          if( nTo<
30810 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
30820 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
30830 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
30840 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f  the aTo set by o
30850 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ne */.          
30860 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20    jj = nTo++;.  
30870 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
30890 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20  w path replaces 
308a0 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20  the prior worst 
308b0 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65  to keep count be
308c0 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a  low mxChoice */.
308d0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
308e0 6a 6a 3d 6e 54 6f 2d 31 3b 20 61 54 6f 5b 6a 6a  jj=nTo-1; aTo[jj
308f0 5d 2e 72 43 6f 73 74 3c 6d 78 43 6f 73 74 3b 20  ].rCost<mxCost; 
30900 6a 6a 2d 2d 29 7b 20 61 73 73 65 72 74 28 6a 6a  jj--){ assert(jj
30910 3e 30 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  >0); }.         
30920 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f   }.          pTo
30930 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66   = &aTo[jj];.#if
30940 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
30950 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 20  NABLED.         
30960 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
30970 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
30980 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30990 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65  3DebugPrintf("Ne
309a0 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  w    %s cost=%-3
309b0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
309c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
309d0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
309e0 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
309f0 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20  p), rCost,.     
30a00 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
30a10 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f  eredValid ? (isO
30a20 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
30a30 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
30a40 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
30a50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30a60 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
30a70 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20 29 7b  >rCost<=rCost ){
30a80 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
30a90 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
30aa0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
30ab0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
30ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30ad0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
30ae0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
30af0 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20          "Skip   
30b00 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64  %s cost=%-3d ord
30b10 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
30b20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
30b30 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
30b40 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
30b50 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cost,.          
30b60 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
30b70 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65  dValid ? (isOrde
30b80 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29  red ? 'Y' : 'N')
30b90 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
30ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
30bb0 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73  bugPrintf("   vs
30bc0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72   %s cost=%-3d or
30bd0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
30be0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
30bf0 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
30c00 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
30c10 2d 3e 72 43 6f 73 74 2c 0a 20 20 20 20 20 20 20  ->rCost,.       
30c20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
30c30 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
30c40 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
30c50 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
30c60 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
30c70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
30c80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
30c90 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
30ca0 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st );.          
30cb0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
30cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30cd0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
30ce0 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20  >rCost==rCost+1 
30cf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
30d00 41 20 6e 65 77 20 61 6e 64 20 62 65 74 74 65 72  A new and better
30d10 20 73 63 6f 72 65 20 66 6f 72 20 61 20 70 72 65   score for a pre
30d20 76 69 6f 75 73 6c 79 20 63 72 65 61 74 65 64 20  viously created 
30d30 65 71 75 69 76 61 6c 65 6e 74 20 70 61 74 68 20  equivalent path 
30d40 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  */.#ifdef WHERET
30d50 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
30d60 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
30d70 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
30d80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30d90 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
30da0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
30db0 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20 63      "Update %s c
30dc0 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  ost=%-3d order=%
30dd0 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  c",.            
30de0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
30df0 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
30e00 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a  pWLoop), rCost,.
30e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
30e30 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59   (isOrdered ? 'Y
30e40 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
30e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
30e60 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
30e70 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25  "  was %s cost=%
30e80 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  -3d order=%c\n",
30e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30ea0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
30eb0 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
30ec0 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20 20 20   pTo->rCost,.   
30ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
30ee0 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
30ef0 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
30f00 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
30f10 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
30f20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
30f30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
30f40 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e  pWLoop is a winn
30f50 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74  er.  Add it to t
30f60 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20 73  he set of best s
30f70 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
30f80 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d   pTo->maskLoop =
30f90 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
30fa0 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
30fb0 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  elf;.        pTo
30fc0 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d  ->revLoop = revM
30fd0 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ask;.        pTo
30fe0 2d 3e 6e 52 6f 77 20 3d 20 70 46 72 6f 6d 2d 3e  ->nRow = pFrom->
30ff0 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e  nRow + pWLoop->n
31000 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  Out;.        pTo
31010 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b  ->rCost = rCost;
31020 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73  .        pTo->is
31030 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 69  OrderedValid = i
31040 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20  sOrderedValid;. 
31050 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
31060 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65  dered = isOrdere
31070 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  d;.        memcp
31080 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46  y(pTo->aLoop, pF
31090 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65  rom->aLoop, size
310a0 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69  of(WhereLoop*)*i
310b0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70  Loop);.        p
310c0 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  To->aLoop[iLoop]
310d0 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20   = pWLoop;.     
310e0 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
310f0 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
31100 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30    mxCost = aTo[0
31110 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  ].rCost;.       
31120 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f     for(jj=1, pTo
31130 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43  =&aTo[1]; jj<mxC
31140 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  hoice; jj++, pTo
31150 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
31160 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e   if( pTo->rCost>
31170 6d 78 43 6f 73 74 20 29 20 6d 78 43 6f 73 74 20  mxCost ) mxCost 
31180 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20  = pTo->rCost;.  
31190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
311a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
311b0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
311c0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
311d0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
311e0 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20  eTrace>=2 ){.   
311f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
31200 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65  rintf("---- afte
31210 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c  r round %d ----\
31220 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  n", iLoop);.    
31230 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d    for(ii=0, pTo=
31240 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b  aTo; ii<nTo; ii+
31250 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
31260 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
31270 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d  rintf(" %s cost=
31280 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f  %-3d nrow=%-3d o
31290 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
312a0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
312b0 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
312c0 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
312d0 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
312e0 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
312f0 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54  deredValid ? (pT
31300 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27  o->isOrdered ? '
31310 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
31320 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
31330 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  o->isOrderedVali
31340 64 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65  d && pTo->isOrde
31350 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  red ){.         
31360 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
31370 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78  ntf(" rev=0x%llx
31380 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f  \n", pTo->revLoo
31390 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
313a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
313b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
313c0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  "\n");.        }
313d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
313e0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77  endif..    /* Sw
313f0 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20  ap the roles of 
31400 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f  aFrom and aTo fo
31410 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72  r the next gener
31420 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72  ation */.    pFr
31430 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54  om = aTo;.    aT
31440 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61  o = aFrom;.    a
31450 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20  From = pFrom;.  
31460 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20    nFrom = nTo;. 
31470 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d   }..  if( nFrom=
31480 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
31490 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
314a0 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75  , "no query solu
314b0 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  tion");.    sqli
314c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
314d0 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72  pace);.    retur
314e0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
314f0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64    }.  .  /* Find
31500 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
31510 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69   path.  pFrom wi
31520 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74  ll be left point
31530 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68  ing to that path
31540 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46   */.  pFrom = aF
31550 72 6f 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  rom;.  assert( n
31560 46 72 6f 6d 3d 3d 31 20 29 3b 0a 23 69 66 20 30  From==1 );.#if 0
31570 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
31580 67 20 69 73 20 6e 65 65 64 65 64 20 69 66 20 6e  g is needed if n
31590 46 72 6f 6d 20 69 73 20 65 76 65 72 20 6d 6f 72  From is ever mor
315a0 65 20 74 68 61 6e 20 31 20 2a 2f 0a 20 20 66 6f  e than 1 */.  fo
315b0 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d  r(ii=1; ii<nFrom
315c0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
315d0 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46   pFrom->rCost>aF
315e0 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20  rom[ii].rCost ) 
315f0 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69  pFrom = &aFrom[i
31600 69 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  i];.  }.#endif. 
31610 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
31620 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29  >nLevel==nLoop )
31630 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ;.  /* Load the 
31640 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
31650 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a   into pWInfo */.
31660 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
31670 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  Loop<nLoop; iLoo
31680 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c  p++){.    WhereL
31690 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70  evel *pLevel = p
316a0 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70  WInfo->a + iLoop
316b0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57  ;.    pLevel->pW
316c0 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20  Loop = pWLoop = 
316d0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pFrom->aLoop[iLo
316e0 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  op];.    pLevel-
316f0 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d  >iFrom = pWLoop-
31700 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65  >iTab;.    pLeve
31710 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49  l->iTabCur = pWI
31720 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
31730 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e  [pLevel->iFrom].
31740 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69  iCursor;.  }.  i
31750 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
31760 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
31770 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 20 0a 20  ISTINCTBY)==0 . 
31780 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 70 44 69    && pWInfo->pDi
31790 73 74 69 6e 63 74 0a 20 20 20 26 26 20 6e 52 6f  stinct.   && nRo
317a0 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69  wEst.  ){.    Bi
317b0 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20  tmask notUsed;. 
317c0 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72     int rc = wher
317d0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
317e0 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
317f0 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74 2c  Info->pDistinct,
31800 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20   pFrom,.        
31810 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44           WHERE_D
31820 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70  ISTINCTBY, nLoop
31830 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
31840 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55  [nLoop-1], &notU
31850 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
31860 3d 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44  ==1 ) pWInfo->eD
31870 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
31880 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
31890 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 6f  ;.  }.  if( pFro
318a0 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a  m->isOrdered ){.
318b0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
318c0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
318d0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b  RE_DISTINCTBY ){
318e0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
318f0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
31900 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
31910 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
31920 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53      pWInfo->bOBS
31930 61 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 57  at = 1;.      pW
31940 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
31950 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
31960 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e      }.  }.  pWIn
31970 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46  fo->nRowOut = pF
31980 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a  rom->nRow;..  /*
31990 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20   Free temporary 
319a0 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72  memory and retur
319b0 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73  n success */.  s
319c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
319d0 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75   pSpace);.  retu
319e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
319f0 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72  ./*.** Most quer
31a00 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73  ies use only a s
31a10 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ingle table (the
31a20 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29  y are not joins)
31a30 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d   and have.** sim
31a40 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ple == constrain
31a50 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78  ts against index
31a60 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73  ed fields.  This
31a70 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
31a80 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f  s.** to plan tho
31a90 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20  se simple cases 
31aa0 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20  using much less 
31ab0 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68  ceremony than th
31ac0 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72  e.** general-pur
31ad0 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e  pose query plann
31ae0 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20  er, and thereby 
31af0 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c  yield faster sql
31b00 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a  ite3_prepare().*
31b10 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20  * times for the 
31b20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a  common case..**.
31b30 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
31b40 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69  ro on success, i
31b50 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  f this query can
31b60 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74   be handled by t
31b70 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73  his.** no-frills
31b80 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20   query planner. 
31b90 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20   Return zero if 
31ba0 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73  this query needs
31bb0 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c   the .** general
31bc0 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
31bd0 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  lanner..*/.stati
31be0 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74  c int whereShort
31bf0 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  Cut(WhereLoopBui
31c00 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b  lder *pBuilder){
31c10 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
31c20 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53  Info;.  struct S
31c30 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
31c40 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  em;.  WhereClaus
31c50 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54  e *pWC;.  WhereT
31c60 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68  erm *pTerm;.  Wh
31c70 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
31c80 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e    int iCur;.  in
31c90 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t j;.  Table *pT
31ca0 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
31cb0 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d  x;.  .  pWInfo =
31cc0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
31cd0 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  o;.  if( pWInfo-
31ce0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
31cf0 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
31d00 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
31d10 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54  sert( pWInfo->pT
31d20 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20  abList->nSrc>=1 
31d30 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49  );.  pItem = pWI
31d40 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
31d50 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d  ;.  pTab = pItem
31d60 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73  ->pTab;.  if( Is
31d70 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
31d80 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
31d90 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20  pItem->zIndex ) 
31da0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72  return 0;.  iCur
31db0 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
31dc0 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  r;.  pWC = &pWIn
31dd0 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70  fo->sWC;.  pLoop
31de0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
31df0 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  w;.  pLoop->wsFl
31e00 61 67 73 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d  ags = 0;.  pTerm
31e10 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
31e20 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
31e30 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  _EQ, 0);.  if( p
31e40 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  Term ){.    pLoo
31e50 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
31e60 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
31e70 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
31e80 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
31e90 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
31ea0 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
31eb0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
31ec0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
31ed0 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
31ee0 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
31ef0 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
31f00 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
31f10 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
31f20 33 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 30 29  3==whereCost(10)
31f30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
31f40 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
31f50 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
31f60 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
31f70 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
31f80 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
31f90 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
31fa0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
31fb0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  Idx->nColumn; j+
31fc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72  +){.        pTer
31fd0 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
31fe0 2c 20 69 43 75 72 2c 20 70 49 64 78 2d 3e 61 69  , iCur, pIdx->ai
31ff0 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 57 4f  Column[j], 0, WO
32000 5f 45 51 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  _EQ, pIdx);.    
32010 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
32020 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
32030 20 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a    whereLoopResiz
32040 65 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  e(pWInfo->pParse
32050 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6a 29 3b  ->db, pLoop, j);
32060 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
32070 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72  aLTerm[j] = pTer
32080 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
32090 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 43   if( j!=pIdx->nC
320a0 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
320b0 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77  ;.      pLoop->w
320c0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
320d0 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f  OLUMN_EQ|WHERE_O
320e0 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45  NEROW|WHERE_INDE
320f0 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 28  XED;.      if( (
32100 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  pItem->colUsed &
32110 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
32120 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20  (pIdx))==0 ){.  
32130 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46        pLoop->wsF
32140 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
32150 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  X_ONLY;.      }.
32160 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54        pLoop->nLT
32170 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70  erm = j;.      p
32180 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
32190 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  q = j;.      pLo
321a0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
321b0 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  ex = pIdx;.     
321c0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
321d0 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64   of a unique ind
321e0 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20  ex lookup is 15 
321f0 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  */.      pLoop->
32200 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33  rRun = 39;  /* 3
32210 39 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 35 29  9==whereCost(15)
32220 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
32230 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
32240 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
32250 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ){.    pLoop->nO
32260 75 74 20 3d 20 28 57 68 65 72 65 43 6f 73 74 29  ut = (WhereCost)
32270 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
32280 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f  [0].pWLoop = pLo
32290 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d  op;.    pLoop->m
322a0 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d 61 73  askSelf = getMas
322b0 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
322c0 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  Set, iCur);.    
322d0 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61  pWInfo->a[0].iTa
322e0 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20  bCur = iCur;.   
322f0 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
32300 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57   = 1;.    if( pW
32310 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
32320 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20   pWInfo->bOBSat 
32330 3d 20 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57  =  1;.    if( pW
32340 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74 20  Info->pDistinct 
32350 29 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  ) pWInfo->eDisti
32360 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
32370 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 23 69 66  INCT_UNIQUE;.#if
32380 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
32390 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20  .    pLoop->cId 
323a0 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20  = '0';.#endif.  
323b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
323c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
323d0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
323e0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
323f0 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
32400 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
32410 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
32420 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
32430 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
32440 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
32450 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
32460 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
32470 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
32480 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
32490 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
324a0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
324b0 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
324c0 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
324d0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
324e0 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
324f0 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
32500 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
32510 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
32520 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
32530 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
32540 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
32550 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
32560 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
32570 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
32580 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
32590 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
325a0 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
325b0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
325c0 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
325d0 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
325e0 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
325f0 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
32600 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
32610 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
32620 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
32630 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
32640 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
32650 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
32660 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
32670 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
32680 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
32690 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
326a0 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
326b0 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
326c0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
326d0 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
326e0 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
326f0 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
32700 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
32710 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
32720 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
32730 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
32740 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
32750 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
32760 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
32770 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
32780 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
32790 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
327a0 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
327b0 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
327c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327d0 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
327e0 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
327f0 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
32800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32810 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
32820 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
32830 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
32840 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
32850 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
32860 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
32870 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
32880 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
32890 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
328a0 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
328b0 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
328c0 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
328d0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
328e0 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
328f0 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
32900 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
32910 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
32920 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
32930 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
32940 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
32950 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
32960 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
32970 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
32980 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
32990 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
329a0 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
329b0 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
329c0 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
329d0 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
329e0 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
329f0 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
32a00 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
32a10 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
32a20 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
32a30 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
32a40 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
32a50 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
32a60 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
32a70 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
32a80 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
32a90 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
32aa0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
32ab0 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
32ac0 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
32ad0 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
32ae0 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
32af0 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
32b00 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
32b10 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
32b20 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
32b30 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
32b40 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
32b50 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
32b60 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
32b70 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
32b80 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
32b90 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
32ba0 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
32bb0 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
32bc0 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
32bd0 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
32be0 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
32bf0 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
32c00 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
32c10 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
32c20 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
32c30 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
32c40 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
32c50 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
32c60 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
32c70 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
32c80 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
32c90 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
32ca0 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
32cb0 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
32cc0 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
32cd0 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
32ce0 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
32cf0 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
32d00 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
32d10 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
32d20 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
32d30 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
32d40 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
32d50 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
32d60 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
32d70 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
32d80 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
32d90 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
32da0 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
32db0 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
32dc0 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
32dd0 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
32de0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
32df0 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
32e00 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
32e10 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
32e20 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
32e30 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
32e40 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
32e50 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
32e60 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
32e70 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
32e80 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
32e90 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
32ea0 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
32eb0 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
32ec0 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
32ed0 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
32ee0 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
32ef0 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
32f00 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
32f10 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
32f20 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
32f30 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
32f40 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
32f50 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
32f60 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
32f70 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
32f80 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
32f90 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
32fa0 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
32fb0 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
32fc0 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
32fd0 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
32fe0 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
32ff0 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
33000 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
33010 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
33020 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
33030 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
33040 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  * pOrderBy is a 
33050 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
33060 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
33070 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
33080 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72  ment,.** if ther
33090 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
330a0 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
330b0 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
330c0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
330d0 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
330e0 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
330f0 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
33100 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e  en pOrderBy is N
33110 55 4c 4c 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  ULL..*/.WhereInf
33120 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
33130 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
33140 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
33150 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
33160 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
33170 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
33180 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
33190 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
331a0 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
331b0 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
331c0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
331d0 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
331e0 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
331f0 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  * An ORDER BY cl
33200 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
33210 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
33220 73 74 69 6e 63 74 2c 20 20 2f 2a 20 54 68 65 20  stinct,  /* The 
33230 73 65 6c 65 63 74 2d 6c 69 73 74 20 66 6f 72 20  select-list for 
33240 44 49 53 54 49 4e 43 54 20 71 75 65 72 69 65 73  DISTINCT queries
33250 20 2d 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20   - or NULL */.  
33260 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
33270 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
33280 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67  the WHERE_* flag
33290 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
332a0 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e  iteInt.h */.  in
332b0 74 20 69 49 64 78 43 75 72 20 20 20 20 20 20 20  t iIdxCur       
332c0 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f      /* If WHERE_
332d0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73  ONETABLE_ONLY is
332e0 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73   set, index curs
332f0 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  or number */.){.
33300 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f    int nByteWInfo
33310 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
33320 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63  Num. bytes alloc
33330 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e  ated for WhereIn
33340 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69  fo struct */.  i
33350 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20  nt nTabList;    
33360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
33370 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
33380 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  in pTabList */. 
33390 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
333a0 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
333b0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
333c0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
333d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
333e0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
333f0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
33400 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
33410 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
33420 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
33430 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  y;          /* C
33440 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
33450 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e  not yet position
33460 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ed */.  WhereLoo
33470 70 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20  pBuilder sWLB;  
33480 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
33490 6f 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20  oop builder */. 
334a0 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
334b0 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54  MaskSet;    /* T
334c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
334d0 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
334e0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
334f0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
33500 6c 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e  le level in pWIn
33510 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  fo->a[] */.  int
33520 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
33530 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
33540 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  counter */.  sql
33550 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
33560 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
33570 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
33580 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
33590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
335a0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
335b0 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  ...  /* Variable
335c0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
335d0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c  */.  memset(&sWL
335e0 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c  B, 0, sizeof(sWL
335f0 42 29 29 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64  B));.  sWLB.pOrd
33600 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
33610 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
33620 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
33630 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
33640 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
33650 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
33660 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
33670 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  k .  */.  testca
33680 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  se( pTabList->nS
33690 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28  rc==BMS );.  if(
336a0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
336b0 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  BMS ){.    sqlit
336c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
336d0 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74  e, "at most %d t
336e0 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22  ables in a join"
336f0 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75  , BMS);.    retu
33700 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
33710 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  This function no
33720 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73  rmally generates
33730 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66   a nested loop f
33740 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  or all tables in
33750 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e   .  ** pTabList.
33760 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45    But if the WHE
33770 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
33780 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
33790 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a  en we should.  *
337a0 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * only generate 
337b0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72  code for the fir
337c0 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  st table in pTab
337d0 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20  List and assume 
337e0 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75  that.  ** any cu
337f0 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
33800 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74   with subsequent
33810 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e   tables are unin
33820 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
33830 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63    nTabList = (wc
33840 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
33850 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
33860 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e  ? 1 : pTabList->
33870 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  nSrc;..  /* Allo
33880 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
33890 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
338a0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
338b0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
338c0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
338d0 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c  ue. A single all
338e0 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ocation is used 
338f0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65  to store the Whe
33900 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75  reInfo.  ** stru
33910 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ct, the contents
33920 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b   of WhereInfo.a[
33930 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ], the WhereClau
33940 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
33950 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d  * and the WhereM
33960 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
33970 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61  . Since WhereCla
33980 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  use contains an 
33990 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c  8-byte.  ** fiel
339a0 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29  d (type Bitmask)
339b0 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67   it must be alig
339c0 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65  ned on an 8-byte
339d0 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a   boundary on.  *
339e0 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74  * some architect
339f0 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ures. Hence the 
33a00 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a  ROUND8() below..
33a10 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72    */.  db = pPar
33a20 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57  se->db;.  nByteW
33a30 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69  Info = ROUND8(si
33a40 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b  zeof(WhereInfo)+
33a50 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a  (nTabList-1)*siz
33a60 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
33a70 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
33a80 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
33a90 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20  (db, nByteWInfo 
33aa0 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  + sizeof(WhereLo
33ab0 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  op));.  if( db->
33ac0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
33ad0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
33ae0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
33af0 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
33b00 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
33b10 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
33b20 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20  WInfo->nLevel = 
33b30 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  nTabList;.  pWIn
33b40 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
33b50 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
33b60 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
33b70 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f  st;.  pWInfo->pO
33b80 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
33b90 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 44 69  y;.  pWInfo->pDi
33ba0 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e  stinct = pDistin
33bb0 63 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  ct;.  pWInfo->iB
33bc0 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
33bd0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
33be0 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
33bf0 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
33c00 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76  s;.  pWInfo->sav
33c10 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
33c20 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
33c30 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  p;.  pMaskSet = 
33c40 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
33c50 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f  t;.  sWLB.pWInfo
33c60 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c   = pWInfo;.  sWL
33c70 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d  B.pWC = &pWInfo-
33c80 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65  >sWC;.  sWLB.pNe
33c90 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29  w = (WhereLoop*)
33ca0 26 70 57 49 6e 66 6f 2d 3e 61 5b 6e 54 61 62 4c  &pWInfo->a[nTabL
33cb0 69 73 74 5d 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  ist];.  whereLoo
33cc0 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29  pInit(sWLB.pNew)
33cd0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
33ce0 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65  DEBUG.  sWLB.pNe
33cf0 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65  w->cId = '*';.#e
33d00 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 69 73 61 62  ndif..  /* Disab
33d10 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  le the DISTINCT 
33d20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20  optimization if 
33d30 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
33d40 70 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20  pt is set via.  
33d50 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
33d60 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  ctrl(SQLITE_TEST
33d70 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
33d80 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28  NS,...) */.  if(
33d90 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
33da0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
33db0 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 20  _DistinctOpt) ) 
33dc0 70 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 0a  pDistinct = 0;..
33dd0 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
33de0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
33df0 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
33e00 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
33e10 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
33e20 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
33e30 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
33e40 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
33e50 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
33e60 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61  Set);.  whereCla
33e70 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d  useInit(&pWInfo-
33e80 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  >sWC, pWInfo);. 
33e90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
33ea0 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65  Constants(pParse
33eb0 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65  , pWhere);.  whe
33ec0 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d  reSplit(&pWInfo-
33ed0 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b  >sWC, pWhere, TK
33ee0 5f 41 4e 44 29 3b 20 20 20 2f 2a 20 49 4d 50 3a  _AND);   /* IMP:
33ef0 20 52 2d 31 35 38 34 32 2d 35 33 32 39 36 20 2a   R-15842-53296 *
33f00 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63  /.    .  /* Spec
33f10 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52  ial case: a WHER
33f20 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
33f30 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c   constant.  Eval
33f40 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78  uate the.  ** ex
33f50 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74  pression and eit
33f60 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c  her jump over al
33f70 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72  l of the code or
33f80 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f   fall thru..  */
33f90 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26 26  .  if( pWhere &&
33fa0 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c   (nTabList==0 ||
33fb0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
33fc0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57  nstantNotJoin(pW
33fd0 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71  here)) ){.    sq
33fe0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
33ff0 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c  (pParse, pWhere,
34000 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
34010 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
34020 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20  LL);.    pWhere 
34030 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  = 0;.  }..  /* S
34040 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20  pecial case: No 
34050 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
34060 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 3d  .  if( nTabList=
34070 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  =0 ){.    if( pO
34080 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d  rderBy ) pWInfo-
34090 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20 20 20  >bOBSat = 1;.   
340a0 20 69 66 28 20 70 44 69 73 74 69 6e 63 74 20 29   if( pDistinct )
340b0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
340c0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
340d0 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 7d 0a  NCT_UNIQUE;.  }.
340e0 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
340f0 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
34100 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
34110 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
34120 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
34130 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62  When assigning b
34140 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f  itmask values to
34150 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72   FROM clause cur
34160 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65  sors, it must be
34170 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74  .  ** the case t
34180 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20  hat if X is the 
34190 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
341a0 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65  N-th FROM clause
341b0 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20   term then.  ** 
341c0 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
341d0 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
341e0 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66  terms to the lef
341f0 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65  t of the N-th te
34200 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29  rm.  ** is (X-1)
34210 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f  .   An expressio
34220 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c  n from the ON cl
34230 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
34240 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a  OIN can use.  **
34250 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74   its Expr.iRight
34260 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20  JoinTable value 
34270 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d  to find the bitm
34280 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74  ask of the right
34290 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74   table.  ** of t
342a0 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61  he join.  Subtra
342b0 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74  cting one from t
342c0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62  he right table b
342d0 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20  itmask gives a. 
342e0 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20   ** bitmask for 
342f0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
34300 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f  e left of the jo
34310 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65  in.  Knowing the
34320 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f   bitmask.  ** fo
34330 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
34340 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
34350 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72  ft join is impor
34360 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33  tant.  Ticket #3
34370 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  015..  **.  ** N
34380 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b  ote that bitmask
34390 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
343a0 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e  r all pTabList->
343b0 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20  nSrc tables in. 
343c0 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f   ** pTabList, no
343d0 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  t just the first
343e0 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73   nTabList tables
343f0 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e  .  nTabList is n
34400 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75  ormally.  ** equ
34410 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e  al to pTabList->
34420 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62  nSrc but might b
34430 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31  e shortened to 1
34440 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45   if the.  ** WHE
34450 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
34460 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20   flag is set..  
34470 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
34480 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
34490 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65  ; ii++){.    cre
344a0 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  ateMask(pMaskSet
344b0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
344c0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ].iCursor);.  }.
344d0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
344e0 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74   {.    Bitmask t
344f0 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20  oTheLeft = 0;.  
34500 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
34510 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
34520 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i++){.      Bitm
34530 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28  ask m = getMask(
34540 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
34550 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f  st->a[ii].iCurso
34560 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
34570 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65  ( (m-1)==toTheLe
34580 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68  ft );.      toTh
34590 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20  eLeft |= m;.    
345a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
345b0 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
345c0 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
345d0 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ions.  Note that
345e0 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d   exprAnalyze() m
345f0 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65  ight.  ** add ne
34600 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  w virtual terms 
34610 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
34620 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
34630 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a  .  We do not.  *
34640 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a  * want to analyz
34650 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20  e these virtual 
34660 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20  terms, so start 
34670 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65  analyzing at the
34680 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f   end.  ** and wo
34690 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68  rk forward so th
346a0 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72  at the added vir
346b0 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e  tual terms are n
346c0 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a  ever processed..
346d0 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79    */.  exprAnaly
346e0 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20  zeAll(pTabList, 
346f0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
34700 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
34710 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
34720 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
34730 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  r;.  }..  /* If 
34740 74 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f 72  the ORDER BY (or
34750 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73   GROUP BY) claus
34760 65 20 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72  e contains refer
34770 65 6e 63 65 73 20 74 6f 20 67 65 6e 65 72 61 6c  ences to general
34780 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
34790 73 2c 20 74 68 65 6e 20 77 65 20 77 6f 6e 27 74  s, then we won't
347a0 20 62 65 20 61 62 6c 65 20 74 6f 20 73 61 74 69   be able to sati
347b0 73 66 79 20 69 74 20 75 73 69 6e 67 20 69 6e 64  sfy it using ind
347c0 69 63 65 73 2c 20 73 6f 0a 20 20 2a 2a 20 67 6f  ices, so.  ** go
347d0 20 61 68 65 61 64 20 61 6e 64 20 64 69 73 61 62   ahead and disab
347e0 6c 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  le it now..  */.
347f0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
34800 26 20 70 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  & pDistinct ){. 
34810 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
34820 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
34830 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78   ii++){.      Ex
34840 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69  pr *pExpr = sqli
34850 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
34860 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  te(pOrderBy->a[i
34870 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
34880 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
34890 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
348a0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
348b0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
348c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
348d0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
348e0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
348f0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
34900 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
34910 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
34920 43 68 65 63 6b 20 69 66 20 74 68 65 20 44 49 53  Check if the DIS
34930 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 2c  TINCT qualifier,
34940 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
34950 2c 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  , is redundant. 
34960 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20  .  ** If it is, 
34970 74 68 65 6e 20 73 65 74 20 70 44 69 73 74 69 6e  then set pDistin
34980 63 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 57  ct to NULL and W
34990 68 65 72 65 49 6e 66 6f 2e 65 44 69 73 74 69 6e  hereInfo.eDistin
349a0 63 74 20 74 6f 0a 20 20 2a 2a 20 57 48 45 52 45  ct to.  ** WHERE
349b0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
349c0 20 74 6f 20 74 65 6c 6c 20 74 68 65 20 63 61 6c   to tell the cal
349d0 6c 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68  ler to ignore th
349e0 65 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2f  e DISTINCT..  */
349f0 0a 20 20 69 66 28 20 70 44 69 73 74 69 6e 63 74  .  if( pDistinct
34a00 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69   ){.    if( isDi
34a10 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28  stinctRedundant(
34a20 70 50 61 72 73 65 2c 70 54 61 62 4c 69 73 74 2c  pParse,pTabList,
34a30 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 70 44 69  &pWInfo->sWC,pDi
34a40 73 74 69 6e 63 74 29 20 29 7b 0a 20 20 20 20 20  stinct) ){.     
34a50 20 70 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a   pDistinct = 0;.
34a60 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
34a70 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
34a80 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
34a90 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
34aa0 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
34ab0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72      pWInfo->wctr
34ac0 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  lFlags |= WHERE_
34ad0 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20  DISTINCTBY;.    
34ae0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
34af0 42 79 20 3d 20 70 44 69 73 74 69 6e 63 74 3b 0a  By = pDistinct;.
34b00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
34b10 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68  Construct the Wh
34b20 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
34b30 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  */.  WHERETRACE(
34b40 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74  0xffff,("*** Opt
34b50 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
34b60 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 6e 54 61  \n"));.  if( nTa
34b70 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72  bList!=1 || wher
34b80 65 53 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29  eShortCut(&sWLB)
34b90 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
34ba0 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
34bb0 26 73 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20  &sWLB);.    if( 
34bc0 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  rc ) goto whereB
34bd0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 20 20  eginError;.  .  
34be0 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c    /* Display all
34bf0 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
34c00 70 20 6f 62 6a 65 63 74 73 20 69 66 20 77 68 65  p objects if whe
34c10 72 65 74 72 61 63 65 20 69 73 20 65 6e 61 62 6c  retrace is enabl
34c20 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  ed */.#ifdef WHE
34c30 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
34c40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
34c50 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20  hereTrace ){.   
34c60 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b     WhereLoop *p;
34c70 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30  .      int i = 0
34c80 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
34c90 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22  har zLabel[] = "
34ca0 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef
34cb0 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
34cc0 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20  wyxz".          
34cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 42               "AB
34cf0 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
34d00 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20 20  STUVWYXZ";.     
34d10 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70   for(p=pWInfo->p
34d20 4c 6f 6f 70 73 3b 20 70 3b 20 70 3d 70 2d 3e 70  Loops; p; p=p->p
34d30 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20  NextLoop){.     
34d40 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62     p->cId = zLab
34d50 65 6c 5b 28 69 2b 2b 29 25 73 69 7a 65 6f 66 28  el[(i++)%sizeof(
34d60 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20  zLabel)];.      
34d70 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
34d80 28 70 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20  (p, pTabList);. 
34d90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
34da0 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65  dif.  .    where
34db0 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
34dc0 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  o, 0);.    if( d
34dd0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
34de0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
34df0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  nError;.    if( 
34e00 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
34e10 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65   ){.       where
34e20 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
34e30 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  o, pWInfo->nRowO
34e40 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66  ut+1);.       if
34e50 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
34e60 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
34e70 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
34e80 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66  .  }.  if( pWInf
34e90 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  o->pOrderBy==0 &
34ea0 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
34eb0 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
34ec0 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70  er)!=0 ){.     p
34ed0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
34ee0 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29 3b 0a   (Bitmask)(-1);.
34ef0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
34f00 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52 28  ->nErr || NEVER(
34f10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
34f20 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  ) ){.    goto wh
34f30 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
34f40 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45 54   }.#ifdef WHERET
34f50 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
34f60 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
34f70 72 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  race ){.    int 
34f80 69 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ii;.    sqlite3D
34f90 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
34fa0 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25   Solution nRow=%
34fb0 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  d", pWInfo->nRow
34fc0 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Out);.    if( pW
34fd0 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 29 7b 0a  Info->bOBSat ){.
34fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
34ff0 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52  ugPrintf(" ORDER
35000 42 59 3d 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e  BY=0x%llx", pWIn
35010 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20  fo->revMask);.  
35020 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
35030 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
35040 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  t ){.      case 
35050 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
35060 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20  NIQUE: {.       
35070 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
35080 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
35090 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20  unique");.      
350a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
350b0 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
350c0 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
350d0 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  ED: {.        sq
350e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
350f0 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64  ("  DISTINCT=ord
35100 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  ered");.        
35110 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
35120 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
35130 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
35140 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  ED: {.        sq
35150 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
35160 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f  ("  DISTINCT=uno
35170 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20  rdered");.      
35180 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
35190 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
351a0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
351b0 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  n");.    for(ii=
351c0 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  0; ii<nTabList; 
351d0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65  ii++){.      whe
351e0 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e  reLoopPrint(pWIn
351f0 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70  fo->a[ii].pWLoop
35200 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20  , pTabList);.   
35210 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
35220 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
35230 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
35240 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
35250 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  "));.  pWInfo->p
35260 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
35270 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  p += pWInfo->nRo
35280 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  wOut;..  /* If t
35290 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
352a0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
352b0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
352c0 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
352d0 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
352e0 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
352f0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
35300 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
35310 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70  ..  ** The one-p
35320 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e  ass algorithm on
35330 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20  ly works if the 
35340 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
35350 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68  straints.  ** th
35360 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
35370 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72  pdate a single r
35380 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ow..  */.  asser
35390 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
353a0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
353b0 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
353c0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
353d0 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46  );.  if( (wctrlF
353e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
353f0 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
35400 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d   .   && (pWInfo-
35410 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73  >a[0].pWLoop->ws
35420 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
35430 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20  EROW)!=0 ){.    
35440 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
35450 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66  s = 1;.    pWInf
35460 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
35470 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  wsFlags &= ~WHER
35480 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_IDX_ONLY;.  }.
35490 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
354a0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
354b0 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
354c0 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
354d0 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
354e0 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
354f0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f    */.  sqlite3Co
35500 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
35510 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49  Parse, -1); /* I
35520 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65  nsert the cookie
35530 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a   verifier Goto *
35540 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
35550 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
35560 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  r(ii=0, pLevel=p
35570 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61  WInfo->a; ii<nTa
35580 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65  bList; ii++, pLe
35590 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
355a0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
355b0 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
355c0 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
355d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
355e0 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
355f0 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
35600 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  x */.    struct 
35610 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
35620 61 62 49 74 65 6d 3b 0a 20 20 20 20 57 68 65 72  abItem;.    Wher
35630 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 0a 20  eLoop *pLoop;.. 
35640 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
35650 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
35660 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
35670 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
35680 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20  pTab;.    iDb = 
35690 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
356a0 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
356b0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f  Schema);.    pLo
356c0 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
356d0 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54  oop;.    if( (pT
356e0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
356f0 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
35700 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
35710 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20   ){.      /* Do 
35720 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  nothing */.    }
35730 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
35740 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
35750 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
35760 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
35770 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
35780 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
35790 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61  const char *pVTa
357a0 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  b = (const char 
357b0 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
357c0 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
357d0 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
357e0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
357f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
35800 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
35810 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20  VOpen, iCur, 0, 
35820 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41  0, pVTab, P4_VTA
35830 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  B);.    }else if
35840 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
35850 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  ) ){.      /* no
35860 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  op */.    }else.
35870 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
35880 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
35890 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
358a0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
358b0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
358c0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
358d0 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  OSE)==0 ){.     
358e0 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f   int op = pWInfo
358f0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50  ->okOnePass ? OP
35900 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f  _OpenWrite : OP_
35910 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
35920 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
35930 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
35940 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c  m->iCursor, iDb,
35950 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20   pTab, op);.    
35960 20 20 74 65 73 74 63 61 73 65 28 20 21 70 57 49    testcase( !pWI
35970 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
35980 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  & pTab->nCol==BM
35990 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
359a0 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e  tcase( !pWInfo->
359b0 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
359c0 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  b->nCol==BMS );.
359d0 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
359e0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
359f0 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29  pTab->nCol<BMS )
35a00 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  {.        Bitmas
35a10 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  k b = pTabItem->
35a20 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20  colUsed;.       
35a30 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
35a40 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62      for(; b; b=b
35a50 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  >>1, n++){}.    
35a60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
35a70 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74  hangeP4(v, sqlit
35a80 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
35a90 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20  r(v)-1, .       
35aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ab0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f       SQLITE_INT_
35ac0 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e  TO_PTR(n), P4_IN
35ad0 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73  T32);.        as
35ae0 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e  sert( n<=pTab->n
35af0 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Col );.      }. 
35b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35b10 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
35b20 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
35b30 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
35b40 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
35b50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35b60 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
35b70 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c  NDEX.    if( (pL
35b80 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
35b90 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
35ba0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
35bb0 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
35bc0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 70 57  ndex(pParse, &pW
35bd0 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 54 61 62 49  Info->sWC, pTabI
35be0 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  tem, notReady, p
35bf0 4c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  Level);.    }els
35c00 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
35c10 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
35c20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
35c30 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
35c40 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  pIx = pLoop->u.b
35c50 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
35c60 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
35c70 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
35c80 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
35c90 49 78 29 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49  Ix);.      /* FI
35ca0 58 4d 45 3a 20 20 41 73 20 61 6e 20 6f 70 74 69  XME:  As an opti
35cb0 6d 69 7a 61 74 69 6f 6e 20 75 73 65 20 70 54 61  mization use pTa
35cc0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 69  bItem->iCursor i
35cd0 66 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  f WHERE_IDX_ONLY
35ce0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 49   */.      int iI
35cf0 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  ndexCur = pLevel
35d00 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 64 78  ->iIdxCur = iIdx
35d10 43 75 72 20 3f 20 69 49 64 78 43 75 72 20 3a 20  Cur ? iIdxCur : 
35d20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
35d30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
35d40 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
35d50 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
35d60 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65     assert( iInde
35d70 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  xCur>=0 );.     
35d80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35d90 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p4(v, OP_OpenRea
35da0 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49  d, iIndexCur, pI
35db0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
35dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35dd0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
35de0 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
35df0 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64  NDOFF);.      Vd
35e00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
35e10 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29  s", pIx->zName))
35e20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
35e30 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
35e40 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
35e50 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26  ;.    notReady &
35e60 3d 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  = ~getMask(&pWIn
35e70 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54  fo->sMaskSet, pT
35e80 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
35e90 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
35ea0 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
35eb0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
35ec0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
35ed0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
35ee0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
35ef0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
35f00 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
35f10 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
35f20 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
35f30 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
35f40 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
35f50 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
35f60 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
35f70 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
35f80 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  gram..  */.  not
35f90 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
35fa0 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  k)0;.  for(ii=0;
35fb0 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
35fc0 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ++){.    pLevel 
35fd0 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  = &pWInfo->a[ii]
35fe0 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65  ;.    explainOne
35ff0 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61  Scan(pParse, pTa
36000 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69  bList, pLevel, i
36010 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  i, pLevel->iFrom
36020 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20  , wctrlFlags);. 
36030 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f     notReady = co
36040 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70  deOneLoopStart(p
36050 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65  WInfo, ii, notRe
36060 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  ady);.    pWInfo
36070 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c  ->iContinue = pL
36080 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a  evel->addrCont;.
36090 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20    }..  /* Done. 
360a0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  */.  return pWIn
360b0 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  fo;..  /* Jump h
360c0 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ere if malloc fa
360d0 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69  ils */.whereBegi
360e0 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57  nError:.  if( pW
360f0 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72  Info ){.    pPar
36100 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
36110 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
36120 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68  ueryLoop;.    wh
36130 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
36140 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72  pWInfo);.  }.  r
36150 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
36160 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65  * Generate the e
36170 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
36180 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65  loop.  See comme
36190 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74  nts on .** sqlit
361a0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66  e3WhereBegin() f
361b0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
361c0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  formation..*/.vo
361d0 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  id sqlite3WhereE
361e0 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nd(WhereInfo *pW
361f0 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a  Info){.  Parse *
36200 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
36210 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20  >pParse;.  Vdbe 
36220 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
36230 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  be;.  int i;.  W
36240 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
36250 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  l;.  WhereLoop *
36260 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74  pLoop;.  SrcList
36270 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
36280 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
36290 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
362a0 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
362b0 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74   Generate loop t
362c0 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e  ermination code.
362d0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
362e0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
362f0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70  arse);.  for(i=p
36300 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  WInfo->nLevel-1;
36310 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
36320 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
36330 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f  o->a[i];.    pLo
36340 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
36350 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  oop;.    sqlite3
36360 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
36370 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
36380 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Cont);.    if( p
36390 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f  Level->op!=OP_No
363a0 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
363b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
363c0 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65   pLevel->op, pLe
363d0 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
363e0 3e 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  >p2);.      sqli
363f0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
36400 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a  v, pLevel->p5);.
36410 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
36420 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
36430 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20  HERE_IN_ABLE && 
36440 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
36450 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  >0 ){.      stru
36460 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
36470 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
36480 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
36490 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
364a0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a  evel->addrNxt);.
364b0 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
364c0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49  el->u.in.nIn, pI
364d0 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  n=&pLevel->u.in.
364e0 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e  aInLoop[j-1]; j>
364f0 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a  0; j--, pIn--){.
36500 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
36510 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
36520 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29  In->addrInTop+1)
36530 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
36540 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70  3VdbeAddOp2(v, p
36550 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20  In->eEndLoopOp, 
36560 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e  pIn->iCur, pIn->
36570 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20  addrInTop);.    
36580 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
36590 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
365a0 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20  addrInTop-1);.  
365b0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
365c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
365d0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
365e0 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  op);.    }.    s
365f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
36600 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
36610 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
36620 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
36630 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69  tJoin ){.      i
36640 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
36650 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
36660 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
36670 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
36680 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61  ftJoin);.      a
36690 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
366a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
366b0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
366c0 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70         || (pLoop
366d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
366e0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b  E_INDEXED)!=0 );
366f0 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  .      if( (pLoo
36700 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
36710 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
36720 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
36730 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
36740 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62  OP_NullRow, pTab
36750 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
36760 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
36770 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
36780 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
36790 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 20  DEXED ){.       
367a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
367b0 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
367c0 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
367d0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
367e0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
367f0 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20  ==OP_Return ){. 
36800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
36810 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
36820 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  osub, pLevel->p1
36830 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
36840 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rst);.      }els
36850 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
36860 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
36870 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
36880 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
36890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
368a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
368b0 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
368c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
368d0 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73  "break" point is
368e0 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74   here, just past
368f0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
36900 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  outer loop..  **
36910 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20   Set it..  */.  
36920 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
36930 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66  veLabel(v, pWInf
36940 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f  o->iBreak);..  /
36950 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74  * Close all of t
36960 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
36970 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73  were opened by s
36980 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
36990 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
369a0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
369b0 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c  =1 || pWInfo->nL
369c0 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74 2d 3e  evel==pTabList->
369d0 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d  nSrc );.  for(i=
369e0 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
369f0 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e  ->a; i<pWInfo->n
36a00 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76  Level; i++, pLev
36a10 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78  el++){.    Index
36a20 20 2a 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20   *pIdx = 0;.    
36a30 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
36a40 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20  tem *pTabItem = 
36a50 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
36a60 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
36a70 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
36a80 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
36a90 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
36aa0 3d 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  =0 );.    pLoop 
36ab0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
36ac0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
36ad0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
36ae0 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20  phemeral)==0.   
36af0 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65    && pTab->pSele
36b00 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  ct==0.     && (p
36b10 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
36b20 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
36b30 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20  PEN_CLOSE)==0.  
36b40 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77    ){.      int w
36b50 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  s = pLoop->wsFla
36b60 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  gs;.      if( !p
36b70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
36b80 20 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f   && (ws & WHERE_
36b90 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
36ba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
36bb0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
36bc0 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Close, pTabItem-
36bd0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
36be0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73   }.      if( (ws
36bf0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
36c00 29 21 3d 30 20 26 26 20 28 77 73 20 26 20 28 57  )!=0 && (ws & (W
36c10 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 54  HERE_IPK|WHERE_T
36c20 45 4d 50 5f 49 4e 44 45 58 29 29 3d 3d 30 20 29  EMP_INDEX))==0 )
36c30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
36c40 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
36c50 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d  P_Close, pLevel-
36c60 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
36c70 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
36c80 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73   If this scan us
36c90 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b  es an index, mak
36ca0 65 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73  e VDBE code subs
36cb0 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61  titutions to rea
36cc0 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72  d data.    ** fr
36cd0 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73  om the index ins
36ce0 74 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65  tead of from the
36cf0 20 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73   table where pos
36d00 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20  sible.  In some 
36d10 63 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69  cases.    ** thi
36d20 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70  s optimization p
36d30 72 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c  revents the tabl
36d40 65 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e  e from ever bein
36d50 67 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61  g read, which ca
36d60 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61  n.    ** yield a
36d70 20 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72   significant per
36d80 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a  formance boost..
36d90 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
36da0 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
36db0 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
36dc0 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
36dd0 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
36de0 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
36df0 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
36e00 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
36e10 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
36e20 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
36e30 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
36e40 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
36e50 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
36e60 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
36e70 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
36e80 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
36e90 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
36ea0 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
36eb0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
36ec0 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
36ed0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
36ee0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
36ef0 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58  NDEXED|WHERE_IDX
36f00 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20  _ONLY) ){.      
36f10 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  pIdx = pLoop->u.
36f20 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
36f30 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f    }else if( pLoo
36f40 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
36f50 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
36f60 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76       pIdx = pLev
36f70 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20  el->u.pCovidx;. 
36f80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
36f90 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
36fa0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
36fb0 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a  int k, j, last;.
36fc0 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
36fd0 70 3b 0a 0a 20 20 20 20 20 20 70 4f 70 20 3d 20  p;..      pOp = 
36fe0 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
36ff0 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  (v, pWInfo->iTop
37000 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20  );.      last = 
37010 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
37020 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
37030 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69   for(k=pWInfo->i
37040 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b  Top; k<last; k++
37050 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
37060 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
37070 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
37080 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
37090 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
370a0 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
370b0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
370c0 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
370d0 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
370e0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
370f0 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  p2==pIdx->aiColu
37100 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  mn[j] ){.       
37110 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
37120 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
37130 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
37140 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
37150 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
37160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
37170 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
37180 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
37190 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
371a0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
371b0 3d 30 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43  =0 || j<pIdx->nC
371c0 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
371d0 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
371e0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
371f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
37200 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
37210 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
37220 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
37230 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
37240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
37250 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
37260 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20  Final cleanup.  
37270 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  */.  pParse->nQu
37280 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
37290 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
372a0 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  p;.  whereInfoFr
372b0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
372c0 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.