/ Hex Artifact Content
Login

Artifact 700085a8d8e0edf13db11e110577320ec7348edc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 4b 2c 58  e WHERETRACE(K,X
0430: 29 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65  )  if(sqlite3Whe
0440: 72 65 54 72 61 63 65 26 28 4b 29 29 20 73 71 6c  reTrace&(K)) sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0460: 58 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  X.# define WHERE
0470: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 31 0a  TRACE_ENABLED 1.
0480: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57  #else.# define W
0490: 48 45 52 45 54 52 41 43 45 28 4b 2c 58 29 0a 23  HERETRACE(K,X).#
04a0: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
04b0: 64 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 74  d reference.*/.t
04c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
04d0: 65 72 65 43 6c 61 75 73 65 20 57 68 65 72 65 43  ereClause WhereC
04e0: 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20 73  lause;.typedef s
04f0: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
0500: 65 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 3b  et WhereMaskSet;
0510: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0520: 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65 72  WhereOrInfo Wher
0530: 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66  eOrInfo;.typedef
0540: 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64   struct WhereAnd
0550: 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e 66  Info WhereAndInf
0560: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0570: 74 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68 65  t WhereLevel Whe
0580: 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65 66  reLevel;.typedef
0590: 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f   struct WhereLoo
05a0: 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74 79 70  p WhereLoop;.typ
05b0: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
05c0: 65 50 61 74 68 20 57 68 65 72 65 50 61 74 68 3b  ePath WherePath;
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65 54  WhereTerm WhereT
05f0: 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  erm;.typedef str
0600: 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  uct WhereLoopBui
0610: 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70 42 75  lder WhereLoopBu
0620: 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66 20 73  ilder;.typedef s
0630: 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e 20  truct WhereScan 
0640: 57 68 65 72 65 53 63 61 6e 3b 0a 0a 2f 2a 0a 2a  WhereScan;../*.*
0650: 2a 20 43 6f 73 74 20 58 20 69 73 20 74 72 61 63  * Cost X is trac
0660: 6b 65 64 20 61 73 20 31 30 2a 6c 6f 67 32 28 58  ked as 10*log2(X
0670: 29 20 73 74 6f 72 65 64 20 69 6e 20 61 20 31 36  ) stored in a 16
0680: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 54  -bit integer.  T
0690: 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 63 6f  he.** maximum co
06a0: 73 74 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20  st for ordinary 
06b0: 74 61 62 6c 65 73 20 69 73 20 36 34 2a 28 32 2a  tables is 64*(2*
06c0: 2a 36 33 29 20 77 68 69 63 68 20 62 65 63 6f 6d  *63) which becom
06d0: 65 73 20 36 39 30 30 2e 0a 2a 2a 20 28 56 69 72  es 6900..** (Vir
06e0: 74 75 61 6c 20 74 61 62 6c 65 73 20 63 61 6e 20  tual tables can 
06f0: 72 65 74 75 72 6e 20 61 20 6c 61 72 67 65 72 20  return a larger 
0700: 63 6f 73 74 2c 20 62 75 74 20 6c 65 74 27 73 20  cost, but let's 
0710: 61 73 73 75 6d 65 20 74 68 65 79 20 64 6f 20 6e  assume they do n
0720: 6f 74 2e 29 0a 2a 2a 20 53 6f 20 61 6c 6c 20 63  ot.).** So all c
0730: 6f 73 74 73 20 63 61 6e 20 62 65 20 73 74 6f 72  osts can be stor
0740: 65 64 20 69 6e 20 61 20 31 36 2d 62 69 74 20 75  ed in a 16-bit u
0750: 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
0760: 77 69 74 68 6f 75 74 20 72 69 73 6b 0a 2a 2a 20  without risk.** 
0770: 6f 66 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2a 0a  of overflow..**.
0780: 2a 2a 20 43 6f 73 74 73 20 61 72 65 20 65 73 74  ** Costs are est
0790: 69 6d 61 74 65 73 2c 20 73 6f 20 64 6f 6e 27 74  imates, so don't
07a0: 20 67 6f 20 74 6f 20 74 68 65 20 63 6f 6d 70 75   go to the compu
07b0: 74 61 74 69 6f 6e 61 6c 20 74 72 6f 75 62 6c 65  tational trouble
07c0: 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 31   to compute.** 1
07d0: 30 2a 6c 6f 67 32 28 58 29 20 65 78 61 63 74 6c  0*log2(X) exactl
07e0: 79 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 20 63  y.  Instead, a c
07f0: 6c 6f 73 65 20 65 73 74 69 6d 61 74 65 20 69 73  lose estimate is
0800: 20 75 73 65 64 2e 20 20 41 6e 79 20 76 61 6c 75   used.  Any valu
0810: 65 20 6f 66 0a 2a 2a 20 58 3c 3d 31 20 69 73 20  e of.** X<=1 is 
0820: 73 74 6f 72 65 64 20 61 73 20 30 2e 20 20 58 3d  stored as 0.  X=
0830: 32 20 69 73 20 31 30 2e 20 20 58 3d 33 20 69 73  2 is 10.  X=3 is
0840: 20 31 36 2e 20 20 58 3d 31 30 30 30 20 69 73 20   16.  X=1000 is 
0850: 39 39 2e 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 54  99. etc..**.** T
0860: 68 65 20 74 6f 6f 6c 2f 77 68 65 72 65 63 6f 73  he tool/wherecos
0870: 74 74 65 73 74 2e 63 20 73 6f 75 72 63 65 20 66  ttest.c source f
0880: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ile implements a
0890: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 70 72   command-line pr
08a0: 6f 67 72 61 6d 0a 2a 2a 20 74 68 61 74 20 77 69  ogram.** that wi
08b0: 6c 6c 20 63 6f 6e 76 65 72 74 20 62 65 74 77 65  ll convert betwe
08c0: 65 6e 20 57 68 65 72 65 43 6f 73 74 20 74 6f 20  en WhereCost to 
08d0: 69 6e 74 65 67 65 72 73 20 61 6e 64 20 64 6f 20  integers and do 
08e0: 61 64 64 69 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  addition and.** 
08f0: 6d 75 6c 74 69 70 6c 69 63 61 74 69 6f 6e 20 6f  multiplication o
0900: 6e 20 57 68 65 72 65 43 6f 73 74 20 76 61 6c 75  n WhereCost valu
0910: 65 73 2e 20 20 54 68 61 74 20 63 6f 6d 6d 61 6e  es.  That comman
0920: 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d 20 69  d-line program i
0930: 73 20 61 0a 2a 2a 20 75 73 65 66 75 6c 20 75 74  s a.** useful ut
0940: 69 6c 69 74 79 20 74 6f 20 68 61 76 65 20 61 72  ility to have ar
0950: 6f 75 6e 64 20 77 68 65 6e 20 77 6f 72 6b 69 6e  ound when workin
0960: 67 20 77 69 74 68 20 74 68 69 73 20 6d 6f 64 75  g with this modu
0970: 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75  le..*/.typedef u
0980: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e  nsigned short in
0990: 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f 2a  t WhereCost;../*
09a0: 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20  .** This object 
09b0: 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72 6d 61  contains informa
09c0: 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 69  tion needed to i
09d0: 6d 70 6c 65 6d 65 6e 74 20 61 20 73 69 6e 67 6c  mplement a singl
09e0: 65 20 6e 65 73 74 64 0a 2a 2a 20 6c 6f 6f 70 20  e nestd.** loop 
09f0: 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  in WHERE clause.
0a00: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 74 72 61 73 74 20  .**.** Contrast 
0a10: 74 68 69 73 20 6f 62 6a 65 63 74 20 77 69 74 68  this object with
0a20: 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 54 68 69   WhereLoop.  Thi
0a30: 73 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62  s object describ
0a40: 65 73 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  es the.** implem
0a50: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
0a60: 6c 6f 6f 70 2e 20 20 57 68 65 72 65 4c 6f 6f 70  loop.  WhereLoop
0a70: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 61   describes the a
0a80: 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 20 54 68 69  lgorithm..** Thi
0a90: 73 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  s object contain
0aa0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
0ab0: 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 61 6c 67  he WhereLoop alg
0ac0: 6f 72 69 74 68 6d 20 61 73 20 6f 6e 65 20 6f 66  orithm as one of
0ad0: 0a 2a 2a 20 69 74 73 20 65 6c 65 6d 65 6e 74 73  .** its elements
0ae0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 57 68 65 72  ..**.** The Wher
0af0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e  eInfo object con
0b00: 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 69  tains a single i
0b10: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
0b20: 6f 62 6a 65 63 74 20 66 6f 72 0a 2a 2a 20 65 61  object for.** ea
0b30: 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ch term in the F
0b40: 52 4f 4d 20 63 6c 61 75 73 65 20 28 77 68 69 63  ROM clause (whic
0b50: 68 20 69 73 20 74 6f 20 73 61 79 2c 20 66 6f 72  h is to say, for
0b60: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
0b70: 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 61 73 20  nested loops as 
0b80: 69 6d 70 6c 65 6d 65 6e 74 65 64 29 2e 20 20 54  implemented).  T
0b90: 68 65 20 6f 72 64 65 72 20 6f 66 20 57 68 65 72  he order of Wher
0ba0: 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20 64  eLevel objects d
0bb0: 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 74 68 65  etermines.** the
0bc0: 20 6c 6f 6f 70 20 6e 65 73 74 65 64 20 6f 72 64   loop nested ord
0bd0: 65 72 2c 20 77 69 74 68 20 57 68 65 72 65 49 6e  er, with WhereIn
0be0: 66 6f 2e 61 5b 30 5d 20 62 65 69 6e 67 20 74 68  fo.a[0] being th
0bf0: 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 61 6e 64  e outer loop and
0c00: 0a 2a 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b  .** WhereInfo.a[
0c10: 57 68 65 72 65 49 6e 66 6f 2e 6e 4c 65 76 65 6c  WhereInfo.nLevel
0c20: 2d 31 5d 20 62 65 69 6e 67 20 74 68 65 20 69 6e  -1] being the in
0c30: 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74 72  ner loop..*/.str
0c40: 75 63 74 20 57 68 65 72 65 4c 65 76 65 6c 20 7b  uct WhereLevel {
0c50: 0a 20 20 69 6e 74 20 69 4c 65 66 74 4a 6f 69 6e  .  int iLeftJoin
0c60: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f  ;        /* Memo
0c70: 72 79 20 63 65 6c 6c 20 75 73 65 64 20 74 6f 20  ry cell used to 
0c80: 69 6d 70 6c 65 6d 65 6e 74 20 4c 45 46 54 20 4f  implement LEFT O
0c90: 55 54 45 52 20 4a 4f 49 4e 20 2a 2f 0a 20 20 69  UTER JOIN */.  i
0ca0: 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20 20  nt iTabCur;     
0cb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
0cc0: 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   cursor used to 
0cd0: 61 63 63 65 73 73 20 74 68 65 20 74 61 62 6c 65  access the table
0ce0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
0cf0: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r;          /* T
0d00: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 75  he VDBE cursor u
0d10: 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 70 49  sed to access pI
0d20: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  dx */.  int addr
0d30: 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Brk;          /*
0d40: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
0d50: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  eak out of the l
0d60: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
0d70: 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 20 2f  rNxt;          /
0d80: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
0d90: 74 61 72 74 20 74 68 65 20 6e 65 78 74 20 49 4e  tart the next IN
0da0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 2a 2f 0a   combination */.
0db0: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20    int addrCont; 
0dc0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
0dd0: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
0de0: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 6c   with the next l
0df0: 6f 6f 70 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  oop cycle */.  i
0e00: 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20 20  nt addrFirst;   
0e10: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e       /* First in
0e20: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 69 6e 74  struction of int
0e30: 65 72 69 6f 72 20 6f 66 20 74 68 65 20 6c 6f 6f  erior of the loo
0e40: 70 20 2a 2f 0a 20 20 75 38 20 69 46 72 6f 6d 3b  p */.  u8 iFrom;
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0e60: 57 68 69 63 68 20 65 6e 74 72 79 20 69 6e 20 74  Which entry in t
0e70: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
0e80: 2f 0a 20 20 75 38 20 6f 70 2c 20 70 35 3b 20 20  /.  u8 op, p5;  
0e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
0ea0: 6f 64 65 20 61 6e 64 20 50 35 20 6f 66 20 74 68  ode and P5 of th
0eb0: 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 65 6e  e opcode that en
0ec0: 64 73 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  ds the loop */. 
0ed0: 20 69 6e 74 20 70 31 2c 20 70 32 3b 20 20 20 20   int p1, p2;    
0ee0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 6e         /* Operan
0ef0: 64 73 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  ds of the opcode
0f00: 20 75 73 65 64 20 74 6f 20 65 6e 64 73 20 74 68   used to ends th
0f10: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 6e 69 6f  e loop */.  unio
0f20: 6e 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  n {             
0f30: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
0f40: 20 74 68 61 74 20 64 65 70 65 6e 64 73 20 6f 6e   that depends on
0f50: 20 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   pWLoop->wsFlags
0f60: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 7b   */.    struct {
0f70: 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 6e 3b 20  .      int nIn; 
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f90: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
0fa0: 73 20 69 6e 20 61 49 6e 4c 6f 6f 70 5b 5d 20 2a  s in aInLoop[] *
0fb0: 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49  /.      struct I
0fc0: 6e 4c 6f 6f 70 20 7b 0a 20 20 20 20 20 20 20 20  nLoop {.        
0fd0: 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
0fe0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
0ff0: 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 20 62  BE cursor used b
1000: 79 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74  y this IN operat
1010: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  or */.        in
1020: 74 20 61 64 64 72 49 6e 54 6f 70 3b 20 20 20 20  t addrInTop;    
1030: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
1040: 68 65 20 49 4e 20 6c 6f 6f 70 20 2a 2f 0a 20 20  he IN loop */.  
1050: 20 20 20 20 20 20 75 38 20 65 45 6e 64 4c 6f 6f        u8 eEndLoo
1060: 70 4f 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  pOp;         /* 
1070: 49 4e 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  IN Loop terminat
1080: 6f 72 2e 20 4f 50 5f 4e 65 78 74 20 6f 72 20 4f  or. OP_Next or O
1090: 50 5f 50 72 65 76 20 2a 2f 0a 20 20 20 20 20 20  P_Prev */.      
10a0: 7d 20 2a 61 49 6e 4c 6f 6f 70 3b 20 20 20 20 20  } *aInLoop;     
10b0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
10c0: 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20  tion about each 
10d0: 6e 65 73 74 65 64 20 49 4e 20 6f 70 65 72 61 74  nested IN operat
10e0: 6f 72 20 2a 2f 0a 20 20 20 20 7d 20 69 6e 3b 20  or */.    } in; 
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 2f 2a 20 55 73 65 64 20 77 68 65 6e 20 70 57 4c  /* Used when pWL
1110: 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
1120: 52 45 5f 49 4e 5f 41 42 4c 45 20 2a 2f 0a 20 20  RE_IN_ABLE */.  
1130: 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 69 64 78    Index *pCovidx
1140: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69  ;       /* Possi
1150: 62 6c 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ble covering ind
1160: 65 78 20 66 6f 72 20 57 48 45 52 45 5f 4d 55 4c  ex for WHERE_MUL
1170: 54 49 5f 4f 52 20 2a 2f 0a 20 20 7d 20 75 3b 0a  TI_OR */.  } u;.
1180: 20 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f    struct WhereLo
1190: 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 2f 2a 20  op *pWLoop;  /* 
11a0: 54 68 65 20 73 65 6c 65 63 74 65 64 20 57 68 65  The selected Whe
11b0: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
11c0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .};../*.** Each 
11d0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
11e0: 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
11f0: 74 73 20 61 6e 20 61 6c 67 6f 72 69 74 68 6d 20  ts an algorithm 
1200: 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 6f  for evaluating o
1210: 6e 65 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 61 20  ne.** term of a 
1220: 6a 6f 69 6e 2e 20 20 45 76 65 72 79 20 74 65 72  join.  Every ter
1230: 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
1240: 61 75 73 65 20 77 69 6c 6c 20 68 61 76 65 20 61  ause will have a
1250: 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63  t least.** one c
1260: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
1270: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 28 75  reLoop object (u
1280: 6e 6c 65 73 73 20 49 4e 44 45 58 45 44 20 42 59  nless INDEXED BY
1290: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
12a0: 70 72 65 76 65 6e 74 20 61 20 71 75 65 72 79 20  prevent a query 
12b0: 73 6f 6c 75 74 69 6f 6e 20 2d 20 77 68 69 63 68  solution - which
12c0: 20 69 73 20 61 6e 20 65 72 72 6f 72 29 20 61 6e   is an error) an
12d0: 64 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  d many terms of 
12e0: 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
12f0: 73 65 20 77 69 6c 6c 20 68 61 76 65 20 6d 75 6c  se will have mul
1300: 74 69 70 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20  tiple WhereLoop 
1310: 6f 62 6a 65 63 74 73 2c 20 65 61 63 68 20 64 65  objects, each de
1320: 73 63 72 69 62 69 6e 67 20 61 0a 2a 2a 20 70 6f  scribing a.** po
1330: 74 65 6e 74 69 61 6c 20 77 61 79 20 6f 66 20 69  tential way of i
1340: 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74  mplementing that
1350: 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
1360: 6d 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  m, together with
1370: 0a 2a 2a 20 64 65 70 65 6e 64 65 6e 63 69 65 73  .** dependencies
1380: 20 61 6e 64 20 63 6f 73 74 20 65 73 74 69 6d 61   and cost estima
1390: 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68  tes for using th
13a0: 65 20 63 68 6f 73 65 6e 20 61 6c 67 6f 72 69 74  e chosen algorit
13b0: 68 6d 2e 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20  hm..**.** Query 
13c0: 70 6c 61 6e 6e 69 6e 67 20 63 6f 6e 73 69 73 74  planning consist
13d0: 73 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 75 70  s of building up
13e0: 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66   a collection of
13f0: 20 74 68 65 73 65 20 57 68 65 72 65 4c 6f 6f 70   these WhereLoop
1400: 0a 2a 2a 20 6f 62 6a 65 63 74 73 2c 20 74 68 65  .** objects, the
1410: 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61 20 70 61  n computing a pa
1420: 72 74 69 63 75 6c 61 72 20 73 65 71 75 65 6e 63  rticular sequenc
1430: 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  e of WhereLoop o
1440: 62 6a 65 63 74 73 2c 20 77 69 74 68 0a 2a 2a 20  bjects, with.** 
1450: 6f 6e 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  one WhereLoop ob
1460: 6a 65 63 74 20 70 65 72 20 46 52 4f 4d 20 63 6c  ject per FROM cl
1470: 61 75 73 65 20 74 65 72 6d 2c 20 74 68 61 74 20  ause term, that 
1480: 73 61 74 69 73 66 79 20 61 6c 6c 20 64 65 70 65  satisfy all depe
1490: 6e 64 65 6e 63 69 65 73 0a 2a 2a 20 61 6e 64 20  ndencies.** and 
14a0: 74 68 61 74 20 6d 69 6e 69 6d 69 7a 65 20 74 68  that minimize th
14b0: 65 20 6f 76 65 72 61 6c 6c 20 63 6f 73 74 2e 0a  e overall cost..
14c0: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4c  */.struct WhereL
14d0: 6f 6f 70 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20  oop {.  Bitmask 
14e0: 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 2f 2a  prereq;       /*
14f0: 20 42 69 74 6d 61 73 6b 20 6f 66 20 6f 74 68 65   Bitmask of othe
1500: 72 20 6c 6f 6f 70 73 20 74 68 61 74 20 6d 75 73  r loops that mus
1510: 74 20 72 75 6e 20 66 69 72 73 74 20 2a 2f 0a 20  t run first */. 
1520: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 65 6c   Bitmask maskSel
1530: 66 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  f;     /* Bitmas
1540: 6b 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74 61  k identifying ta
1550: 62 6c 65 20 69 54 61 62 20 2a 2f 0a 23 69 66 64  ble iTab */.#ifd
1560: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1570: 20 20 63 68 61 72 20 63 49 64 3b 20 20 20 20 20    char cId;     
1580: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f          /* Symbo
1590: 6c 69 63 20 49 44 20 6f 66 20 74 68 69 73 20 6c  lic ID of this l
15a0: 6f 6f 70 20 66 6f 72 20 64 65 62 75 67 67 69 6e  oop for debuggin
15b0: 67 20 75 73 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  g use */.#endif.
15c0: 20 20 75 38 20 69 54 61 62 3b 20 20 20 20 20 20    u8 iTab;      
15d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
15e0: 69 6f 6e 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  ion in FROM clau
15f0: 73 65 20 6f 66 20 74 61 62 6c 65 20 66 6f 72 20  se of table for 
1600: 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75  this loop */.  u
1610: 38 20 69 53 6f 72 74 49 64 78 3b 20 20 20 20 20  8 iSortIdx;     
1620: 20 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20       /* Sorting 
1630: 69 6e 64 65 78 20 6e 75 6d 62 65 72 2e 20 20 30  index number.  0
1640: 3d 3d 4e 6f 6e 65 20 2a 2f 0a 20 20 57 68 65 72  ==None */.  Wher
1650: 65 43 6f 73 74 20 72 53 65 74 75 70 3b 20 20 20  eCost rSetup;   
1660: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 73 65    /* One-time se
1670: 74 75 70 20 63 6f 73 74 20 28 65 78 3a 20 63 72  tup cost (ex: cr
1680: 65 61 74 65 20 74 72 61 6e 73 69 65 6e 74 20 69  eate transient i
1690: 6e 64 65 78 29 20 2a 2f 0a 20 20 57 68 65 72 65  ndex) */.  Where
16a0: 43 6f 73 74 20 72 52 75 6e 3b 20 20 20 20 20 20  Cost rRun;      
16b0: 20 2f 2a 20 43 6f 73 74 20 6f 66 20 72 75 6e 6e   /* Cost of runn
16c0: 69 6e 67 20 65 61 63 68 20 6c 6f 6f 70 20 2a 2f  ing each loop */
16d0: 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e 4f 75  .  WhereCost nOu
16e0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69  t;       /* Esti
16f0: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
1700: 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20  output rows */. 
1710: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72   union {.    str
1720: 75 63 74 20 7b 20 20 20 20 20 20 20 20 20 20 20  uct {           
1730: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1740: 6f 6e 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  on for internal 
1750: 62 74 72 65 65 20 74 61 62 6c 65 73 20 2a 2f 0a  btree tables */.
1760: 20 20 20 20 20 20 69 6e 74 20 6e 45 71 3b 20 20        int nEq;  
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1780: 4e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  Number of equali
1790: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ty constraints *
17a0: 2f 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  /.      Index *p
17b0: 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 2f  Index;         /
17c0: 2a 20 49 6e 64 65 78 20 75 73 65 64 2c 20 6f 72  * Index used, or
17d0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 7d 20 62   NULL */.    } b
17e0: 74 72 65 65 3b 0a 20 20 20 20 73 74 72 75 63 74  tree;.    struct
17f0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
1800: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
1810: 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  for virtual tabl
1820: 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
1830: 69 64 78 4e 75 6d 3b 20 20 20 20 20 20 20 20 20  idxNum;         
1840: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62     /* Index numb
1850: 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6e  er */.      u8 n
1860: 65 65 64 46 72 65 65 3b 20 20 20 20 20 20 20 20  eedFree;        
1870: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 71     /* True if sq
1880: 6c 69 74 65 33 5f 66 72 65 65 28 69 64 78 53 74  lite3_free(idxSt
1890: 72 29 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a  r) is needed */.
18a0: 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72        u8 isOrder
18b0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
18c0: 54 72 75 65 20 69 66 20 73 61 74 69 73 66 69 65  True if satisfie
18d0: 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  s ORDER BY */.  
18e0: 20 20 20 20 75 31 36 20 6f 6d 69 74 4d 61 73 6b      u16 omitMask
18f0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
1900: 72 6d 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  rms that may be 
1910: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 20 20 20  omitted */.     
1920: 20 63 68 61 72 20 2a 69 64 78 53 74 72 3b 20 20   char *idxStr;  
1930: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1940: 20 69 64 65 6e 74 69 66 69 65 72 20 73 74 72 69   identifier stri
1950: 6e 67 20 2a 2f 0a 20 20 20 20 7d 20 76 74 61 62  ng */.    } vtab
1960: 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 77  ;.  } u;.  u32 w
1970: 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
1980: 20 2f 2a 20 57 48 45 52 45 5f 2a 20 66 6c 61 67   /* WHERE_* flag
1990: 73 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  s describing the
19a0: 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20 6e   plan */.  u16 n
19b0: 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  LTerm;          
19c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
19d0: 74 72 69 65 73 20 69 6e 20 61 4c 54 65 72 6d 5b  tries in aLTerm[
19e0: 5d 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a 20 77 68 65  ] */.  /**** whe
19f0: 72 65 4c 6f 6f 70 58 66 65 72 28 29 20 63 6f 70  reLoopXfer() cop
1a00: 69 65 73 20 66 69 65 6c 64 73 20 61 62 6f 76 65  ies fields above
1a10: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1a20: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 20 64 65 66 69  ********/.# defi
1a30: 6e 65 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46  ne WHERE_LOOP_XF
1a40: 45 52 5f 53 5a 20 6f 66 66 73 65 74 6f 66 28 57  ER_SZ offsetof(W
1a50: 68 65 72 65 4c 6f 6f 70 2c 6e 4c 53 6c 6f 74 29  hereLoop,nLSlot)
1a60: 0a 20 20 75 31 36 20 6e 4c 53 6c 6f 74 3b 20 20  .  u16 nLSlot;  
1a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a80: 65 72 20 6f 66 20 73 6c 6f 74 73 20 61 6c 6c 6f  er of slots allo
1a90: 63 61 74 65 64 20 66 6f 72 20 61 4c 54 65 72 6d  cated for aLTerm
1aa0: 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  [] */.  WhereTer
1ab0: 6d 20 2a 2a 61 4c 54 65 72 6d 3b 20 20 20 2f 2a  m **aLTerm;   /*
1ac0: 20 57 68 65 72 65 54 65 72 6d 73 20 75 73 65 64   WhereTerms used
1ad0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
1ae0: 2a 70 4e 65 78 74 4c 6f 6f 70 3b 20 2f 2a 20 4e  *pNextLoop; /* N
1af0: 65 78 74 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ext WhereLoop ob
1b00: 6a 65 63 74 20 69 6e 20 74 68 65 20 57 68 65 72  ject in the Wher
1b10: 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65  eClause */.  Whe
1b20: 72 65 54 65 72 6d 20 2a 61 4c 54 65 72 6d 53 70  reTerm *aLTermSp
1b30: 61 63 65 5b 34 5d 3b 20 20 2f 2a 20 49 6e 69 74  ace[4];  /* Init
1b40: 69 61 6c 20 61 4c 54 65 72 6d 5b 5d 20 73 70 61  ial aLTerm[] spa
1b50: 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 46 6f 72  ce */.};../* For
1b60: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1b70: 20 6f 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73   of methods */.s
1b80: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1b90: 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65  oopResize(sqlite
1ba0: 33 2a 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20  3*, WhereLoop*, 
1bb0: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  int);../*.** Eac
1bc0: 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
1bd0: 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20  is object holds 
1be0: 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 57 68  a sequence of Wh
1bf0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 0a  ereLoop objects.
1c00: 2a 2a 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ** that implemen
1c10: 74 20 73 6f 6d 65 20 6f 72 20 61 6c 6c 20 6f 66  t some or all of
1c20: 20 61 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a   a query plan..*
1c30: 2a 0a 2a 2a 20 54 68 69 6e 6b 20 6f 66 20 65 61  *.** Think of ea
1c40: 63 68 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ch WhereLoop obj
1c50: 65 63 74 73 20 61 73 20 61 20 6e 6f 64 65 20 69  ects as a node i
1c60: 6e 20 61 20 67 72 61 70 68 2c 20 77 68 69 63 68  n a graph, which
1c70: 20 61 72 63 73 0a 2a 2a 20 73 68 6f 77 69 6e 67   arcs.** showing
1c80: 20 64 65 70 65 6e 64 65 6e 63 65 73 20 61 6e 64   dependences and
1c90: 20 63 6f 73 74 73 20 66 6f 72 20 74 72 61 76 65   costs for trave
1ca0: 6c 6c 69 6e 67 20 62 65 74 77 65 65 6e 20 6e 6f  lling between no
1cb0: 64 65 73 2e 20 20 28 54 68 61 74 20 69 73 0a 2a  des.  (That is.*
1cc0: 2a 20 6e 6f 74 20 61 20 63 6f 6d 70 6c 65 74 65  * not a complete
1cd0: 6c 79 20 61 63 63 75 72 61 74 65 20 64 65 73 63  ly accurate desc
1ce0: 72 69 70 74 69 6f 6e 20 62 65 63 61 75 73 65 20  ription because 
1cf0: 57 68 65 72 65 4c 6f 6f 70 20 63 6f 73 74 73 20  WhereLoop costs 
1d00: 61 72 65 20 61 0a 2a 2a 20 76 65 63 74 6f 72 2c  are a.** vector,
1d10: 20 6e 6f 74 20 61 20 73 63 61 6c 61 72 2c 20 61   not a scalar, a
1d20: 6e 64 20 62 65 63 61 75 73 65 20 64 65 70 65 6e  nd because depen
1d30: 64 65 6e 63 65 73 20 61 72 65 20 6d 61 6e 79 2d  dences are many-
1d40: 74 6f 2d 6f 6e 65 2c 20 6e 6f 74 0a 2a 2a 20 6f  to-one, not.** o
1d50: 6e 65 2d 74 6f 2d 6f 6e 65 20 61 73 20 61 72 65  ne-to-one as are
1d60: 20 67 72 61 70 68 20 6e 6f 64 65 73 2e 20 20 42   graph nodes.  B
1d70: 75 74 20 69 74 20 69 73 20 61 20 75 73 65 66 75  ut it is a usefu
1d80: 6c 20 76 69 73 75 61 6c 69 7a 61 74 69 6f 6e 20  l visualization 
1d90: 61 69 64 2e 29 0a 2a 2a 20 54 68 65 6e 20 61 20  aid.).** Then a 
1da0: 57 68 65 72 65 50 61 74 68 20 6f 62 6a 65 63 74  WherePath object
1db0: 20 69 73 20 61 20 70 61 74 68 20 74 68 72 6f 75   is a path throu
1dc0: 67 68 20 74 68 65 20 67 72 61 70 68 20 74 68 61  gh the graph tha
1dd0: 74 20 76 69 73 69 74 73 20 73 6f 6d 65 0a 2a 2a  t visits some.**
1de0: 20 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 57   or all of the W
1df0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1e00: 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   once..**.** The
1e10: 20 22 73 6f 6c 76 65 72 22 20 77 6f 72 6b 73 20   "solver" works 
1e20: 62 79 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  by creating the 
1e30: 4e 20 62 65 73 74 20 57 68 65 72 65 50 61 74 68  N best WherePath
1e40: 20 6f 62 6a 65 63 74 73 20 6f 66 20 6c 65 6e 67   objects of leng
1e50: 74 68 0a 2a 2a 20 31 2e 20 20 54 68 65 6e 20 75  th.** 1.  Then u
1e60: 73 69 6e 67 20 74 68 6f 73 65 20 61 73 20 61 20  sing those as a 
1e70: 62 61 73 69 73 20 74 6f 20 63 6f 6d 70 75 74 65  basis to compute
1e80: 20 74 68 65 20 4e 20 62 65 73 74 20 57 68 65 72   the N best Wher
1e90: 65 50 61 74 68 20 6f 62 6a 65 63 74 73 0a 2a 2a  ePath objects.**
1ea0: 20 6f 66 20 6c 65 6e 67 74 68 20 32 2e 20 20 41   of length 2.  A
1eb0: 6e 64 20 73 6f 20 66 6f 72 74 68 20 75 6e 74 69  nd so forth unti
1ec0: 6c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  l the length of 
1ed0: 57 68 65 72 65 50 61 74 68 73 20 65 71 75 61 6c  WherePaths equal
1ee0: 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
1ef0: 6f 66 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20  of nodes in the 
1f00: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
1f10: 65 20 62 65 73 74 20 28 6c 6f 77 65 73 74 20 63  e best (lowest c
1f20: 6f 73 74 29 20 57 68 65 72 65 50 61 74 68 0a 2a  ost) WherePath.*
1f30: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 69 73 20  * at the end is 
1f40: 74 68 65 20 63 68 6f 6f 73 65 6e 20 71 75 65 72  the choosen quer
1f50: 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 73 74 72 75 63  y plan..*/.struc
1f60: 74 20 57 68 65 72 65 50 61 74 68 20 7b 0a 20 20  t WherePath {.  
1f70: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4c 6f 6f 70  Bitmask maskLoop
1f80: 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b  ;     /* Bitmask
1f90: 20 6f 66 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f   of all WhereLoo
1fa0: 70 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 69  p objects in thi
1fb0: 73 20 70 61 74 68 20 2a 2f 0a 20 20 42 69 74 6d  s path */.  Bitm
1fc0: 61 73 6b 20 72 65 76 4c 6f 6f 70 3b 20 20 20 20  ask revLoop;    
1fd0: 20 20 2f 2a 20 61 4c 6f 6f 70 5b 5d 73 20 74 68    /* aLoop[]s th
1fe0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 76  at should be rev
1ff0: 65 72 73 65 64 20 66 6f 72 20 4f 52 44 45 52 20  ersed for ORDER 
2000: 42 59 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  BY */.  WhereCos
2010: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 2f 2a  t nRow;       /*
2020: 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
2030: 72 20 6f 66 20 72 6f 77 73 20 67 65 6e 65 72 61  r of rows genera
2040: 74 65 64 20 62 79 20 74 68 69 73 20 70 61 74 68  ted by this path
2050: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
2060: 72 43 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20 54  rCost;      /* T
2070: 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 74 68 69  otal cost of thi
2080: 73 20 70 61 74 68 20 2a 2f 0a 20 20 75 38 20 69  s path */.  u8 i
2090: 73 4f 72 64 65 72 65 64 3b 20 20 20 20 20 20 20  sOrdered;       
20a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
20b0: 73 20 70 61 74 68 20 73 61 74 69 73 66 69 65 73  s path satisfies
20c0: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 75   ORDER BY */.  u
20d0: 38 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  8 isOrderedValid
20e0: 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ;    /* True if 
20f0: 74 68 65 20 69 73 4f 72 64 65 72 65 64 20 66 69  the isOrdered fi
2100: 65 6c 64 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  eld is valid */.
2110: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 61 4c    WhereLoop **aL
2120: 6f 6f 70 3b 20 20 20 20 2f 2a 20 41 72 72 61 79  oop;    /* Array
2130: 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
2140: 6a 65 63 74 73 20 69 6d 70 6c 65 6d 65 6e 74 69  jects implementi
2150: 6e 67 20 74 68 69 73 20 70 61 74 68 20 2a 2f 0a  ng this path */.
2160: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75  };../*.** The qu
2170: 65 72 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73  ery generator us
2180: 65 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69  es an array of i
2190: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73  nstances of this
21a0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a   structure to.**
21b0: 20 68 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65   help it analyze
21c0: 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
21d0: 6f 6e 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  ons of the WHERE
21e0: 20 63 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57   clause.  Each W
21f0: 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73  HERE.** clause s
2200: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
2210: 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74  separated from t
2220: 68 65 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44  he others by AND
2230: 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75   operators,.** u
2240: 73 75 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74  sually, or somet
2250: 69 6d 65 73 20 73 75 62 65 78 70 72 65 73 73 69  imes subexpressi
2260: 6f 6e 73 20 73 65 70 61 72 61 74 65 64 20 62 79  ons separated by
2270: 20 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57   OR..**.** All W
2280: 68 65 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f  hereTerms are co
2290: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73  llected into a s
22a0: 69 6e 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73  ingle WhereClaus
22b0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a  e structure.  .*
22c0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
22d0: 69 64 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a  identity holds:.
22e0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65  **.**        Whe
22f0: 72 65 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68  reTerm.pWC->a[Wh
2300: 65 72 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20  ereTerm.idx] == 
2310: 57 68 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20  WhereTerm.**.** 
2320: 57 68 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f  When a term is o
2330: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
2340: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 58  *              X
2350: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a   <op> <expr>.**.
2360: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
2370: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20  column name and 
2380: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63  <op> is one of c
2390: 65 72 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73  ertain operators
23a0: 2c 0a 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54  ,.** then WhereT
23b0: 65 72 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61  erm.leftCursor a
23c0: 6e 64 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c  nd WhereTerm.u.l
23d0: 65 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64  eftColumn record
23e0: 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e   the.** cursor n
23f0: 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e  umber and column
2400: 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20   number for X.  
2410: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
2420: 74 6f 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  tor records.** t
2430: 68 65 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20  he <op> using a 
2440: 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67  bitmask encoding
2450: 20 64 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78   defined by WO_x
2460: 78 78 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a  xx below.  The.*
2470: 2a 20 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61  * use of a bitma
2480: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20  sk encoding for 
2490: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c  the operator all
24a0: 6f 77 73 20 75 73 20 74 6f 20 73 65 61 72 63 68  ows us to search
24b0: 0a 2a 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20  .** quickly for 
24c0: 74 65 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68  terms that match
24d0: 20 61 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20   any of several 
24e0: 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74  different operat
24f0: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65  ors..**.** A Whe
2500: 72 65 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73  reTerm might als
2510: 6f 20 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65  o be two or more
2520: 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63   subterms connec
2530: 74 65 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a  ted by OR:.**.**
2540: 20 20 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c           (t1.X <
2550: 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28  op> <expr>) OR (
2560: 74 31 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  t1.Y <op> <expr>
2570: 29 20 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  ) OR .....**.** 
2580: 49 6e 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63  In this second c
2590: 61 73 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74  ase, wtFlag as t
25a0: 68 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73  he TERM_ORINFO s
25b0: 65 74 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72  et and eOperator
25c0: 3d 3d 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74  ==WO_OR.** and t
25d0: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
25e0: 4f 72 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69  OrInfo field poi
25f0: 6e 74 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79  nts to auxiliary
2600: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
2610: 74 0a 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65  t.** is collecte
2620: 64 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a  d about the.**.*
2630: 2a 20 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74  * If a term in t
2640: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2650: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65  does not match e
2660: 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  ither of the two
2670: 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74   previous.** cat
2680: 65 67 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f  egories, then eO
2690: 70 65 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65  perator==0.  The
26a0: 20 57 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72   WhereTerm.pExpr
26b0: 20 66 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20   field is still 
26c0: 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72  set.** to the or
26d0: 69 67 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73  iginal subexpres
26e0: 73 69 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64  sion content and
26f0: 20 77 74 46 6c 61 67 73 20 69 73 20 73 65 74 20   wtFlags is set 
2700: 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  up appropriately
2710: 0a 2a 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72  .** but no other
2720: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57   fields in the W
2730: 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20  hereTerm object 
2740: 61 72 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a  are meaningful..
2750: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72  **.** When eOper
2760: 61 74 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52  ator!=0, prereqR
2770: 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71 41  ight and prereqA
2780: 6c 6c 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f  ll record sets o
2790: 66 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  f cursor numbers
27a0: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f  ,.** but they do
27b0: 20 73 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20   so indirectly. 
27c0: 20 41 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d   A single WhereM
27d0: 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
27e0: 20 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63   translates.** c
27f0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74  ursor number int
2800: 6f 20 62 69 74 73 20 61 6e 64 20 74 68 65 20 74  o bits and the t
2810: 72 61 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73  ranslated bit is
2820: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70   stored in the p
2830: 72 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e  rereq.** fields.
2840: 20 20 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f    The translatio
2850: 6e 20 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64  n is used in ord
2860: 65 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74  er to maximize t
2870: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
2880: 62 69 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66  bits that will f
2890: 69 74 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e  it in a Bitmask.
28a0: 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f    The VDBE curso
28b0: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
28c0: 62 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74  be.** spread out
28d0: 20 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65   over the non-ne
28e0: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e  gative integers.
28f0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
2900: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  he cursor.** num
2910: 62 65 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c  bers might be 3,
2920: 20 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32   8, 9, 10, 20, 2
2930: 33 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20  3, 41, and 45.  
2940: 54 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  The WhereMaskSet
2950: 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74  .** translates t
2960: 68 65 73 65 20 73 70 61 72 73 65 20 63 75 72 73  hese sparse curs
2970: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
2980: 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65  consecutive inte
2990: 67 65 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e  gers.** beginnin
29a0: 67 20 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65  g with 0 in orde
29b0: 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65  r to make the be
29c0: 73 74 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20  st possible use 
29d0: 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  of the available
29e0: 0a 2a 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20  .** bits in the 
29f0: 42 69 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e  Bitmask.  So, in
2a00: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
2a10: 76 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ve, the cursor n
2a20: 75 6d 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20  umbers.** would 
2a30: 62 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69  be mapped into i
2a40: 6e 74 65 67 65 72 73 20 30 20 74 68 72 6f 75 67  ntegers 0 throug
2a50: 68 20 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  h 7..**.** The n
2a60: 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
2a70: 6e 20 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69  n a join is limi
2a80: 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
2a90: 72 20 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20  r of bits.** in 
2aa0: 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20  prereqRight and 
2ab0: 70 72 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20  prereqAll.  The 
2ac0: 64 65 66 61 75 6c 74 20 69 73 20 36 34 20 62 69  default is 64 bi
2ad0: 74 73 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65  ts, hence SQLite
2ae0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65  .** is only able
2af0: 20 74 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e   to process join
2b00: 73 20 77 69 74 68 20 36 34 20 6f 72 20 66 65 77  s with 64 or few
2b10: 65 72 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  er tables..*/.st
2b20: 72 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b  ruct WhereTerm {
2b30: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20  .  Expr *pExpr; 
2b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2b50: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62  inter to the sub
2b60: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
2b70: 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a  is this term */.
2b80: 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20    int iParent;  
2b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
2ba0: 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72  able pWC->a[iPar
2bb0: 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74  ent] when this t
2bc0: 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a  erm disabled */.
2bd0: 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72    int leftCursor
2be0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
2bf0: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20  sor number of X 
2c00: 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  in "X <op> <expr
2c10: 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a  >" */.  union {.
2c20: 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75      int leftColu
2c30: 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  mn;         /* C
2c40: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
2c50: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
2c60: 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72  pr>" */.    Wher
2c70: 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f  eOrInfo *pOrInfo
2c80: 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66  ;   /* Extra inf
2c90: 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70  ormation if (eOp
2ca0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21  erator & WO_OR)!
2cb0: 3d 30 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 41  =0 */.    WhereA
2cc0: 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f  ndInfo *pAndInfo
2cd0: 3b 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 72  ; /* Extra infor
2ce0: 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70 65 72  mation if (eOper
2cf0: 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21 3d 30  ator& WO_AND)!=0
2d00: 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 31 36   */.  } u;.  u16
2d10: 20 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 20 20   eOperator;     
2d20: 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78 20       /* A WO_xx 
2d30: 76 61 6c 75 65 20 64 65 73 63 72 69 62 69 6e 67  value describing
2d40: 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 77 74   <op> */.  u8 wt
2d50: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
2d60: 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78 20 62     /* TERM_xxx b
2d70: 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65 20 62  it flags.  See b
2d80: 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e 43 68  elow */.  u8 nCh
2d90: 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
2da0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2db0: 68 69 6c 64 72 65 6e 20 74 68 61 74 20 6d 75 73  hildren that mus
2dc0: 74 20 64 69 73 61 62 6c 65 20 75 73 20 2a 2f 0a  t disable us */.
2dd0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2de0: 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  WC;       /* The
2df0: 20 63 6c 61 75 73 65 20 74 68 69 73 20 74 65 72   clause this ter
2e00: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a 2f 0a  m is part of */.
2e10: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
2e20: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42 69 74  Right;    /* Bit
2e30: 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 75  mask of tables u
2e40: 73 65 64 20 62 79 20 70 45 78 70 72 2d 3e 70 52  sed by pExpr->pR
2e50: 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ight */.  Bitmas
2e60: 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20  k prereqAll;    
2e70: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
2e80: 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65  tables reference
2e90: 64 20 62 79 20 70 45 78 70 72 20 2a 2f 0a 7d 3b  d by pExpr */.};
2ea0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
2eb0: 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72 65 54  values of WhereT
2ec0: 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a 2f 0a 23  erm.wtFlags.*/.#
2ed0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e 41  define TERM_DYNA
2ee0: 4d 49 43 20 20 20 20 30 78 30 31 20 20 20 2f 2a  MIC    0x01   /*
2ef0: 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   Need to call sq
2f00: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2f10: 64 62 2c 20 70 45 78 70 72 29 20 2a 2f 0a 23 64  db, pExpr) */.#d
2f20: 65 66 69 6e 65 20 54 45 52 4d 5f 56 49 52 54 55  efine TERM_VIRTU
2f30: 41 4c 20 20 20 20 30 78 30 32 20 20 20 2f 2a 20  AL    0x02   /* 
2f40: 41 64 64 65 64 20 62 79 20 74 68 65 20 6f 70 74  Added by the opt
2f50: 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f 74 20  imizer.  Do not 
2f60: 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  code */.#define 
2f70: 54 45 52 4d 5f 43 4f 44 45 44 20 20 20 20 20 20  TERM_CODED      
2f80: 30 78 30 34 20 20 20 2f 2a 20 54 68 69 73 20 74  0x04   /* This t
2f90: 65 72 6d 20 69 73 20 61 6c 72 65 61 64 79 20 63  erm is already c
2fa0: 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  oded */.#define 
2fb0: 54 45 52 4d 5f 43 4f 50 49 45 44 20 20 20 20 20  TERM_COPIED     
2fc0: 30 78 30 38 20 20 20 2f 2a 20 48 61 73 20 61 20  0x08   /* Has a 
2fd0: 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69 6e 65  child */.#define
2fe0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 20 20 20   TERM_ORINFO    
2ff0: 20 30 78 31 30 20 20 20 2f 2a 20 4e 65 65 64 20   0x10   /* Need 
3000: 74 6f 20 66 72 65 65 20 74 68 65 20 57 68 65 72  to free the Wher
3010: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20  eTerm.u.pOrInfo 
3020: 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65 66 69 6e  object */.#defin
3030: 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 20  e TERM_ANDINFO  
3040: 20 20 30 78 32 30 20 20 20 2f 2a 20 4e 65 65 64    0x20   /* Need
3050: 20 74 6f 20 66 72 65 65 20 74 68 65 20 57 68 65   to free the Whe
3060: 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64 49 6e 66  reTerm.u.pAndInf
3070: 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66 69 6e 65  o obj */.#define
3080: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20 20 20   TERM_OR_OK     
3090: 20 30 78 34 30 20 20 20 2f 2a 20 55 73 65 64 20   0x40   /* Used 
30a0: 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65  during OR-clause
30b0: 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23   processing */.#
30c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
30d0: 42 4c 45 5f 53 54 41 54 33 0a 23 20 20 64 65 66  BLE_STAT3.#  def
30e0: 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20  ine TERM_VNULL  
30f0: 20 20 30 78 38 30 20 20 20 2f 2a 20 4d 61 6e 75    0x80   /* Manu
3100: 66 61 63 74 75 72 65 64 20 78 3e 4e 55 4c 4c 20  factured x>NULL 
3110: 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74 65 72 6d 20  or x<=NULL term 
3120: 2a 2f 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  */.#else.#  defi
3130: 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20 20  ne TERM_VNULL   
3140: 20 30 78 30 30 20 20 20 2f 2a 20 44 69 73 61 62   0x00   /* Disab
3150: 6c 65 64 20 69 66 20 6e 6f 74 20 75 73 69 6e 67  led if not using
3160: 20 73 74 61 74 33 20 2a 2f 0a 23 65 6e 64 69 66   stat3 */.#endif
3170: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
3180: 6e 63 65 20 6f 66 20 74 68 65 20 57 68 65 72 65  nce of the Where
3190: 53 63 61 6e 20 6f 62 6a 65 63 74 20 69 73 20 75  Scan object is u
31a0: 73 65 64 20 61 73 20 61 6e 20 69 74 65 72 61 74  sed as an iterat
31b0: 6f 72 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 0a  or for locating.
31c0: 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  ** terms in the 
31d0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
31e0: 74 20 61 72 65 20 75 73 65 66 75 6c 20 74 6f 20  t are useful to 
31f0: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
3200: 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  r..*/.struct Whe
3210: 72 65 53 63 61 6e 20 7b 0a 20 20 57 68 65 72 65  reScan {.  Where
3220: 43 6c 61 75 73 65 20 2a 70 4f 72 69 67 57 43 3b  Clause *pOrigWC;
3230: 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
3240: 6c 2c 20 69 6e 6e 65 72 6d 6f 73 74 20 57 68 65  l, innermost Whe
3250: 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  reClause */.  Wh
3260: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
3270: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
3280: 65 43 6c 61 75 73 65 20 63 75 72 72 65 6e 74 6c  eClause currentl
3290: 79 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20  y being scanned 
32a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  */.  char *zColl
32b0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
32c0: 2f 2a 20 52 65 71 75 69 72 65 64 20 63 6f 6c 6c  /* Required coll
32d0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20  ating sequence, 
32e0: 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20  if not NULL */. 
32f0: 20 63 68 61 72 20 69 64 78 61 66 66 3b 20 20 20   char idxaff;   
3300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
3310: 75 73 74 20 6d 61 74 63 68 20 74 68 69 73 20 61  ust match this a
3320: 66 66 69 6e 69 74 79 2c 20 69 66 20 7a 43 6f 6c  ffinity, if zCol
3330: 6c 4e 61 6d 65 21 3d 4e 55 4c 4c 20 2a 2f 0a 20  lName!=NULL */. 
3340: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6e   unsigned char n
3350: 45 71 75 69 76 3b 20 20 20 20 20 20 2f 2a 20 4e  Equiv;      /* N
3360: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3370: 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a   in aEquiv[] */.
3380: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3390: 69 45 71 75 69 76 3b 20 20 20 20 20 20 2f 2a 20  iEquiv;      /* 
33a0: 4e 65 78 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  Next unused slot
33b0: 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a   in aEquiv[] */.
33c0: 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20 20 20    u32 opMask;   
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33e0: 41 63 63 65 70 74 61 62 6c 65 20 6f 70 65 72 61  Acceptable opera
33f0: 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b  tors */.  int k;
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3410: 20 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73       /* Resume s
3420: 63 61 6e 6e 69 6e 67 20 61 74 20 74 68 69 73 2d  canning at this-
3430: 3e 70 57 43 2d 3e 61 5b 74 68 69 73 2d 3e 6b 5d  >pWC->a[this->k]
3440: 20 2a 2f 0a 20 20 69 6e 74 20 61 45 71 75 69 76   */.  int aEquiv
3450: 5b 32 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [22];           
3460: 20 2f 2a 20 43 75 72 73 6f 72 2c 43 6f 6c 75 6d   /* Cursor,Colum
3470: 6e 20 70 61 69 72 73 20 66 6f 72 20 65 71 75 69  n pairs for equi
3480: 76 61 6c 65 6e 63 65 20 63 6c 61 73 73 65 73 20  valence classes 
3490: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
34a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
34b0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
34c0: 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e  ure holds all in
34d0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
34e0: 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  a.** WHERE claus
34f0: 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20  e.  Mostly this 
3500: 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66  is a container f
3510: 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  or one or more W
3520: 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  hereTerms..**.**
3530: 20 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   Explanation of 
3540: 70 4f 75 74 65 72 3a 20 20 46 6f 72 20 61 20 57  pOuter:  For a W
3550: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
3560: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
3570: 20 20 20 20 20 20 20 20 61 20 41 4e 44 20 28 28          a AND ((
3580: 62 20 41 4e 44 20 63 29 20 4f 52 20 28 64 20 41  b AND c) OR (d A
3590: 4e 44 20 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a  ND e)) AND f.**.
35a0: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 70  ** There are sep
35b0: 61 72 61 74 65 20 57 68 65 72 65 43 6c 61 75 73  arate WhereClaus
35c0: 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 74 68  e objects for th
35d0: 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 20 61  e whole clause a
35e0: 6e 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75  nd for.** the su
35f0: 62 63 6c 61 75 73 65 73 20 22 28 62 20 41 4e 44  bclauses "(b AND
3600: 20 63 29 22 20 61 6e 64 20 22 28 64 20 41 4e 44   c)" and "(d AND
3610: 20 65 29 22 2e 20 20 54 68 65 20 70 4f 75 74 65   e)".  The pOute
3620: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a  r field of the.*
3630: 2a 20 73 75 62 63 6c 61 75 73 65 73 20 70 6f 69  * subclauses poi
3640: 6e 74 73 20 74 6f 20 74 68 65 20 57 68 65 72 65  nts to the Where
3650: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 66 6f  Clause object fo
3660: 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75  r the whole clau
3670: 73 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  se..*/.struct Wh
3680: 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 57 68  ereClause {.  Wh
3690: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
36a0: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
36b0: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
36c0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
36d0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 75 74  hereClause *pOut
36e0: 65 72 3b 20 20 20 20 20 2f 2a 20 4f 75 74 65 72  er;     /* Outer
36f0: 20 63 6f 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a   conjunction */.
3700: 20 20 75 38 20 6f 70 3b 20 20 20 20 20 20 20 20    u8 op;        
3710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
3720: 6c 69 74 20 6f 70 65 72 61 74 6f 72 2e 20 20 54  lit operator.  T
3730: 4b 5f 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a  K_AND or TK_OR *
3740: 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20  /.  int nTerm;  
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3760: 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
3770: 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20  */.  int nSlot; 
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3790: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
37a0: 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57  es in a[] */.  W
37b0: 68 65 72 65 54 65 72 6d 20 2a 61 3b 20 20 20 20  hereTerm *a;    
37c0: 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20          /* Each 
37d0: 61 5b 5d 20 64 65 73 63 72 69 62 65 73 20 61 20  a[] describes a 
37e0: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
37f0: 45 20 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66 20  E cluase */.#if 
3800: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53  defined(SQLITE_S
3810: 4d 41 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57 68  MALL_STACK).  Wh
3820: 65 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b  ereTerm aStatic[
3830: 31 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  1];    /* Initia
3840: 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66  l static space f
3850: 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a  or a[] */.#else.
3860: 20 20 57 68 65 72 65 54 65 72 6d 20 61 53 74 61    WhereTerm aSta
3870: 74 69 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49 6e  tic[8];    /* In
3880: 69 74 69 61 6c 20 73 74 61 74 69 63 20 73 70 61  itial static spa
3890: 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65  ce for a[] */.#e
38a0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
38b0: 20 57 68 65 72 65 54 65 72 6d 20 77 69 74 68 20   WhereTerm with 
38c0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52  eOperator==WO_OR
38d0: 20 68 61 73 20 69 74 73 20 75 2e 70 4f 72 49 6e   has its u.pOrIn
38e0: 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74  fo pointer set t
38f0: 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c  o.** a dynamical
3900: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73  ly allocated ins
3910: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
3920: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3930: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
3940: 65 4f 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72  eOrInfo {.  Wher
3950: 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20  eClause wc;     
3960: 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73       /* Decompos
3970: 69 74 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65  ition into subte
3980: 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
3990: 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20   indexable;     
39a0: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
39b0: 61 6c 6c 20 69 6e 64 65 78 61 62 6c 65 20 74 61  all indexable ta
39c0: 62 6c 65 73 20 69 6e 20 74 68 65 20 63 6c 61 75  bles in the clau
39d0: 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  se */.};../*.** 
39e0: 41 20 57 68 65 72 65 54 65 72 6d 20 77 69 74 68  A WhereTerm with
39f0: 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41   eOperator==WO_A
3a00: 4e 44 20 68 61 73 20 69 74 73 20 75 2e 70 41 6e  ND has its u.pAn
3a10: 64 49 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65  dInfo pointer se
3a20: 74 20 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69  t to.** a dynami
3a30: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
3a40: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3a50: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3a60: 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  ure..*/.struct W
3a70: 68 65 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20  hereAndInfo {.  
3a80: 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20  WhereClause wc; 
3a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3aa0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 62 72  subexpression br
3ab0: 6f 6b 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a  oken out */.};..
3ac0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
3ad0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3ae0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
3af0: 70 73 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61  ps track of a ma
3b00: 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e  pping.** between
3b10: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
3b20: 62 65 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66  bers and bits of
3b30: 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e   the bitmasks in
3b40: 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
3b50: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
3b60: 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d  r numbers are sm
3b70: 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e  all integers con
3b80: 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72  tained in .** Sr
3b90: 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73  cList_item.iCurs
3ba0: 6f 72 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62  or and Expr.iTab
3bb0: 6c 65 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20  le fields.  For 
3bc0: 61 6e 79 20 67 69 76 65 6e 20 57 48 45 52 45 20  any given WHERE 
3bd0: 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20  .** clause, the 
3be0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d  cursor numbers m
3bf0: 69 67 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77  ight not begin w
3c00: 69 74 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d  ith 0 and they m
3c10: 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20  ight.** contain 
3c20: 67 61 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62  gaps in the numb
3c30: 65 72 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ering sequence. 
3c40: 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   But we want to 
3c50: 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20  make maximum.** 
3c60: 75 73 65 20 6f 66 20 74 68 65 20 62 69 74 73 20  use of the bits 
3c70: 69 6e 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e  in our bitmasks.
3c80: 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65    This structure
3c90: 20 70 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70   provides a mapp
3ca0: 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ing.** from the 
3cb0: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
3cc0: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
3cd0: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 20  cutive integers 
3ce0: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74  beginning.** wit
3cf0: 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68  h 0..**.** If Wh
3d00: 65 72 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d  ereMaskSet.ix[A]
3d10: 3d 3d 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==B it means tha
3d20: 74 20 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f  t The A-th bit o
3d30: 66 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63  f a Bitmask.** c
3d40: 6f 72 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20  orresponds VDBE 
3d50: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e  cursor number B.
3d60: 20 20 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f    The A-th bit o
3d70: 66 20 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31  f a bitmask is 1
3d80: 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  <<A..**.** For e
3d90: 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57  xample, if the W
3da0: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
3db0: 65 73 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73  ession used thes
3dc0: 65 20 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72  e VDBE.** cursor
3dd0: 73 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c  s:  4, 5, 8, 29,
3de0: 20 35 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74   57, 73.  Then t
3df0: 68 65 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  he  WhereMaskSet
3e00: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f   structure.** wo
3e10: 75 6c 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75  uld map those cu
3e20: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
3e30: 6f 20 62 69 74 73 20 30 20 74 68 72 6f 75 67 68  o bits 0 through
3e40: 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74   5..**.** Note t
3e50: 68 61 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20  hat the mapping 
3e60: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
3e70: 6c 79 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20  ly ordered.  In 
3e80: 74 68 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61  the example.** a
3e90: 62 6f 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e  bove, the mappin
3ea0: 67 20 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20  g might go like 
3eb0: 74 68 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e  this:  4->3, 5->
3ec0: 31 2c 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a  1, 8->2, 29->0,.
3ed0: 2a 2a 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e  ** 57->5, 73->4.
3ee0: 20 20 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20    Or one of 719 
3ef0: 6f 74 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f  other combinatio
3f00: 6e 73 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  ns might be used
3f10: 2e 20 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  . It.** does not
3f20: 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20   really matter. 
3f30: 20 57 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61   What is importa
3f40: 6e 74 20 69 73 20 74 68 61 74 20 73 70 61 72 73  nt is that spars
3f50: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  e cursor.** numb
3f60: 65 72 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70  ers all get mapp
3f70: 65 64 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62  ed into bit numb
3f80: 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ers that begin w
3f90: 69 74 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69  ith 0 and contai
3fa0: 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f  n.** no gaps..*/
3fb0: 0a 73 74 72 75 63 74 20 57 68 65 72 65 4d 61 73  .struct WhereMas
3fc0: 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20  kSet {.  int n; 
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fe0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3ff0: 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63 75 72   of assigned cur
4000: 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  sor values */.  
4010: 69 6e 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20  int ix[BMS];    
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4030: 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   Cursor assigned
4040: 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a   to each bit */.
4050: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f  };../*.** This o
4060: 62 6a 65 63 74 20 69 73 20 61 20 63 6f 6e 76 65  bject is a conve
4070: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 68  nience wrapper h
4080: 6f 6c 64 69 6e 67 20 61 6c 6c 20 69 6e 66 6f 72  olding all infor
4090: 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 0a 2a 2a  mation needed.**
40a0: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 57 68   to construct Wh
40b0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
40c0: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
40d0: 20 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 72 75 63   query..*/.struc
40e0: 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  t WhereLoopBuild
40f0: 65 72 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er {.  WhereInfo
4100: 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
4110: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
4120: 61 62 6f 75 74 20 74 68 69 73 20 57 48 45 52 45  about this WHERE
4130: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
4140: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
4150: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
4160: 74 65 72 6d 73 20 2a 2f 0a 20 20 45 78 70 72 4c  terms */.  ExprL
4170: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
4180: 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59       /* ORDER BY
4190: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
41a0: 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
41b0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
41c0: 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  te WhereLoop */.
41d0: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 42 65    WhereLoop *pBe
41e0: 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  st;         /* I
41f0: 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 73 74 6f 72  f non-NULL, stor
4200: 65 20 73 69 6e 67 6c 65 20 62 65 73 74 20 6c 6f  e single best lo
4210: 6f 70 20 68 65 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f  op here */.};../
4220: 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52 45 20 63  *.** The WHERE c
4230: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
4240: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 77 6f   routine has two
4250: 20 68 61 6c 76 65 73 2e 20 20 54 68 65 0a 2a 2a   halves.  The.**
4260: 20 66 69 72 73 74 20 70 61 72 74 20 64 6f 65 73   first part does
4270: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
4280: 65 20 57 48 45 52 45 20 6c 6f 6f 70 20 61 6e 64  e WHERE loop and
4290: 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 68   the second.** h
42a0: 61 6c 66 20 64 6f 65 73 20 74 68 65 20 74 61 69  alf does the tai
42b0: 6c 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  l of the WHERE l
42c0: 6f 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61 6e 63  oop.  An instanc
42d0: 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73 74 72  e of.** this str
42e0: 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e  ucture is return
42f0: 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20  ed by the first 
4300: 68 61 6c 66 20 61 6e 64 20 70 61 73 73 65 64 0a  half and passed.
4310: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 63 6f  ** into the seco
4320: 6e 64 20 68 61 6c 66 20 74 6f 20 67 69 76 65 20  nd half to give 
4330: 73 6f 6d 65 20 63 6f 6e 74 69 6e 75 69 74 79 2e  some continuity.
4340: 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  .**.** An instan
4350: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
4360: 74 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6d 70  t holds the comp
4370: 6c 65 74 65 20 73 74 61 74 65 20 6f 66 20 74 68  lete state of th
4380: 65 20 71 75 65 72 79 0a 2a 2a 20 70 6c 61 6e 6e  e query.** plann
4390: 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  er..*/.struct Wh
43a0: 65 72 65 49 6e 66 6f 20 7b 0a 20 20 50 61 72 73  ereInfo {.  Pars
43b0: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
43c0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
43d0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
43e0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
43f0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
4400: 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist;        /* L
4410: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
4420: 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45   the join */.  E
4430: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
4440: 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  y;       /* The 
4450: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
4460: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  or NULL */.  Exp
4470: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
4480: 3b 20 20 20 20 20 20 2f 2a 20 44 49 53 54 49 4e  ;      /* DISTIN
4490: 43 54 20 4f 4e 20 76 61 6c 75 65 73 2c 20 6f 72  CT ON values, or
44a0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
44b0: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 73 3b 20 20 20  Loop *pLoops;   
44c0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
44d0: 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
44e0: 6a 65 63 74 73 20 2a 2f 0a 20 20 42 69 74 6d 61  jects */.  Bitma
44f0: 73 6b 20 72 65 76 4d 61 73 6b 3b 20 20 20 20 20  sk revMask;     
4500: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
4510: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
4520: 68 61 74 20 6e 65 65 64 20 72 65 76 65 72 73 69  hat need reversi
4530: 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  ng */.  WhereCos
4540: 74 20 6e 52 6f 77 4f 75 74 3b 20 20 20 20 20 20  t nRowOut;      
4550: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
4560: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
4570: 72 6f 77 73 20 2a 2f 0a 20 20 75 31 36 20 77 63  rows */.  u16 wc
4580: 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  trlFlags;       
4590: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 6f 72 69      /* Flags ori
45a0: 67 69 6e 61 6c 6c 79 20 70 61 73 73 65 64 20 74  ginally passed t
45b0: 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
45c0: 67 69 6e 28 29 20 2a 2f 0a 20 20 75 38 20 62 4f  gin() */.  u8 bO
45d0: 42 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  BSat;           
45e0: 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59       /* ORDER BY
45f0: 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e   satisfied by in
4600: 64 69 63 65 73 20 2a 2f 0a 20 20 75 38 20 6f 6b  dices */.  u8 ok
4610: 4f 6e 65 50 61 73 73 3b 20 20 20 20 20 20 20 20  OnePass;        
4620: 20 20 20 20 20 2f 2a 20 4f 6b 20 74 6f 20 75 73       /* Ok to us
4630: 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  e one-pass algor
4640: 69 74 68 6d 20 66 6f 72 20 55 50 44 41 54 45 2f  ithm for UPDATE/
4650: 44 45 4c 45 54 45 20 2a 2f 0a 20 20 75 38 20 75  DELETE */.  u8 u
4660: 6e 74 65 73 74 65 64 54 65 72 6d 73 3b 20 20 20  ntestedTerms;   
4670: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c        /* Not all
4680: 20 57 48 45 52 45 20 74 65 72 6d 73 20 72 65 73   WHERE terms res
4690: 6f 6c 76 65 64 20 62 79 20 6f 75 74 65 72 20 6c  olved by outer l
46a0: 6f 6f 70 20 2a 2f 0a 20 20 75 38 20 65 44 69 73  oop */.  u8 eDis
46b0: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
46c0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
46d0: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
46e0: 2a 20 76 61 6c 75 65 73 20 62 65 6c 6f 77 20 2a  * values below *
46f0: 2f 0a 20 20 69 6e 74 20 69 54 6f 70 3b 20 20 20  /.  int iTop;   
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4710: 20 54 68 65 20 76 65 72 79 20 62 65 67 69 6e 6e   The very beginn
4720: 69 6e 67 20 6f 66 20 74 68 65 20 57 48 45 52 45  ing of the WHERE
4730: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69   loop */.  int i
4740: 43 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 20  Continue;       
4750: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
4760: 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
4770: 74 68 20 6e 65 78 74 20 72 65 63 6f 72 64 20 2a  th next record *
4780: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 3b 20  /.  int iBreak; 
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
47a0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
47b0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  eak out of the l
47c0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  oop */.  int nLe
47d0: 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  vel;            
47e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
47f0: 6e 65 73 74 65 64 20 6c 6f 6f 70 20 2a 2f 0a 20  nested loop */. 
4800: 20 69 6e 74 20 73 61 76 65 64 4e 51 75 65 72 79   int savedNQuery
4810: 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20 70 50  Loop;      /* pP
4820: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
4830: 20 6f 75 74 73 69 64 65 20 74 68 65 20 57 48 45   outside the WHE
4840: 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65  RE loop */.  Whe
4850: 72 65 4d 61 73 6b 53 65 74 20 73 4d 61 73 6b 53  reMaskSet sMaskS
4860: 65 74 3b 20 20 20 20 2f 2a 20 4d 61 70 20 63 75  et;    /* Map cu
4870: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20  rsor numbers to 
4880: 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68  bitmasks */.  Wh
4890: 65 72 65 43 6c 61 75 73 65 20 73 57 43 3b 20 20  ereClause sWC;  
48a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d          /* Decom
48b0: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
48c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
48d0: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 61 5b 31    WhereLevel a[1
48e0: 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ];          /* I
48f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
4900: 20 65 61 63 68 20 6e 65 73 74 20 6c 6f 6f 70 20   each nest loop 
4910: 69 6e 20 57 48 45 52 45 20 2a 2f 0a 7d 3b 0a 0a  in WHERE */.};..
4920: 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73 20 66  /*.** Bitmasks f
4930: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  or the operators
4940: 20 6f 6e 20 57 68 65 72 65 54 65 72 6d 20 6f 62   on WhereTerm ob
4950: 6a 65 63 74 73 2e 20 20 54 68 65 73 65 20 61 72  jects.  These ar
4960: 65 20 61 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 6f  e all.** operato
4970: 72 73 20 74 68 61 74 20 61 72 65 20 6f 66 20 69  rs that are of i
4980: 6e 74 65 72 65 73 74 20 74 6f 20 74 68 65 20 71  nterest to the q
4990: 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20 41  uery planner.  A
49a0: 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69  n.** OR-ed combi
49b0: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  nation of these 
49c0: 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73  values can be us
49d0: 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e  ed when searchin
49e0: 67 20 66 6f 72 0a 2a 2a 20 70 61 72 74 69 63 75  g for.** particu
49f0: 6c 61 72 20 57 68 65 72 65 54 65 72 6d 73 20 77  lar WhereTerms w
4a00: 69 74 68 69 6e 20 61 20 57 68 65 72 65 43 6c 61  ithin a WhereCla
4a10: 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  use..*/.#define 
4a20: 57 4f 5f 49 4e 20 20 20 20 20 30 78 30 30 31 0a  WO_IN     0x001.
4a30: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20 20  #define WO_EQ   
4a40: 20 20 30 78 30 30 32 0a 23 64 65 66 69 6e 65 20    0x002.#define 
4a50: 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_LT     (WO_EQ
4a60: 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29  <<(TK_LT-TK_EQ))
4a70: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20  .#define WO_LE  
4a80: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c     (WO_EQ<<(TK_L
4a90: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
4aa0: 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f  e WO_GT     (WO_
4ab0: 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51  EQ<<(TK_GT-TK_EQ
4ac0: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45  )).#define WO_GE
4ad0: 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b       (WO_EQ<<(TK
4ae0: 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66  _GE-TK_EQ)).#def
4af0: 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20 30 78  ine WO_MATCH  0x
4b00: 30 34 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49  040.#define WO_I
4b10: 53 4e 55 4c 4c 20 30 78 30 38 30 0a 23 64 65 66  SNULL 0x080.#def
4b20: 69 6e 65 20 57 4f 5f 4f 52 20 20 20 20 20 30 78  ine WO_OR     0x
4b30: 31 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  100       /* Two
4b40: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
4b50: 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23  ected terms */.#
4b60: 64 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20  define WO_AND   
4b70: 20 30 78 32 30 30 20 20 20 20 20 20 20 2f 2a 20   0x200       /* 
4b80: 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d  Two or more AND-
4b90: 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
4ba0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51  */.#define WO_EQ
4bb0: 55 49 56 20 20 30 78 34 30 30 20 20 20 20 20 20  UIV  0x400      
4bc0: 20 2f 2a 20 4f 66 20 74 68 65 20 66 6f 72 6d 20   /* Of the form 
4bd0: 41 3d 3d 42 2c 20 62 6f 74 68 20 63 6f 6c 75 6d  A==B, both colum
4be0: 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  ns */.#define WO
4bf0: 5f 4e 4f 4f 50 20 20 20 30 78 38 30 30 20 20 20  _NOOP   0x800   
4c00: 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d      /* This term
4c10: 20 64 6f 65 73 20 6e 6f 74 20 72 65 73 74 72 69   does not restri
4c20: 63 74 20 73 65 61 72 63 68 20 73 70 61 63 65 20  ct search space 
4c30: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41  */..#define WO_A
4c40: 4c 4c 20 20 20 20 30 78 66 66 66 20 20 20 20 20  LL    0xfff     
4c50: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
4c60: 20 70 6f 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76   possible WO_* v
4c70: 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65  alues */.#define
4c80: 20 57 4f 5f 53 49 4e 47 4c 45 20 30 78 30 66 66   WO_SINGLE 0x0ff
4c90: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
4ca0: 66 20 61 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75  f all non-compou
4cb0: 6e 64 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a  nd WO_* values *
4cc0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  /../*.** These a
4cd0: 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  re definitions o
4ce0: 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 57 68  f bits in the Wh
4cf0: 65 72 65 4c 6f 6f 70 2e 77 73 46 6c 61 67 73 20  ereLoop.wsFlags 
4d00: 66 69 65 6c 64 2e 0a 2a 2a 20 54 68 65 20 70 61  field..** The pa
4d10: 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61  rticular combina
4d20: 74 69 6f 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tion of bits in 
4d30: 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 20 68  each WhereLoop h
4d40: 65 6c 70 20 74 6f 0a 2a 2a 20 64 65 74 65 72 6d  elp to.** determ
4d50: 69 6e 65 20 74 68 65 20 61 6c 67 6f 72 69 74 68  ine the algorith
4d60: 6d 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70  m that WhereLoop
4d70: 20 72 65 70 72 65 73 65 6e 74 73 2e 0a 2a 2f 0a   represents..*/.
4d80: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
4d90: 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78 30 30 30  LUMN_EQ    0x000
4da0: 30 30 30 30 31 20 20 2f 2a 20 78 3d 45 58 50 52  00001  /* x=EXPR
4db0: 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 6f   or x IN (...) o
4dc0: 72 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23  r x IS NULL */.#
4dd0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c  define WHERE_COL
4de0: 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30 30 30  UMN_RANGE 0x0000
4df0: 30 30 30 32 20 20 2f 2a 20 78 3c 45 58 50 52 20  0002  /* x<EXPR 
4e00: 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f  and/or x>EXPR */
4e10: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
4e20: 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30  OLUMN_IN    0x00
4e30: 30 30 30 30 30 34 20 20 2f 2a 20 78 20 49 4e 20  000004  /* x IN 
4e40: 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65  (...) */.#define
4e50: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
4e60: 4c 4c 20 20 30 78 30 30 30 30 30 30 30 38 20 20  LL  0x00000008  
4e70: 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a  /* x IS NULL */.
4e80: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
4e90: 4e 53 54 52 41 49 4e 54 20 20 20 30 78 30 30 30  NSTRAINT   0x000
4ea0: 30 30 30 30 66 20 20 2f 2a 20 41 6e 79 20 6f 66  0000f  /* Any of
4eb0: 20 74 68 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d   the WHERE_COLUM
4ec0: 4e 5f 78 78 78 20 76 61 6c 75 65 73 20 2a 2f 0a  N_xxx values */.
4ed0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 4f  #define WHERE_TO
4ee0: 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30 30  P_LIMIT    0x000
4ef0: 30 30 30 31 30 20 20 2f 2a 20 78 3c 45 58 50 52  00010  /* x<EXPR
4f00: 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73   or x<=EXPR cons
4f10: 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e  traint */.#defin
4f20: 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  e WHERE_BTM_LIMI
4f30: 54 20 20 20 20 30 78 30 30 30 30 30 30 32 30 20  T    0x00000020 
4f40: 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78 3e   /* x>EXPR or x>
4f50: 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74  =EXPR constraint
4f60: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
4f70: 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20 20 30  E_BOTH_LIMIT   0
4f80: 78 30 30 30 30 30 30 33 30 20 20 2f 2a 20 42 6f  x00000030  /* Bo
4f90: 74 68 20 78 3e 45 58 50 52 20 61 6e 64 20 78 3c  th x>EXPR and x<
4fa0: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
4fb0: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20  WHERE_IDX_ONLY  
4fc0: 20 20 20 30 78 30 30 30 30 30 30 34 30 20 20 2f     0x00000040  /
4fd0: 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79  * Use index only
4fe0: 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f   - omit table */
4ff0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49  .#define WHERE_I
5000: 50 4b 20 20 20 20 20 20 20 20 20 20 30 78 30 30  PK          0x00
5010: 30 30 30 31 30 30 20 20 2f 2a 20 78 20 69 73 20  000100  /* x is 
5020: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
5030: 41 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65 66 69  ARY KEY */.#defi
5040: 6e 65 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44  ne WHERE_INDEXED
5050: 20 20 20 20 20 20 30 78 30 30 30 30 30 32 30 30        0x00000200
5060: 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75    /* WhereLoop.u
5070: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 69 73  .btree.pIndex is
5080: 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66 69 6e   valid */.#defin
5090: 65 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  e WHERE_VIRTUALT
50a0: 41 42 4c 45 20 30 78 30 30 30 30 30 34 30 30 20  ABLE 0x00000400 
50b0: 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75 2e   /* WhereLoop.u.
50c0: 76 74 61 62 20 69 73 20 76 61 6c 69 64 20 2a 2f  vtab is valid */
50d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49  .#define WHERE_I
50e0: 4e 5f 41 42 4c 45 20 20 20 20 20 20 30 78 30 30  N_ABLE      0x00
50f0: 30 30 30 38 30 30 20 20 2f 2a 20 41 62 6c 65 20  000800  /* Able 
5100: 74 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 49 4e  to support an IN
5110: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64 65   operator */.#de
5120: 66 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f  fine WHERE_ONERO
5130: 57 20 20 20 20 20 20 20 30 78 30 30 30 30 31 30  W       0x000010
5140: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
5150: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
5160: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
5170: 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20 20  HERE_MULTI_OR   
5180: 20 20 30 78 30 30 30 30 32 30 30 30 20 20 2f 2a    0x00002000  /*
5190: 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69 70   OR using multip
51a0: 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23 64  le indices */.#d
51b0: 65 66 69 6e 65 20 57 48 45 52 45 5f 54 45 4d 50  efine WHERE_TEMP
51c0: 5f 49 4e 44 45 58 20 20 20 30 78 30 30 30 30 34  _INDEX   0x00004
51d0: 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e 20  000  /* Uses an 
51e0: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
51f0: 2a 2f 0a 0a 0a 2f 2a 20 43 6f 6e 76 65 72 74 20  */.../* Convert 
5200: 61 20 57 68 65 72 65 43 6f 73 74 20 76 61 6c 75  a WhereCost valu
5210: 65 20 28 31 30 20 74 69 6d 65 73 20 6c 6f 67 32  e (10 times log2
5220: 28 58 29 29 20 69 6e 74 6f 20 69 74 73 20 69 6e  (X)) into its in
5230: 74 65 67 65 72 20 76 61 6c 75 65 20 58 2e 0a 2a  teger value X..*
5240: 2a 20 41 20 72 6f 75 67 68 20 61 70 70 72 6f 78  * A rough approx
5250: 69 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e  imation is used.
5260: 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75    The value retu
5270: 72 6e 65 64 20 69 73 20 6e 6f 74 20 65 78 61 63  rned is not exac
5280: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34  t..*/.static u64
5290: 20 77 68 65 72 65 43 6f 73 74 54 6f 49 6e 74 28   whereCostToInt(
52a0: 57 68 65 72 65 43 6f 73 74 20 78 29 7b 0a 20 20  WhereCost x){.  
52b0: 75 36 34 20 6e 3b 0a 20 20 69 66 28 20 78 3c 31  u64 n;.  if( x<1
52c0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
52d0: 6e 20 3d 20 78 25 31 30 3b 0a 20 20 78 20 2f 3d  n = x%10;.  x /=
52e0: 20 31 30 3b 0a 20 20 69 66 28 20 6e 3e 3d 35 20   10;.  if( n>=5 
52f0: 29 20 6e 20 2d 3d 20 32 3b 0a 20 20 65 6c 73 65  ) n -= 2;.  else
5300: 20 69 66 28 20 6e 3e 3d 31 20 29 20 6e 20 2d 3d   if( n>=1 ) n -=
5310: 20 31 3b 0a 20 20 69 66 28 20 78 3e 3d 33 20 29   1;.  if( x>=3 )
5320: 20 72 65 74 75 72 6e 20 28 6e 2b 38 29 3c 3c 28   return (n+8)<<(
5330: 78 2d 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  x-3);.  return (
5340: 6e 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a 7d 0a 0a  n+8)>>(3-x);.}..
5350: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5360: 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
5370: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
5380: 20 66 72 6f 6d 20 61 20 57 48 45 52 45 20 63 6c   from a WHERE cl
5390: 61 75 73 65 0a 2a 2f 0a 75 36 34 20 73 71 6c 69  ause.*/.u64 sqli
53a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
53b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
53c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
53d0: 75 72 6e 20 77 68 65 72 65 43 6f 73 74 54 6f 49  urn whereCostToI
53e0: 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  nt(pWInfo->nRowO
53f0: 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ut);.}../*.** Re
5400: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
5410: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
5420: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
5430: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
5440: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
5450: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
5460: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
5470: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
5480: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
5490: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
54a0: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
54b0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
54c0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
54d0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
54e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
54f0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
5500: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
5510: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
5520: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
5530: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
5540: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5550: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
5560: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
5570: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
5580: 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 3b 0a  nfo->bOBSat!=0;.
5590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
55a0: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
55b0: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
55c0: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
55d0: 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d   continue.** imm
55e0: 65 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68  ediately with th
55f0: 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20  e next row of a 
5600: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f  WHERE clause..*/
5610: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
5620: 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57  eContinueLabel(W
5630: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
5640: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  ){.  return pWIn
5650: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d  fo->iContinue;.}
5660: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5670: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
5680: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
5690: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
56a0: 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20  break.** out of 
56b0: 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f  a WHERE loop..*/
56c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
56d0: 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65 72  eBreakLabel(Wher
56e0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
56f0: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
5700: 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iBreak;.}../*.*
5710: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
5720: 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
5730: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 63  LETE statement c
5740: 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65 63  an operate direc
5750: 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f  tly on.** the ro
5760: 77 69 64 73 20 72 65 74 75 72 6e 65 64 20 62 79  wids returned by
5770: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
5780: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
5790: 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50  f doing an.** UP
57a0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6d  DATE or DELETE m
57b0: 69 67 68 74 20 63 68 61 6e 67 65 20 73 75 62 73  ight change subs
57c0: 65 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c 61  equent WHERE cla
57d0: 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a  use results..*/.
57e0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
57f0: 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72 65 49  OkOnePass(WhereI
5800: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
5810: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6f  return pWInfo->o
5820: 6b 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a 0a  kOnePass;.}../*.
5830: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
5840: 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  preallocated Whe
5850: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
5860: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
5870: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  id whereClauseIn
5880: 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  it(.  WhereClaus
5890: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f  e *pWC,        /
58a0: 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73  * The WhereClaus
58b0: 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69  e to be initiali
58c0: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  zed */.  WhereIn
58d0: 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20 20 20  fo *pWInfo      
58e0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 70    /* The WHERE p
58f0: 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78  rocessing contex
5900: 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70  t */.){.  pWC->p
5910: 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a  WInfo = pWInfo;.
5920: 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20    pWC->pOuter = 
5930: 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20  0;.  pWC->nTerm 
5940: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f  = 0;.  pWC->nSlo
5950: 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57  t = ArraySize(pW
5960: 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70  C->aStatic);.  p
5970: 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74  WC->a = pWC->aSt
5980: 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  atic;.}../* Forw
5990: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
59a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
59b0: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68  reClauseClear(Wh
59c0: 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a  ereClause*);../*
59d0: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
59e0: 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
59f0: 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72  ated with a Wher
5a00: 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  eOrInfo object..
5a10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
5a20: 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65  hereOrInfoDelete
5a30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
5a40: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20  ereOrInfo *p){. 
5a50: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
5a60: 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c  r(&p->wc);.  sql
5a70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5a80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  );.}../*.** Deal
5a90: 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72  locate all memor
5aa0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
5ab0: 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e 66 6f  h a WhereAndInfo
5ac0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
5ad0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 41 6e 64  ic void whereAnd
5ae0: 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74  InfoDelete(sqlit
5af0: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41 6e 64  e3 *db, WhereAnd
5b00: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72  Info *p){.  wher
5b10: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d  eClauseClear(&p-
5b20: 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  >wc);.  sqlite3D
5b30: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
5b40: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
5b50: 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  e a WhereClause 
5b60: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
5b70: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
5b80: 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20  cture.** itself 
5b90: 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54  is not freed.  T
5ba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
5bb0: 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68  he inverse of wh
5bc0: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e  ereClauseInit().
5bd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5be0: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
5bf0: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
5c00: 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  C){.  int i;.  W
5c10: 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73  hereTerm *a;.  s
5c20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43  qlite3 *db = pWC
5c30: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
5c40: 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57  ->db;.  for(i=pW
5c50: 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57  C->nTerm-1, a=pW
5c60: 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  C->a; i>=0; i--,
5c70: 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   a++){.    if( a
5c80: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
5c90: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
5ca0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
5cb0: 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72  ete(db, a->pExpr
5cc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5cd0: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
5ce0: 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20  RM_ORINFO ){.   
5cf0: 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65     whereOrInfoDe
5d00: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f  lete(db, a->u.pO
5d10: 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  rInfo);.    }els
5d20: 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73  e if( a->wtFlags
5d30: 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20   & TERM_ANDINFO 
5d40: 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e  ){.      whereAn
5d50: 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20  dInfoDelete(db, 
5d60: 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a  a->u.pAndInfo);.
5d70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
5d80: 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74  pWC->a!=pWC->aSt
5d90: 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  atic ){.    sqli
5da0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
5db0: 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  C->a);.  }.}../*
5dc0: 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
5dd0: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 65   new WhereTerm e
5de0: 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68 65 72  ntry to the Wher
5df0: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70  eClause object p
5e00: 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57  WC..** The new W
5e10: 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20  hereTerm object 
5e20: 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66  is constructed f
5e30: 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77  rom Expr p and w
5e40: 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20  ith wtFlags..** 
5e50: 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43  The index in pWC
5e60: 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77  ->a[] of the new
5e70: 20 57 68 65 72 65 54 65 72 6d 20 69 73 20 72 65   WhereTerm is re
5e80: 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
5e90: 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72  s..** 0 is retur
5ea0: 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 57  ned if the new W
5eb0: 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e  hereTerm could n
5ec0: 6f 74 20 62 65 20 61 64 64 65 64 20 64 75 65 20  ot be added due 
5ed0: 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61  to a memory.** a
5ee0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e  llocation error.
5ef0: 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c    The memory all
5f00: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20  ocation failure 
5f10: 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64  will be recorded
5f20: 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d   in.** the db->m
5f30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
5f40: 20 73 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d   so that higher-
5f50: 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20  level functions 
5f60: 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a  can detect it..*
5f70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5f80: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
5f90: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
5fa0: 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61  pWC->a[] array a
5fb0: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  s necessary..**.
5fc0: 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61 67  ** If the wtFlag
5fd0: 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75  s argument inclu
5fe0: 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  des TERM_DYNAMIC
5ff0: 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62  , then responsib
6000: 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65  ility.** for fre
6010: 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73 73  eing the express
6020: 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64  ion p is assumed
6030: 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c 61   by the WhereCla
6040: 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a  use object pWC..
6050: 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75 65 20  ** This is true 
6060: 65 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75  even if this rou
6070: 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c  tine fails to al
6080: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65  locate a new Whe
6090: 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41  reTerm..**.** WA
60a0: 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75  RNING:  This rou
60b0: 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c  tine might reall
60c0: 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20  ocate the space 
60d0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
60e0: 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c   WhereTerms.  Al
60f0: 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68  l pointers to Wh
6100: 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20  ereTerms should 
6110: 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  be invalidated a
6120: 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20  fter.** calling 
6130: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53  this routine.  S
6140: 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79  uch pointers may
6150: 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   be reinitialize
6160: 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67  d by referencing
6170: 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d  .** the pWC->a[]
6180: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
6190: 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73  c int whereClaus
61a0: 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61  eInsert(WhereCla
61b0: 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
61c0: 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a  p, u8 wtFlags){.
61d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
61e0: 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rm;.  int idx;. 
61f0: 20 74 65 73 74 63 61 73 65 28 20 77 74 46 6c 61   testcase( wtFla
6200: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
6210: 4c 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 30  L );  /* EV: R-0
6220: 30 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20 20  0211-15100 */.  
6230: 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d  if( pWC->nTerm>=
6240: 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20  pWC->nSlot ){.  
6250: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c    WhereTerm *pOl
6260: 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20  d = pWC->a;.    
6270: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
6280: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
6290: 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d 3e  e->db;.    pWC->
62a0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
62b0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
62c0: 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43  f(pWC->a[0])*pWC
62d0: 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20  ->nSlot*2 );.   
62e0: 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29   if( pWC->a==0 )
62f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74 46 6c  {.      if( wtFl
6300: 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d  ags & TERM_DYNAM
6310: 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  IC ){.        sq
6320: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6330: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a  db, p);.      }.
6340: 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 70        pWC->a = p
6350: 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Old;.      retur
6360: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  n 0;.    }.    m
6370: 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f  emcpy(pWC->a, pO
6380: 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  ld, sizeof(pWC->
6390: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d  a[0])*pWC->nTerm
63a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21  );.    if( pOld!
63b0: 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b  =pWC->aStatic ){
63c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
63d0: 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a  Free(db, pOld);.
63e0: 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e      }.    pWC->n
63f0: 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62  Slot = sqlite3Db
6400: 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70  MallocSize(db, p
6410: 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57  WC->a)/sizeof(pW
6420: 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  C->a[0]);.  }.  
6430: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
6440: 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d  idx = pWC->nTerm
6450: 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45  ++];.  pTerm->pE
6460: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
6470: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b  rSkipCollate(p);
6480: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
6490: 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20 70  s = wtFlags;.  p
64a0: 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Term->pWC = pWC;
64b0: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
64c0: 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  t = -1;.  return
64d0: 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   idx;.}../*.** T
64e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e  his routine iden
64f0: 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73  tifies subexpres
6500: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
6510: 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a  RE clause where.
6520: 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65  ** each subexpre
6530: 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
6540: 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70  ed by the AND op
6550: 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f  erator or some o
6560: 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  ther.** operator
6570: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
6580: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20  e op parameter. 
6590: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
65a0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73   structure.** is
65b0: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69   filled with poi
65c0: 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72  nters to subexpr
65d0: 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78  essions.  For ex
65e0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
65f0: 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f  WHERE  a=='hello
6600: 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62  ' AND coalesce(b
6610: 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31  ,11)<10 AND (c+1
6620: 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a  2!=d OR c==22).*
6630: 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f  *           \___
6640: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
6650: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
6660: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
6670: 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
6680: 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20    slot[0]       
6690: 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20       slot[1]    
66a0: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
66b0: 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  2].**.** The ori
66c0: 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ginal WHERE clau
66d0: 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75  se in pExpr is u
66e0: 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74  naltered.  All t
66f0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
6700: 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74  oes is make slot
6710: 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74  [] entries point
6720: 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65   to substructure
6730: 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a   within pExpr..*
6740: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76  *.** In the prev
6750: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e  ious sentence an
6760: 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  d in the diagram
6770: 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72  , "slot[]" refer
6780: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72  s to.** the Wher
6790: 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61  eClause.a[] arra
67a0: 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61  y.  The slot[] a
67b0: 72 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65  rray grows as ne
67c0: 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  eded to contain.
67d0: 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ** all terms of 
67e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
67f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6800: 20 77 68 65 72 65 53 70 6c 69 74 28 57 68 65 72   whereSplit(Wher
6810: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
6820: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f  pr *pExpr, int o
6830: 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20  p){.  pWC->op = 
6840: 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20 70 45  (u8)op;.  if( pE
6850: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
6860: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
6870: 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72  !=op ){.    wher
6880: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
6890: 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  C, pExpr, 0);.  
68a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65  }else{.    where
68b0: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
68c0: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20  ->pLeft, op);.  
68d0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
68e0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
68f0: 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   op);.  }.}../*.
6900: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
6910: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a  WhereMaskSet obj
6920: 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ect.*/.#define i
6930: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28  nitMaskSet(P)  (
6940: 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52  P)->n=0../*.** R
6950: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
6960: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
6970: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
6980: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
6990: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
69a0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
69b0: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
69c0: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
69d0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
69e0: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
69f0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
6a00: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
6a10: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
6a20: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
6a30: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
6a40: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
6a50: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
6a60: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
6a70: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
6a80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6a90: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6aa0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
6ab0: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
6ac0: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
6ad0: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
6ae0: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
6af0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
6b00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
6b10: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
6b20: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
6b30: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
6b40: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
6b50: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
6b60: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
6b70: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
6b80: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
6b90: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
6ba0: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
6bb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
6bc0: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
6bd0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
6be0: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
6bf0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
6c00: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
6c10: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
6c20: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
6c30: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
6c40: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
6c50: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
6c60: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
6c70: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
6c80: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
6c90: 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73  ates.** a bitmas
6ca0: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
6cb0: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
6cc0: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
6cd0: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
6ce0: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
6cf0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
6d00: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
6d10: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
6d20: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
6d30: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
6d40: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
6d50: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
6d60: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
6d70: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
6d80: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
6d90: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
6da0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
6db0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
6dc0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
6dd0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
6de0: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
6df0: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
6e00: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
6e10: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
6e20: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
6e30: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
6e40: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
6e50: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
6e60: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
6e70: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
6e80: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
6e90: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
6ea0: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
6eb0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
6ec0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
6ed0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
6ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
6ef0: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
6f00: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
6f10: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
6f20: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
6f30: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
6f40: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
6f50: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
6f60: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
6f70: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
6f80: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
6f90: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
6fa0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
6fb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
6fc0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6fd0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
6fe0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
6ff0: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
7000: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
7010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
7020: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
7030: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
7040: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
7050: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
7060: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
7070: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
7080: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
7090: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
70a0: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
70b0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
70c0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
70d0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
70e0: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
70f0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
7100: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
7110: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
7120: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
7130: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
7140: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
7150: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
7160: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
7170: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
7180: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
7190: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
71a0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
71b0: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
71c0: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
71d0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
71e0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
71f0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
7200: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
7210: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
7220: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
7230: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
7240: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
7250: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
7260: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7270: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
7280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7290: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
72a0: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
72b0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
72c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
72d0: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
72e0: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
72f0: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
7300: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
7310: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
7320: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
7330: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
7340: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
7350: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
7360: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c  <=", ">=", "IN",
7370: 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a   and "IS NULL".*
7380: 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  *.** IMPLEMENTAT
7390: 49 4f 4e 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d  ION-OF: R-59926-
73a0: 32 36 33 39 33 20 54 6f 20 62 65 20 75 73 61 62  26393 To be usab
73b0: 6c 65 20 62 79 20 61 6e 20 69 6e 64 65 78 20 61  le by an index a
73c0: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a   term must be.**
73d0: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
73e0: 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20  ollowing forms: 
73f0: 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 65 73 73  column = express
7400: 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70  ion column > exp
7410: 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d  ression.** colum
7420: 6e 20 3e 3d 20 65 78 70 72 65 73 73 69 6f 6e 20  n >= expression 
7430: 63 6f 6c 75 6d 6e 20 3c 20 65 78 70 72 65 73 73  column < express
7440: 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78  ion column <= ex
7450: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72  pression.** expr
7460: 65 73 73 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20  ession = column 
7470: 65 78 70 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c  expression > col
7480: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3e  umn expression >
7490: 3d 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72  = column.** expr
74a0: 65 73 73 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20  ession < column 
74b0: 65 78 70 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f  expression <= co
74c0: 6c 75 6d 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a  lumn column IN.*
74d0: 2a 20 28 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  * (expression-li
74e0: 73 74 29 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73  st) column IN (s
74f0: 75 62 71 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20  ubquery) column 
7500: 49 53 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69  IS NULL.*/.stati
7510: 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28  c int allowedOp(
7520: 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72  int op){.  asser
7530: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26  t( TK_GT>TK_EQ &
7540: 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b  & TK_GT<TK_GE );
7550: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54  .  assert( TK_LT
7560: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c  >TK_EQ && TK_LT<
7570: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
7580: 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26  t( TK_LE>TK_EQ &
7590: 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b  & TK_LE<TK_GE );
75a0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45  .  assert( TK_GE
75b0: 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72  ==TK_EQ+4 );.  r
75c0: 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20  eturn op==TK_IN 
75d0: 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26  || (op>=TK_EQ &&
75e0: 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f   op<=TK_GE) || o
75f0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a  p==TK_ISNULL;.}.
7600: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20  ./*.** Swap two 
7610: 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20  objects of type 
7620: 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  TYPE..*/.#define
7630: 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20   SWAP(TYPE,A,B) 
7640: 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20  {TYPE t=A; A=B; 
7650: 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  B=t;}../*.** Com
7660: 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f  mute a compariso
7670: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70  n operator.  Exp
7680: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
7690: 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a  form "X op Y".**
76a0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
76b0: 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a  nto "Y op X"..**
76c0: 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68  .** If left/righ
76d0: 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c  t precedence rul
76e0: 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61  es come into pla
76f0: 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69  y when determini
7700: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74  ng the.** collat
7710: 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 74 68  ing sequence, th
7720: 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  en COLLATE opera
7730: 74 6f 72 73 20 61 72 65 20 61 64 6a 75 73 74 65  tors are adjuste
7740: 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  d to ensure.** t
7750: 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  hat the collatin
7760: 67 20 73 65 71 75 65 6e 63 65 20 64 6f 65 73 20  g sequence does 
7770: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20 46 6f 72  not change.  For
7780: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20   example:.** "Y 
7790: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
77a0: 70 20 58 22 20 62 65 63 6f 6d 65 73 20 22 58 20  p X" becomes "X 
77b0: 6f 70 20 59 22 20 62 65 63 61 75 73 65 20 61 6e  op Y" because an
77c0: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
77d0: 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c  ence on.** the l
77e0: 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  eft hand side of
77f0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76   a comparison ov
7800: 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c  errides any coll
7810: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a  ation sequence .
7820: 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ** attached to t
7830: 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68  he right. For th
7840: 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68  e same reason th
7850: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
7860: 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d  g.** is not comm
7870: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
7880: 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65  void exprCommute
7890: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
78a0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
78b0: 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28  u16 expRight = (
78c0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
78d0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
78e0: 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66  e);.  u16 expLef
78f0: 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  t = (pExpr->pLef
7900: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
7910: 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  llate);.  assert
7920: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70  ( allowedOp(pExp
7930: 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d  r->op) && pExpr-
7940: 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op!=TK_IN );.  
7950: 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78  if( expRight==ex
7960: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20  pLeft ){.    /* 
7970: 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20 62  Either X and Y b
7980: 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  oth have COLLATE
7990: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69   operator or nei
79a0: 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69  ther do */.    i
79b0: 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20  f( expRight ){. 
79c0: 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61       /* Both X a
79d0: 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54  nd Y have COLLAT
79e0: 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61  E operators.  Ma
79f0: 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c 77  ke sure X is alw
7a00: 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  ays.      ** use
7a10: 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68  d by clearing th
7a20: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
7a30: 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20  g from Y. */.   
7a40: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
7a50: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43  ->flags &= ~EP_C
7a60: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73  ollate;.    }els
7a70: 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70  e if( sqlite3Exp
7a80: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
7a90: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
7aa0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65  0 ){.      /* Ne
7ab0: 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61  ither X nor Y ha
7ac0: 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  ve COLLATE opera
7ad0: 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73 20  tors, but X has 
7ae0: 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20  a non-default.  
7af0: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67      ** collating
7b00: 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61   sequence.  So a
7b10: 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74  dd the EP_Collat
7b20: 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f  e marker on X to
7b30: 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20   cause.      ** 
7b40: 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  it to be searche
7b50: 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20  d first. */.    
7b60: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
7b70: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c  flags |= EP_Coll
7b80: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ate;.    }.  }. 
7b90: 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70   SWAP(Expr*,pExp
7ba0: 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d  r->pRight,pExpr-
7bb0: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
7bc0: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
7bd0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ){.    assert( T
7be0: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
7bf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
7c00: 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20  GE==TK_LE+2 );. 
7c10: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
7c20: 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  >TK_EQ );.    as
7c30: 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c  sert( TK_GT<TK_L
7c40: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
7c50: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
7c60: 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d  T && pExpr->op<=
7c70: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78  TK_GE );.    pEx
7c80: 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72  pr->op = ((pExpr
7c90: 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54  ->op-TK_GT)^2)+T
7ca0: 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_GT;.  }.}../*.
7cb0: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  ** Translate fro
7cc0: 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72  m TK_xx operator
7cd0: 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73   to WO_xx bitmas
7ce0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  k..*/.static u16
7cf0: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e   operatorMask(in
7d00: 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a  t op){.  u16 c;.
7d10: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
7d20: 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28  dOp(op) );.  if(
7d30: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
7d40: 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d    c = WO_IN;.  }
7d50: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
7d60: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20  ISNULL ){.    c 
7d70: 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  = WO_ISNULL;.  }
7d80: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7d90: 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  ( (WO_EQ<<(op-TK
7da0: 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20 29  _EQ)) < 0x7fff )
7db0: 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29 28  ;.    c = (u16)(
7dc0: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
7dd0: 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
7de0: 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op!=TK_ISNULL 
7df0: 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  || c==WO_ISNULL 
7e00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
7e10: 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_IN || c==WO_
7e20: 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IN );.  assert( 
7e30: 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d  op!=TK_EQ || c==
7e40: 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72  WO_EQ );.  asser
7e50: 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op!=TK_LT || 
7e60: 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73  c==WO_LT );.  as
7e70: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20  sert( op!=TK_LE 
7e80: 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20  || c==WO_LE );. 
7e90: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
7ea0: 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29  GT || c==WO_GT )
7eb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
7ec0: 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GE || c==WO_G
7ed0: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  E );.  return c;
7ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
7ef0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68  e to the next Wh
7f00: 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74  ereTerm that mat
7f10: 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  ches according t
7f20: 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  o the criteria.*
7f30: 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77 68  * established wh
7f40: 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a  en the pScan obj
7f50: 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69  ect was initiali
7f60: 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61 6e  zed by whereScan
7f70: 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72  Init()..** Retur
7f80: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
7f90: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63  are no more matc
7fa0: 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e  hing WhereTerms.
7fb0: 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d 20 2a 77  .*/.WhereTerm *w
7fc0: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65  hereScanNext(Whe
7fd0: 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a  reScan *pScan){.
7fe0: 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
7ff0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
8000: 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20  rsor on the LHS 
8010: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
8020: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20   int iColumn;   
8030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
8040: 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  umn on the LHS o
8050: 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20  f the term.  -1 
8060: 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70  for IPK */.  Exp
8070: 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
8080: 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69    /* An expressi
8090: 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  on being tested 
80a0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
80b0: 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f   *pWC;    /* Sho
80c0: 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e  rthand for pScan
80d0: 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65  ->pWC */.  Where
80e0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
80f0: 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  /* The term bein
8100: 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  g tested */.  in
8110: 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20  t k = pScan->k; 
8120: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
8130: 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f  tart scanning */
8140: 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e  ..  while( pScan
8150: 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d  ->iEquiv<=pScan-
8160: 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69  >nEquiv ){.    i
8170: 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71  Cur = pScan->aEq
8180: 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69  uiv[pScan->iEqui
8190: 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d  v-2];.    iColum
81a0: 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  n = pScan->aEqui
81b0: 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d  v[pScan->iEquiv-
81c0: 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  1];.    while( (
81d0: 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43  pWC = pScan->pWC
81e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
81f0: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b  r(pTerm=pWC->a+k
8200: 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; k<pWC->nTerm; 
8210: 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  k++, pTerm++){. 
8220: 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
8230: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
8240: 75 72 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c  ur && pTerm->u.l
8250: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
8260: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
8270: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
8280: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
8290: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
82a0: 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  && pScan->nEquiv
82b0: 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e  <ArraySize(pScan
82c0: 2d 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20 20  ->aEquiv).      
82d0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
82e0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
82f0: 20 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74        pX = sqlit
8300: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
8310: 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  e(pTerm->pExpr->
8320: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
8330: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d       assert( pX-
8340: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
8350: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
8360: 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e  r(j=0; j<pScan->
8370: 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20  nEquiv; j+=2){. 
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
8390: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
83a0: 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20  ]==pX->iTable.  
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
83c0: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b  pScan->aEquiv[j+
83d0: 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20  1]==pX->iColumn 
83e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
83f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8400: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8420: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63        if( j==pSc
8430: 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20  an->nEquiv ){.  
8440: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
8450: 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70  n->aEquiv[j] = p
8460: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  X->iTable;.     
8470: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
8480: 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58  aEquiv[j+1] = pX
8490: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
84a0: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
84b0: 6e 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20  nEquiv += 2;.   
84c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
84d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
84e0: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
84f0: 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e  erator & pScan->
8500: 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  opMask)!=0 ){.  
8510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72            /* Ver
8520: 69 66 79 20 74 68 65 20 61 66 66 69 6e 69 74 79  ify the affinity
8530: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
8540: 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f  equence match */
8550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8560: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
8570: 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70  e && (pTerm->eOp
8580: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
8590: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
85a0: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
85b0: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
85c0: 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61        Parse *pPa
85d0: 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  rse = pWC->pWInf
85e0: 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  o->pParse;.     
85f0: 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54           pX = pT
8600: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
8610: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
8620: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
8630: 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d  ityOk(pX, pScan-
8640: 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20  >idxaff) ){.    
8650: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
8660: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
8670: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8680: 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70      assert(pX->p
8690: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
86a0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
86b0: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
86c0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
86d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8700: 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58     pX->pLeft, pX
8710: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
8720: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
8730: 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
8740: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
8750: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
8760: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8770: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
8780: 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f  Name, pScan->zCo
8790: 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  llName) ){.     
87a0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
87b0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
87c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
87d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
87e0: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
87f0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30  ator & WO_EQ)!=0
8800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
8810: 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   (pX = pTerm->pE
8820: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
8830: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
8840: 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e           && pX->
8850: 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61  iTable==pScan->a
8860: 45 71 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20  Equiv[0].       
8870: 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f        && pX->iCo
8880: 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71  lumn==pScan->aEq
8890: 75 69 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20  uiv[1].         
88a0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
88b0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
88c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
88d0: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b          pScan->k
88e0: 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20   = k+1;.        
88f0: 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d      return pTerm
8900: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8920: 20 20 20 20 20 20 70 57 43 20 3d 20 70 53 63 61        pWC = pSca
8930: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
8940: 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20  pWC->pOuter;.   
8950: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     k = 0;.    }.
8960: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
8970: 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b   pScan->pOrigWC;
8980: 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20  .    k = 0;.    
8990: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b 3d  pScan->iEquiv +=
89a0: 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   2;.  }.  return
89b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
89c0: 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20  tialize a WHERE 
89d0: 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f  clause scanner o
89e0: 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61  bject.  Return a
89f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
8a00: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20  ** first match. 
8a10: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
8a20: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74  there are no mat
8a30: 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ches..**.** The 
8a40: 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20  scanner will be 
8a50: 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48  searching the WH
8a60: 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20  ERE clause pWC. 
8a70: 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a   It will look.**
8a80: 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68   for terms of th
8a90: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
8aa0: 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69  expr>" where X i
8ab0: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e  s column iColumn
8ac0: 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75   of table.** iCu
8ad0: 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73  r.  The <op> mus
8ae0: 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  t be one of the 
8af0: 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69  operators descri
8b00: 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a  bed by opMask..*
8b10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72  *.** If the sear
8b20: 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20  ch is for X and 
8b30: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
8b40: 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20   contains terms 
8b50: 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58  of the.** form X
8b60: 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  =Y then this rou
8b70: 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20  tine might also 
8b80: 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20  return terms of 
8b90: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c  the form.** "Y <
8ba0: 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68  op> <expr>".  Th
8bb0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  e number of leve
8bc0: 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69  ls of transitivi
8bd0: 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a  ty is limited,.*
8be0: 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20  * but is enough 
8bf0: 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63  to handle most c
8c00: 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e  ommonly occurrin
8c10: 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  g SQL statements
8c20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
8c30: 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20  not the INTEGER 
8c40: 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e  PRIMARY KEY then
8c50: 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61   X must be compa
8c60: 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e  tible with.** in
8c70: 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 57 68 65  dex pIdx..*/.Whe
8c80: 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61  reTerm *whereSca
8c90: 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63  nInit(.  WhereSc
8ca0: 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20  an *pScan,      
8cb0: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61   /* The WhereSca
8cc0: 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69  n object being i
8cd0: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
8ce0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
8cf0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  ,       /* The W
8d00: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
8d10: 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69  e scanned */.  i
8d20: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
8d30: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
8d40: 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a   to scan for */.
8d50: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
8d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
8d70: 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  umn to scan for 
8d80: 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c  */.  u32 opMask,
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8da0: 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73  Operator(s) to s
8db0: 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64  can for */.  Ind
8dc0: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
8dd0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
8de0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
8df0: 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  this index */.){
8e00: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20  .  int j;..  /* 
8e10: 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30 2c  memset(pScan, 0,
8e20: 20 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29   sizeof(*pScan))
8e30: 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f  ; */.  pScan->pO
8e40: 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70  rigWC = pWC;.  p
8e50: 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Scan->pWC = pWC;
8e60: 0a 20 20 69 66 28 20 70 49 64 78 20 26 26 20 69  .  if( pIdx && i
8e70: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
8e80: 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d   pScan->idxaff =
8e90: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
8ea0: 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  Col[iColumn].aff
8eb0: 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a  inity;.    for(j
8ec0: 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  =0; pIdx->aiColu
8ed0: 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20  mn[j]!=iColumn; 
8ee0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
8ef0: 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e  NEVER(j>=pIdx->n
8f00: 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e  Column) ) return
8f10: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   0;.    }.    pS
8f20: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d  can->zCollName =
8f30: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
8f40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8f50: 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30  Scan->idxaff = 0
8f60: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f  ;.    pScan->zCo
8f70: 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  llName = 0;.  }.
8f80: 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20    pScan->opMask 
8f90: 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61  = opMask;.  pSca
8fa0: 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61  n->k = 0;.  pSca
8fb0: 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69  n->aEquiv[0] = i
8fc0: 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45  Cur;.  pScan->aE
8fd0: 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d  quiv[1] = iColum
8fe0: 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75  n;.  pScan->nEqu
8ff0: 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d  iv = 2;.  pScan-
9000: 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72  >iEquiv = 2;.  r
9010: 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e  eturn whereScanN
9020: 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f  ext(pScan);.}../
9030: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
9040: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
9050: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
9060: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
9070: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
9080: 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72  * where X is a r
9090: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
90a0: 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65  iColumn of table
90b0: 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69   iCur and <op> i
90c0: 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20  s one of.** the 
90d0: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
90e0: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
90f0: 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  y the op paramet
9100: 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  er..** Return a 
9110: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
9120: 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69  erm.  Return 0 i
9130: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
9140: 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75  ** The term retu
9150: 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d  rned might by Y=
9160: 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20  <expr> if there 
9170: 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74  is another const
9180: 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  raint in.** the 
9190: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
91a0: 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  t specifies that
91b0: 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20   X=Y.  Any such 
91c0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c  constraints will
91d0: 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65   be.** identifie
91e0: 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49  d by the WO_EQUI
91f0: 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65  V bit in the pTe
9200: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69  rm->eOperator fi
9210: 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71  eld.  The.** aEq
9220: 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64  uiv[] array hold
9230: 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  s X and all its 
9240: 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74  equivalents, wit
9250: 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61  h each SQL varia
9260: 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70  ble.** taking up
9270: 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45   two slots in aE
9280: 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72  quiv[].  The fir
9290: 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74  st slot is for t
92a0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
92b0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f  .** and the seco
92c0: 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f  nd is for the co
92d0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68  lumn number.  Th
92e0: 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73  ere are 22 slots
92f0: 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20   in aEquiv[].** 
9300: 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  so that means we
9310: 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20   can look for X 
9320: 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74  plus up to 10 ot
9330: 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76  her equivalent v
9340: 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20  alues..** Hence 
9350: 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77  a search for X w
9360: 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72  ill return <expr
9370: 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31  > if X=A1 and A1
9380: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a  =A2 and A2=A3.**
9390: 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d   and ... and A9=
93a0: 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70  A10 and A10=<exp
93b0: 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r>..**.** If the
93c0: 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20  re are multiple 
93d0: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
93e0: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
93f0: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
9400: 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72  xpr>".** then tr
9410: 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69  y for the one wi
9420: 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69  th no dependenci
9430: 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69  es on <expr> - i
9440: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68  n other words wh
9450: 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73  ere.** <expr> is
9460: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
9470: 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b  ession of some k
9480: 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72  ind.  Only retur
9490: 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20  n entries of.** 
94a0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
94b0: 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61   Y" where Y is a
94c0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68   column in anoth
94d0: 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74  er table if no t
94e0: 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66  erms of.** the f
94f0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e  orm "X <op> <con
9500: 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e  st-expr>" exist.
9510: 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77     If no terms w
9520: 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52  ith a constant R
9530: 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79  HS.** exist, try
9540: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72   to return a ter
9550: 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  m that does not 
9560: 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f  use WO_EQUIV..*/
9570: 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72  .static WhereTer
9580: 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57  m *findTerm(.  W
9590: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
95a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
95b0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
95c0: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74  earched */.  int
95d0: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
95e0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
95f0: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
9600: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
9610: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
9620: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
9630: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
9640: 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20  ady,     /* RHS 
9650: 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70  must not overlap
9660: 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20   with this mask 
9670: 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20  */.  u32 op,    
9680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
9690: 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75  sk of WO_xx valu
96a0: 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70  es describing op
96b0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  erator */.  Inde
96c0: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
96d0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
96e0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
96f0: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
9700: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  NULL */.){.  Whe
9710: 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20  reTerm *pResult 
9720: 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  = 0;.  WhereTerm
9730: 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e   *p;.  WhereScan
9740: 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68   scan;..  p = wh
9750: 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
9760: 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43  n, pWC, iCur, iC
9770: 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29  olumn, op, pIdx)
9780: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
9790: 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
97a0: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
97b0: 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)==0 ){.      
97c0: 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67  if( p->prereqRig
97d0: 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70  ht==0 && (p->eOp
97e0: 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30  erator&WO_EQ)!=0
97f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
9800: 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn p;.      }.  
9810: 20 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d      if( pResult=
9820: 3d 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70  =0 ) pResult = p
9830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
9840: 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73  whereScanNext(&s
9850: 63 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  can);.  }.  retu
9860: 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f  rn pResult;.}../
9870: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
9880: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce */.static vo
9890: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53  id exprAnalyze(S
98a0: 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c  rcList*, WhereCl
98b0: 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  ause*, int);../*
98c0: 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61  .** Call exprAna
98d0: 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  lyze on all term
98e0: 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61  s in a WHERE cla
98f0: 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  use.  .*/.static
9900: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
9910: 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20  eAll(.  SrcList 
9920: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
9930: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
9940: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
9950: 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20  ause *pWC       
9960: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
9970: 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c  lause to be anal
9980: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  yzed */.){.  int
9990: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   i;.  for(i=pWC-
99a0: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
99b0: 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e  i--){.    exprAn
99c0: 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20  alyze(pTabList, 
99d0: 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC, i);.  }.}..
99e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
99f0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
9a00: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ATION./*.** Chec
9a10: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
9a20: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
9a30: 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   is a LIKE or GL
9a40: 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74  OB operator that
9a50: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d  .** can be optim
9a60: 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75  ized using inequ
9a70: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
9a80: 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
9a90: 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61  if it is.** so a
9aa0: 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
9ab0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
9ac0: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
9ad0: 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62   to be optimizib
9ae0: 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74  le, the RHS must
9af0: 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20   be a string.** 
9b00: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65  literal that doe
9b10: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
9b20: 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a   a wildcard.  .*
9b30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c  /.static int isL
9b40: 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72  ikeOrGlob(.  Par
9b50: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
9b60: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
9b70: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
9b80: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
9b90: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
9ba0: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
9bb0: 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  sion */.  Expr *
9bc0: 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50  *ppPrefix,  /* P
9bd0: 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52  ointer to TK_STR
9be0: 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ING expression w
9bf0: 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66  ith pattern pref
9c00: 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73  ix */.  int *pis
9c10: 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75  Complete, /* Tru
9c20: 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69  e if the only wi
9c30: 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74  ldcard is % in t
9c40: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
9c50: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43  r */.  int *pnoC
9c60: 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ase      /* True
9c70: 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73   if uppercase is
9c80: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c   equivalent to l
9c90: 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20  owercase */.){. 
9ca0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
9cb0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53   0;         /* S
9cc0: 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20  tring on RHS of 
9cd0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
9ce0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
9cf0: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a   *pLeft;      /*
9d00: 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   Right and left 
9d10: 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65  size of LIKE ope
9d20: 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c  rator */.  ExprL
9d30: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  ist *pList;     
9d40: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
9d50: 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65   operands to the
9d60: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
9d70: 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20  /.  int c;      
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9d90: 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20  * One character 
9da0: 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  in z[] */.  int 
9db0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
9dc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9dd0: 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64   of non-wildcard
9de0: 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65   prefix characte
9df0: 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b  rs */.  char wc[
9e00: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
9e10: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63     /* Wildcard c
9e20: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73  haracters */.  s
9e30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9e40: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
9e50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9e60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
9e70: 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20  lue *pVal = 0;. 
9e80: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9ea0: 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20  pcode of pRight 
9eb0: 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74  */..  if( !sqlit
9ec0: 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  e3IsLikeFunction
9ed0: 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43  (db, pExpr, pnoC
9ee0: 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20  ase, wc) ){.    
9ef0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69  return 0;.  }.#i
9f00: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44  fdef SQLITE_EBCD
9f10: 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73  IC.  if( *pnoCas
9f20: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e ) return 0;.#e
9f30: 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70  ndif.  pList = p
9f40: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
9f50: 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e   pLeft = pList->
9f60: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[1].pExpr;.  if
9f70: 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f  ( pLeft->op!=TK_
9f80: 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71  COLUMN .   || sq
9f90: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
9fa0: 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45  y(pLeft)!=SQLITE
9fb0: 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c  _AFF_TEXT .   ||
9fc0: 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74   IsVirtual(pLeft
9fd0: 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20  ->pTab).  ){.   
9fe0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35   /* IMP: R-02065
9ff0: 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d  -49465 The left-
a000: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
a010: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70   LIKE or GLOB op
a020: 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20  erator must.    
a030: 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ** be the name o
a040: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
a050: 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66  umn with TEXT af
a060: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72  finity. */.    r
a070: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
a080: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43  ssert( pLeft->iC
a090: 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f  olumn!=(-1) ); /
a0a0: 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65  * Because IPK ne
a0b0: 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54  ver has AFF_TEXT
a0c0: 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20   */..  pRight = 
a0d0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
a0e0: 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74  r;.  op = pRight
a0f0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
a100: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
a110: 20 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e     op = pRight->
a120: 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  op2;.  }.  if( o
a130: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
a140: 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65 70  {.    Vdbe *pRep
a150: 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d  repare = pParse-
a160: 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20  >pReprepare;.   
a170: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67   int iCol = pRig
a180: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ht->iColumn;.   
a190: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
a1a0: 64 62 65 47 65 74 56 61 6c 75 65 28 70 52 65 70  dbeGetValue(pRep
a1b0: 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51  repare, iCol, SQ
a1c0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a  LITE_AFF_NONE);.
a1d0: 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26 20      if( pVal && 
a1e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
a1f0: 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45  pe(pVal)==SQLITE
a200: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a  _TEXT ){.      z
a210: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
a220: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
a230: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  al);.    }.    s
a240: 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
a250: 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64  mask(pParse->pVd
a260: 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61  be, iCol);.    a
a270: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
a280: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c  p==TK_VARIABLE |
a290: 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  | pRight->op==TK
a2a0: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d  _REGISTER );.  }
a2b0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
a2c0: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20  STRING ){.    z 
a2d0: 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  = pRight->u.zTok
a2e0: 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20  en;.  }.  if( z 
a2f0: 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  ){.    cnt = 0;.
a300: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b      while( (c=z[
a310: 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77  cnt])!=0 && c!=w
a320: 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d  c[0] && c!=wc[1]
a330: 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a   && c!=wc[2] ){.
a340: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
a350: 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
a360: 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a 5b  0 && 255!=(u8)z[
a370: 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20  cnt-1] ){.      
a380: 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a 20  Expr *pPrefix;. 
a390: 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74       *pisComplet
a3a0: 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20  e = c==wc[0] && 
a3b0: 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20  z[cnt+1]==0;.   
a3c0: 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71 6c     pPrefix = sql
a3d0: 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
a3e0: 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20  STRING, z);.    
a3f0: 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29 20    if( pPrefix ) 
a400: 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65  pPrefix->u.zToke
a410: 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20  n[cnt] = 0;.    
a420: 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50    *ppPrefix = pP
a430: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66 28  refix;.      if(
a440: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
a450: 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
a460: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
a470: 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dbe;.        sql
a480: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
a490: 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43  sk(v, pRight->iC
a4a0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
a4b0: 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  if( *pisComplete
a4c0: 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54   && pRight->u.zT
a4d0: 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20  oken[1] ){.     
a4e0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
a4f0: 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65  hs of the LIKE e
a500: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
a510: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  ariable, and the
a520: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
a530: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
a540: 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e  he variable mean
a550: 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  s there is no ne
a560: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
a570: 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20   LIKE.          
a580: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ** function, the
a590: 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65  n no OP_Variable
a5a0: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
a5b0: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  o the program.. 
a5c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
a5d0: 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73   causes problems
a5e0: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
a5f0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
a600: 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20  name().         
a610: 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b   ** API. To work
a620: 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64  around them, add
a630: 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69   a dummy OP_Vari
a640: 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  able here..     
a650: 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20       */ .       
a660: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
a670: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a680: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
a690: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
a6a0: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
a6b0: 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20  Right, r1);.    
a6c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a6d0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c  eChangeP3(v, sql
a6e0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
a6f0: 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20  ddr(v)-1, 0);.  
a700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
a710: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
a720: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
a730: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a740: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
a750: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
a760: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
a770: 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75  ee(pVal);.  retu
a780: 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e  rn (z!=0);.}.#en
a790: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
a7a0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
a7b0: 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  TION */...#ifnde
a7c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
a7d0: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
a7e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
a7f0: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
a800: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
a810: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
a820: 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20     column MATCH 
a830: 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  expr.**.** If it
a840: 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20   is then return 
a850: 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72  TRUE.  If not, r
a860: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a  eturn FALSE..*/.
a870: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74  static int isMat
a880: 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78  chOfColumn(.  Ex
a890: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f  pr *pExpr      /
a8a0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
a8b0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45  ession */.){.  E
a8c0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
a8d0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
a8e0: 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  !=TK_FUNCTION ){
a8f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a900: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
a910: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
a920: 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29  .zToken,"match")
a930: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
a940: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
a950: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
a960: 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  t;.  if( pList->
a970: 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20  nExpr!=2 ){.    
a980: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a990: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  if( pList->a[1].
a9a0: 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f  pExpr->op != TK_
a9b0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65  COLUMN ){.    re
a9c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
a9d0: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
a9e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
a9f0: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
aa00: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42  ./*.** If the pB
aa10: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ase expression o
aa20: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
aa30: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
aa40: 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e  use of.** a join
aa50: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
aa60: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
aa70: 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f  markings over to
aa80: 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61   derived..*/.sta
aa90: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65  tic void transfe
aaa0: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78  rJoinMarkings(Ex
aab0: 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78  pr *pDerived, Ex
aac0: 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44  pr *pBase){.  pD
aad0: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
aae0: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
aaf0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70  EP_FromJoin;.  p
ab00: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
ab10: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
ab20: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
ab30: 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  e;.}..#if !defin
ab40: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
ab50: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
ab60: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
ab70: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
ab80: 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  )./*.** Analyze 
ab90: 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73  a term that cons
aba0: 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ists of two or m
abb0: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
abc0: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53  .** subterms.  S
abd0: 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o in:.**.**     
abe0: 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29  ... WHERE  (a=5)
abf0: 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39   AND (b=7 OR c=9
ac00: 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64   OR d=13) AND (d
ac10: 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =13).**         
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e   ^^^^^^^^^^^^^^^
ac40: 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ^^^^^.**.** This
ac50: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
ac60: 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  s terms such as 
ac70: 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20  the middle term 
ac80: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61  in the above exa
ac90: 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65  mple..** A Where
aca0: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  OrTerm object is
acb0: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74   computed and at
acc0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65  tached to the te
acd0: 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c  rm under.** anal
ace0: 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73  ysis, regardless
acf0: 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20   of the outcome 
ad00: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  of the analysis.
ad10: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
ad20: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46     WhereTerm.wtF
ad30: 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f  lags   |=  TERM_
ad40: 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68  ORINFO.**     Wh
ad50: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
ad60: 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61  o  =  a dynamica
ad70: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
ad80: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
ad90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
ada0: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d  being analyzed m
adb0: 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20  ust have two or 
adc0: 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65  more of OR-conne
add0: 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a  cted subterms..*
ade0: 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
adf0: 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65  rm might be a se
ae00: 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  t of AND-connect
ae10: 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e  ed sub-subterms.
ae20: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  .** Examples of 
ae30: 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c  terms under anal
ae40: 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ysis:.**.**     
ae50: 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (A)     t1.x=t2.
ae60: 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f  y OR t1.x=t2.z O
ae70: 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e  R t1.y=15 OR t1.
ae80: 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20  z=t3.a+5.**     
ae90: 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (B)     x=expr1 
aea0: 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d  OR expr2=x OR x=
aeb0: 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29  expr3.**     (C)
aec0: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
aed0: 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44  R (t1.x=t2.z AND
aee0: 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20   t1.y=15).**    
aef0: 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31   (D)     x=expr1
af00: 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c   OR (y>11 AND y<
af10: 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a  22 AND z LIKE '*
af20: 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20  hello*').**     
af30: 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41  (E)     (p.a=1 A
af40: 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63  ND q.b=2 AND r.c
af50: 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e  =3) OR (p.x=4 AN
af60: 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d  D q.y=5 AND r.z=
af70: 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a  6).**.** CASE 1:
af80: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
af90: 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68  bterms are of th
afa0: 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20  e form T.C=expr 
afb0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
afc0: 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a  column of C and.
afd0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ** a single tabl
afe0: 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e  e T (as shown in
aff0: 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65   example B above
b000: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  ) then create a 
b010: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
b020: 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65  erm that is an e
b030: 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70  quivalent IN exp
b040: 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  ression.  In oth
b050: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
b060: 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61   term.** being a
b070: 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a  nalyzed is:.**.*
b080: 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72 31  *      x = expr1
b090: 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20    OR  expr2 = x 
b0a0: 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a   OR  x = expr3.*
b0b0: 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65  *.** then create
b0c0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
b0d0: 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  erm like this:.*
b0e0: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
b0f0: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
b100: 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a  3).**.** CASE 2:
b110: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
b120: 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78  bterms are index
b130: 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65  able by a single
b140: 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73   table T, then s
b150: 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  et.**.**     Whe
b160: 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72  reTerm.eOperator
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
b180: 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68   WO_OR.**     Wh
b190: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
b1a0: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d  o->indexable  |=
b1b0: 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    the cursor num
b1c0: 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a  ber for table T.
b1d0: 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  **.** A subterm 
b1e0: 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69  is "indexable" i
b1f0: 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20 66  f it is of the f
b200: 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e  orm.** "T.C <op>
b210: 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 43   <expr>" where C
b220: 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f   is any column o
b230: 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a  f table T and .*
b240: 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  * <op> is one of
b250: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c   "=", "<", "<=",
b260: 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20   ">", ">=", "IS 
b270: 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a  NULL", or "IN"..
b280: 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20  ** A subterm is 
b290: 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69  also indexable i
b2a0: 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f  f it is an AND o
b2b0: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  f two or more.**
b2c0: 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74 20   subsubterms at 
b2d0: 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69  least one of whi
b2e0: 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e  ch is indexable.
b2f0: 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20    Indexable AND 
b300: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76  .** subterms hav
b310: 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f  e their eOperato
b320: 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20  r set to WO_AND 
b330: 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a  and they have.**
b340: 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20   u.pAndInfo set 
b350: 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  to a dynamically
b360: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
b370: 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a  AndTerm object..
b380: 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68  **.** From anoth
b390: 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77  er point of view
b3a0: 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65  , "indexable" me
b3b0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75 62  ans that the sub
b3c0: 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f  term could.** po
b3d0: 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65  tentially be use
b3e0: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
b3f0: 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  if an appropriat
b400: 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a  e index exists..
b410: 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  ** This analysis
b420: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64   does not consid
b430: 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  er whether or no
b440: 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69 73  t the index exis
b450: 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 73  ts; that.** is s
b460: 6f 6d 65 74 68 69 6e 67 20 74 68 65 20 62 65 73  omething the bes
b470: 74 49 6e 64 65 78 28 29 20 72 6f 75 74 69 6e 65  tIndex() routine
b480: 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65 2e   will determine.
b490: 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 0a    This analysis.
b4a0: 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74  ** only looks at
b4b0: 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d   whether subterm
b4c0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
b4d0: 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74  r indexing exist
b4e0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d  ..**.** All exam
b4f0: 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20 45  ples A through E
b500: 20 61 62 6f 76 65 20 61 6c 6c 20 73 61 74 69 73   above all satis
b510: 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74 20  fy case 2.  But 
b520: 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73  if a term.** als
b530: 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61 73  o statisfies cas
b540: 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29 20  e 1 (such as B) 
b550: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
b560: 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a   optimizer will.
b570: 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65 72  ** always prefer
b580: 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74   case 1, so in t
b590: 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65 74  hat case we pret
b5a0: 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32 20  end that case 2 
b5b0: 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66  is not.** satisf
b5c0: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69  ied..**.** It mi
b5d0: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
b5e0: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61  that multiple ta
b5f0: 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61 62  bles are indexab
b600: 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
b610: 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69  ,.** (E) above i
b620: 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74  s indexable on t
b630: 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20  ables P, Q, and 
b640: 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74  R..**.** Terms t
b650: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
b660: 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74 65   2 are candidate
b670: 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20  s for lookup by 
b680: 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74  using.** separat
b690: 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e  e indices to fin
b6a0: 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63  d rowids for eac
b6b0: 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f  h subterm and co
b6c0: 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75  mposing.** the u
b6d0: 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69  nion of all rowi
b6e0: 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65  ds using a RowSe
b6f0: 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
b700: 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f  is similar.** to
b710: 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73   "bitmap indices
b720: 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62  " in other datab
b730: 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a  ase engines..**.
b740: 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a  ** OTHERWISE:.**
b750: 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63  .** If neither c
b760: 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32  ase 1 nor case 2
b770: 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61   apply, then lea
b780: 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72  ve the eOperator
b790: 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e   set to.** zero.
b7a0: 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e    This term is n
b7b0: 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65  ot useful for se
b7c0: 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  arch..*/.static 
b7d0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
b7e0: 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73  OrTerm(.  SrcLis
b7f0: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
b800: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
b810: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
b820: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
b830: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d        /* the com
b840: 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61 75  plete WHERE clau
b850: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54  se */.  int idxT
b860: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
b870: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
b880: 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20  e OR-term to be 
b890: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
b8a0: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
b8b0: 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
b8c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52  ;        /* WHER
b8d0: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
b8e0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b8f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
b900: 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
b910: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
b920: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
b930: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b940: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
b950: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
b960: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
b970: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
b980: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
b990: 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54  dxTerm];    /* T
b9a0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
b9b0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72  alyzed */.  Expr
b9c0: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
b9d0: 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  >pExpr;         
b9e0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
b9f0: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72  ssion of the ter
ba00: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  m */.  int i;   
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba30: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
ba40: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
ba50: 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f   *pOrWc;       /
ba60: 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65  * Breakup of pTe
ba70: 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  rm into subterms
ba80: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
ba90: 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20  *pOrTerm;       
baa0: 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69  /* A Sub-term wi
bab0: 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a  thin the pOrWc *
bac0: 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  /.  WhereOrInfo 
bad0: 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a  *pOrInfo;     /*
bae0: 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   Additional info
baf0: 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  rmation associat
bb00: 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f  ed with pTerm */
bb10: 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54  .  Bitmask chngT
bb20: 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oIN;         /* 
bb30: 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  Tables that migh
bb40: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31  t satisfy case 1
bb50: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e   */.  Bitmask in
bb60: 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20  dexable;        
bb70: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 61  /* Tables that a
bb80: 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61  re indexable, sa
bb90: 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32 20  tisfying case 2 
bba0: 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72  */..  /*.  ** Br
bbb0: 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73  eak the OR claus
bbc0: 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72  e into its separ
bbd0: 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54  ate subterms.  T
bbe0: 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a  he subterms are.
bbf0: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
bc00: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
bc10: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
bc20: 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68 65  g within the Whe
bc30: 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62  reOrInfo.  ** ob
bc40: 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74 74  ject that is att
bc50: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69  ached to the ori
bc60: 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20  ginal OR clause 
bc70: 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  term..  */.  ass
bc80: 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
bc90: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e  lags & (TERM_DYN
bca0: 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  AMIC|TERM_ORINFO
bcb0: 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d  |TERM_ANDINFO))=
bcc0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
bcd0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
bce0: 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70   );.  pTerm->u.p
bcf0: 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f  OrInfo = pOrInfo
bd00: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
bd10: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
bd20: 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20  f(*pOrInfo));.  
bd30: 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29  if( pOrInfo==0 )
bd40: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d   return;.  pTerm
bd50: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
bd60: 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57  M_ORINFO;.  pOrW
bd70: 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63  c = &pOrInfo->wc
bd80: 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
bd90: 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e 66  nit(pOrWc, pWInf
bda0: 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74  o);.  whereSplit
bdb0: 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54  (pOrWc, pExpr, T
bdc0: 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61  K_OR);.  exprAna
bdd0: 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f  lyzeAll(pSrc, pO
bde0: 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  rWc);.  if( db->
bdf0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
be00: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
be10: 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32   pOrWc->nTerm>=2
be20: 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43   );..  /*.  ** C
be30: 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20 6f  ompute the set o
be40: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69  f tables that mi
be50: 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65  ght satisfy case
be60: 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20  s 1 or 2..  */. 
be70: 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42   indexable = ~(B
be80: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67  itmask)0;.  chng
be90: 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b  ToIN = ~(Bitmask
bea0: 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57  )0;.  for(i=pOrW
beb0: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
bec0: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
bed0: 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b  =0 && indexable;
bee0: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
bef0: 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54 65  {.    if( (pOrTe
bf00: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
bf10: 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b  WO_SINGLE)==0 ){
bf20: 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64 49  .      WhereAndI
bf30: 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20  nfo *pAndInfo;. 
bf40: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f       assert( (pO
bf50: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
bf60: 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54   (TERM_ANDINFO|T
bf70: 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20  ERM_ORINFO))==0 
bf80: 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49  );.      chngToI
bf90: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e  N = 0;.      pAn
bfa0: 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  dInfo = sqlite3D
bfb0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
bfc0: 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29  izeof(*pAndInfo)
bfd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e  );.      if( pAn
bfe0: 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  dInfo ){.       
bff0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41   WhereClause *pA
c000: 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68  ndWC;.        Wh
c010: 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72  ereTerm *pAndTer
c020: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  m;.        int j
c030: 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
c040: 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  k b = 0;.       
c050: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64   pOrTerm->u.pAnd
c060: 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b  Info = pAndInfo;
c070: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
c080: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
c090: 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20  M_ANDINFO;.     
c0a0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65     pOrTerm->eOpe
c0b0: 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a  rator = WO_AND;.
c0c0: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d          pAndWC =
c0d0: 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a   &pAndInfo->wc;.
c0e0: 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c 61          whereCla
c0f0: 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20  useInit(pAndWC, 
c100: 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20  pWC->pWInfo);.  
c110: 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69 74        whereSplit
c120: 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d  (pAndWC, pOrTerm
c130: 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29  ->pExpr, TK_AND)
c140: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
c150: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
c160: 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20  AndWC);.        
c170: 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d  pAndWC->pOuter =
c180: 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65   pWC;.        te
c190: 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c  stcase( db->mall
c1a0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
c1b0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
c1c0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c1d0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
c1e0: 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d  pAndTerm=pAndWC-
c1f0: 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54  >a; j<pAndWC->nT
c200: 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65  erm; j++, pAndTe
c210: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
c220: 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54     assert( pAndT
c230: 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
c240: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c            if( al
c250: 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d  lowedOp(pAndTerm
c260: 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a  ->pExpr->op) ){.
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20                b 
c280: 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  |= getMask(&pWIn
c290: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41  fo->sMaskSet, pA
c2a0: 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ndTerm->leftCurs
c2b0: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  or);.           
c2c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
c2d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c2e0: 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b   indexable &= b;
c2f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
c300: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
c310: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
c320: 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f  OPIED ){.      /
c330: 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d  * Skip this term
c340: 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65   for now.  We re
c350: 76 69 73 69 74 20 69 74 20 77 68 65 6e 20 77 65  visit it when we
c360: 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20   process the.   
c370: 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64     ** correspond
c380: 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ing TERM_VIRTUAL
c390: 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c   term */.    }el
c3a0: 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  se{.      Bitmas
c3b0: 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67  k b;.      b = g
c3c0: 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
c3d0: 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72  sMaskSet, pOrTer
c3e0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
c3f0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
c400: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
c410: 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20  M_VIRTUAL ){.   
c420: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
c430: 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d  pOther = &pOrWc-
c440: 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72  >a[pOrTerm->iPar
c450: 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20  ent];.        b 
c460: 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  |= getMask(&pWIn
c470: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f  fo->sMaskSet, pO
c480: 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72  ther->leftCursor
c490: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c4a0: 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b   indexable &= b;
c4b0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54  .      if( (pOrT
c4c0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
c4d0: 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20   WO_EQ)==0 ){.  
c4e0: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
c4f0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
c500: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
c510: 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  N &= b;.      }.
c520: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
c530: 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20    ** Record the 
c540: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
c550: 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  at satisfy case 
c560: 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68  2.  The set migh
c570: 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e  t be.  ** empty.
c580: 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d  .  */.  pOrInfo-
c590: 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64  >indexable = ind
c5a0: 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d  exable;.  pTerm-
c5b0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64  >eOperator = ind
c5c0: 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20  exable==0 ? 0 : 
c5d0: 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  WO_OR;..  /*.  *
c5e0: 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73  * chngToIN holds
c5f0: 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73   a set of tables
c600: 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61   that *might* sa
c610: 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 42  tisfy case 1.  B
c620: 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20  ut.  ** we have 
c630: 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74  to do some addit
c640: 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74  ional checking t
c650: 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31 20  o see if case 1 
c660: 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73  really.  ** is s
c670: 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20  atisfied..  **. 
c680: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c   ** chngToIN wil
c690: 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c  l hold either 0,
c6a0: 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20   1, or 2 bits.  
c6b0: 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d  The 0-bit case m
c6c0: 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74  eans.  ** that t
c6d0: 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69  here is no possi
c6e0: 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66  bility of transf
c6f0: 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c  orming the OR cl
c700: 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a  ause into an.  *
c710: 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65  * IN operator be
c720: 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  cause one or mor
c730: 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  e terms in the O
c740: 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  R clause contain
c750: 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20  .  ** something 
c760: 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e  other than == on
c770: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
c780: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20   single table.  
c790: 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63  The 1-bit.  ** c
c7a0: 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65  ase means that e
c7b0: 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
c7c0: 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66   OR clause is of
c7d0: 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22   the form.  ** "
c7e0: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70  table.column=exp
c7f0: 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67  r" for some sing
c800: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f  le table.  The o
c810: 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20 73  ne bit that is s
c820: 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72  et.  ** will cor
c830: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63  respond to the c
c840: 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65  ommon table.  We
c850: 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63   still need to c
c860: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a  heck to make.  *
c870: 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 20  * sure the same 
c880: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f  column is used o
c890: 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68  n all terms.  Th
c8a0: 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73 20  e 2-bit case is 
c8b0: 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c  when.  ** the al
c8c0: 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  l terms are of t
c8d0: 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e  he form "table1.
c8e0: 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f  column=table2.co
c8f0: 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20  lumn".  It.  ** 
c900: 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c  might be possibl
c910: 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20  e to form an IN 
c920: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65 69  operator with ei
c930: 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75  ther table1.colu
c940: 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65  mn.  ** or table
c950: 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  2.column as the 
c960: 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69 73  LHS if either is
c970: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
c980: 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68   term of.  ** th
c990: 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a  e OR clause..  *
c9a0: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
c9b0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
c9c0: 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  rm "table.column
c9d0: 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22  1=table.column2"
c9e0: 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20   (the.  ** same 
c9f0: 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69  table on both si
ca00: 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63  zes of the ==) c
ca10: 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a  annot be optimiz
ca20: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ed..  */.  if( c
ca30: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69  hngToIN ){.    i
ca40: 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  nt okToChngToIN 
ca50: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
ca60: 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69   if the conversi
ca70: 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69  on to IN is vali
ca80: 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  d */.    int iCo
ca90: 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20  lumn = -1;      
caa0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64     /* Column ind
cab0: 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20  ex on lhs of IN 
cac0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
cad0: 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31  int iCursor = -1
cae0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
caf0: 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e  le cursor common
cb00: 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f   to all terms */
cb10: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20  .    int j = 0; 
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cb30: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
cb40: 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  /..    /* Search
cb50: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64   for a table and
cb60: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70   column that app
cb70: 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65  ears on one side
cb80: 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
cb90: 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f  ther of the == o
cba0: 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79  perator in every
cbb0: 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20   subterm.  That 
cbc0: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
cbd0: 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
cbe0: 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72  recorded in iCur
cbf0: 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e  sor and iColumn.
cc00: 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f    There might no
cc10: 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20  t be any.    ** 
cc20: 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63  such table and c
cc30: 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f  olumn.  Set okTo
cc40: 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61  ChngToIN if an a
cc50: 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65  ppropriate table
cc60: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75  .    ** and colu
cc70: 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20  mn is found but 
cc80: 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f  leave okToChngTo
cc90: 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20  IN false if not 
cca0: 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  found..    */.  
ccb0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26    for(j=0; j<2 &
ccc0: 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b  & !okToChngToIN;
ccd0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72   j++){.      pOr
cce0: 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b  Term = pOrWc->a;
ccf0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72  .      for(i=pOr
cd00: 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d  Wc->nTerm-1; i>=
cd10: 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  0; i--, pOrTerm+
cd20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
cd30: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
cd40: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
cd50: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
cd60: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54  m->wtFlags &= ~T
cd70: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
cd80: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
cd90: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
cda0: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
cdb0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
cdc0: 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20 77  2-bit case and w
cdd0: 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63  e are on the sec
cde0: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e  ond iteration an
cdf0: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  d.          ** c
ce00: 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66  urrent term is f
ce10: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69 74  rom the first it
ce20: 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69  eration.  So ski
ce30: 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a  p this term. */.
ce40: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
ce50: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
ce60: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
ce70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ce80: 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20  if( (chngToIN & 
ce90: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
cea0: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  >sMaskSet, pOrTe
ceb0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29  rm->leftCursor))
cec0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
ced0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75   /* This term mu
cee0: 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  st be of the for
cef0: 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65  m t1.a==t2.b whe
cf00: 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a  re t2 is in the.
cf10: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e            ** chn
cf20: 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31  gToIN set but t1
cf30: 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74   is not.  This t
cf40: 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68  erm will be eith
cf50: 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20 20  er preceeded.   
cf60: 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c         ** or fol
cf70: 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72  lwed by an inver
cf80: 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d  ted copy (t2.b==
cf90: 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69  t1.a).  Skip thi
cfa0: 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20  s term .        
cfb0: 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73    ** and use its
cfc0: 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20   inversion. */. 
cfd0: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
cfe0: 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  e( pOrTerm->wtFl
cff0: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
d000: 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  D );.          t
d010: 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d  estcase( pOrTerm
d020: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
d030: 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
d040: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
d050: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
d060: 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45   (TERM_COPIED|TE
d070: 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20  RM_VIRTUAL) );. 
d080: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
d090: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
d0a0: 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
d0b0: 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  OrTerm->u.leftCo
d0c0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43  lumn;.        iC
d0d0: 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d  ursor = pOrTerm-
d0e0: 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20  >leftCursor;.   
d0f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d100: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
d110: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
d120: 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61 62  No candidate tab
d130: 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f  le+column was fo
d140: 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f  und.  This can o
d150: 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20  nly occur.      
d160: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f    ** on the seco
d170: 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  nd iteration */.
d180: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d190: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
d1a0: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
d1b0: 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29  fTwo(chngToIN) )
d1c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d1d0: 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d  ( chngToIN==getM
d1e0: 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
d1f0: 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20  skSet, iCursor) 
d200: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
d210: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d220: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29  testcase( j==1 )
d230: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68  ;..      /* We h
d240: 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64  ave found a cand
d250: 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20  idate table and 
d260: 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74  column.  Check t
d270: 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20 20  o see if that.  
d280: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64      ** table and
d290: 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f   column is commo
d2a0: 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  n to every term 
d2b0: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
d2c0: 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68   */.      okToCh
d2d0: 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  ngToIN = 1;.    
d2e0: 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20    for(; i>=0 && 
d2f0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d  okToChngToIN; i-
d300: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
d310: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d320: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
d330: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
d340: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
d350: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
d360: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
d370: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
d380: 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f  ags &= ~TERM_OR_
d390: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OK;.        }els
d3a0: 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75  e if( pOrTerm->u
d3b0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f  .leftColumn!=iCo
d3c0: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
d3d0: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
d3e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
d3f0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
d400: 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67   affLeft, affRig
d410: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ht;.          /*
d420: 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68 61   If the right-ha
d430: 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20  nd side is also 
d440: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74  a column, then t
d450: 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20  he affinities.  
d460: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f          ** of bo
d470: 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66  th right and lef
d480: 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65 20  t sides must be 
d490: 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70  such that no typ
d4a0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
d4b0: 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72  onversions are r
d4c0: 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72  equired on the r
d4d0: 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23  ight.  (Ticket #
d4e0: 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20 20  2249).          
d4f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  */.          aff
d500: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
d510: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54  xprAffinity(pOrT
d520: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
d530: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ht);.          a
d540: 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  ffLeft = sqlite3
d550: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
d560: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
d570: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ft);.          i
d580: 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20 26  f( affRight!=0 &
d590: 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c  & affRight!=affL
d5a0: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
d5b0: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
d5c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
d5d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d5e0: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
d5f0: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b  gs |= TERM_OR_OK
d600: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d620: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
d630: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54   this point, okT
d640: 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75  oChngToIN is tru
d650: 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54  e if original pT
d660: 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20  erm satisfies.  
d670: 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e    ** case 1.  In
d680: 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73   that case, cons
d690: 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72 74  truct a new virt
d6a0: 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73  ual term that is
d6b0: 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63   .    ** pTerm c
d6c0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  onverted into an
d6d0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
d6e0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a 20    **.    ** EV: 
d6f0: 52 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20 20  R-00211-15100.  
d700: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54    */.    if( okT
d710: 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20  oChngToIN ){.   
d720: 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20     Expr *pDup;  
d730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
d740: 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61  ransient duplica
d750: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  te expression */
d760: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
d770: 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a  *pList = 0;   /*
d780: 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   The RHS of the 
d790: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
d7a0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
d7b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
d7c0: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
d7d0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
d7e0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20     Expr *pNew;  
d7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d800: 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65   complete IN ope
d810: 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20  rator */..      
d820: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
d830: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f  rm-1, pOrTerm=pO
d840: 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  rWc->a; i>=0; i-
d850: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
d860: 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
d870: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
d880: 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20  ERM_OR_OK)==0 ) 
d890: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
d8a0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
d8b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
d8c0: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
d8d0: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
d8e0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
d8f0: 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20  rsor );.        
d900: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
d910: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  >u.leftColumn==i
d920: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
d930: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
d940: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54  ExprDup(db, pOrT
d950: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
d960: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
d970: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
d980: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57  xprListAppend(pW
d990: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c  Info->pParse, pL
d9a0: 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ist, pDup);.    
d9b0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54      pLeft = pOrT
d9c0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
d9d0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
d9e0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
d9f0: 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20  0 );.      pDup 
da00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
da10: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
da20: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
da30: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
da40: 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30  , TK_IN, pDup, 0
da50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
da60: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
da70: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
da80: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
da90: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70  Markings(pNew, p
daa0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61  Expr);.        a
dab0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
dac0: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
dad0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
dae0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
daf0: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
db00: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
db10: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
db20: 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d  (pWC, pNew, TERM
db30: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
db40: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
db50: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
db60: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65  ==0 );.        e
db70: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
db80: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
db90: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
dba0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
dbb0: 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  .        pWC->a[
dbc0: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
dbd0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
dbe0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
dbf0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
dc00: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
dc10: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
dc20: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
dc30: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d     }.      pTerm
dc40: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
dc50: 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20  _NOOP;  /* case 
dc60: 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20  1 trumps case 2 
dc70: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  */.    }.  }.}.#
dc80: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
dc90: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
dca0: 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45  ATION && !SQLITE
dcb0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
dcc0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  /../*.** The inp
dcd0: 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
dce0: 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65  ne is an WhereTe
dcf0: 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74  rm structure wit
dd00: 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70  h only the.** "p
dd10: 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c  Expr" field fill
dd20: 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20  ed in.  The job 
dd30: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
dd40: 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  is to analyze th
dd50: 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69  e.** subexpressi
dd60: 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  on and populate 
dd70: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69  all the other fi
dd80: 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72  elds of the Wher
dd90: 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75  eTerm.** structu
dda0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
ddb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
ddc0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70  f the form "<exp
ddd0: 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65  r> <op> X" it ge
dde0: 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74  ts commuted.** t
ddf0: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66  o the standard f
de00: 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c  orm of "X <op> <
de10: 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66  expr>"..**.** If
de20: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
de30: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
de40: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
de50: 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65  both X and Y are
de60: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  .** columns, the
de70: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65  n the original e
de80: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63  xpression is unc
de90: 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77  hanged and a new
dea0: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d   virtual.** term
deb0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20   of the form "Y 
dec0: 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64  <op> X" is added
ded0: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
dee0: 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ause and.** anal
def0: 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  yzed separately.
df00: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
df10: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
df20: 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a  th TERM_COPIED.*
df30: 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65  * and the new te
df40: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
df50: 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28  h TERM_DYNAMIC (
df60: 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78  because it's pEx
df70: 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  pr.** needs to b
df80: 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65  e freed with the
df90: 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e   WhereClause) an
dfa0: 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28  d TERM_VIRTUAL (
dfb0: 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73  because it.** is
dfc0: 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79   a commuted copy
dfd0: 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d   of a prior term
dfe0: 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .)  The original
dff0: 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64   term has nChild
e000: 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f  =1.** and the co
e010: 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74  py has idxParent
e020: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
e030: 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  x of the origina
e040: 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  l term..*/.stati
e050: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
e060: 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ze(.  SrcList *p
e070: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
e080: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
e090: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
e0a0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
e0b0: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
e0c0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
e0d0: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
e0e0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
e0f0: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
e100: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
e110: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
e120: 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f  fo = pWC->pWInfo
e130: 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  ; /* WHERE claus
e140: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e  e processing con
e150: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
e160: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
e170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e180: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
e190: 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lyzed */.  Where
e1a0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
e1b0: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
e1c0: 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65  et of table inde
e1d0: 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70  x masks */.  Exp
e1e0: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e200: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
e210: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
e220: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
e230: 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  eqLeft;         
e240: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
e250: 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78  sites of the pEx
e260: 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42  pr->pLeft */.  B
e270: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
e280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e290: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
e2a0: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42   of pExpr */.  B
e2b0: 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68  itmask extraRigh
e2c0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
e2d0: 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65  /* Extra depende
e2e0: 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f  ncies on LEFT JO
e2f0: 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53  IN */.  Expr *pS
e300: 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tr1 = 0;        
e310: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20           /* RHS 
e320: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
e330: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
e340: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20  sComplete = 0;  
e350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e360: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
e370: 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61  ends with wildca
e380: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61  rd */.  int noCa
e390: 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
e3a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45           /* LIKE
e3b0: 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73  /GLOB distinguis
e3c0: 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e  hes case */.  in
e3d0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e3f0: 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72  * Top-level oper
e400: 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70  ator.  pExpr->op
e410: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
e420: 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
e430: 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e  arse;  /* Parsin
e440: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
e450: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e460: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
e470: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
e480: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ection */..  if(
e490: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e4a0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
e4b0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
e4c0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
e4d0: 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70  .  pMaskSet = &p
e4e0: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b  WInfo->sMaskSet;
e4f0: 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d  .  pExpr = pTerm
e500: 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->pExpr;.  asser
e510: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
e520: 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  _AS && pExpr->op
e530: 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a  !=TK_COLLATE );.
e540: 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65    prereqLeft = e
e550: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
e560: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
e570: 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45  Left);.  op = pE
e580: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
e590: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
e5a0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
e5b0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
e5c0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
e5d0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
e5e0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
e5f0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
e600: 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63  ight = exprSelec
e610: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
e620: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  kSet, pExpr->x.p
e630: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
e640: 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  se{.      pTerm-
e650: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
e660: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
e670: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
e680: 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
e690: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f   }.  }else if( o
e6a0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
e6b0: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
e6c0: 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65  qRight = 0;.  }e
e6d0: 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  lse{.    pTerm->
e6e0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
e6f0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
e700: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52  skSet, pExpr->pR
e710: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65  ight);.  }.  pre
e720: 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62  reqAll = exprTab
e730: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
e740: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
e750: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
e760: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
e770: 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  in) ){.    Bitma
e780: 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70  sk x = getMask(p
e790: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
e7a0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29  iRightJoinTable)
e7b0: 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20  ;.    prereqAll 
e7c0: 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52  |= x;.    extraR
e7d0: 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20  ight = x-1;  /* 
e7e0: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
e7f0: 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20  may not be used 
e800: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20  with an index.  
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20       ** on left 
e830: 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
e840: 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33  JOIN.  Ticket #3
e850: 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65  015 */.  }.  pTe
e860: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
e870: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65  prereqAll;.  pTe
e880: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
e890: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50   -1;.  pTerm->iP
e8a0: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54  arent = -1;.  pT
e8b0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
e8c0: 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65   0;.  if( allowe
e8d0: 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20 45  dOp(op) ){.    E
e8e0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c  xpr *pLeft = sql
e8f0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
e900: 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ate(pExpr->pLeft
e910: 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  );.    Expr *pRi
e920: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
e930: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78  rSkipCollate(pEx
e940: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
e950: 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70   u16 opMask = (p
e960: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
e970: 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d  t & prereqLeft)=
e980: 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f  =0 ? WO_ALL : WO
e990: 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28 20  _EQUIV;.    if( 
e9a0: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pLeft->op==TK_CO
e9b0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54  LUMN ){.      pT
e9c0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
e9d0: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
e9e0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e  .      pTerm->u.
e9f0: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
ea00: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
ea10: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
ea20: 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61  tor = operatorMa
ea30: 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b  sk(op) & opMask;
ea40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
ea50: 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d  Right && pRight-
ea60: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
ea70: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
ea80: 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45  m *pNew;.      E
ea90: 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20  xpr *pDup;.     
eaa0: 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20   u16 eExtraOp = 
eab0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  0;        /* Ext
eac0: 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77  ra bits for pNew
ead0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ->eOperator */. 
eae0: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
eaf0: 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b  leftCursor>=0 ){
eb00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78  .        int idx
eb10: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75  New;.        pDu
eb20: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
eb30: 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
eb40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
eb50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
eb60: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
eb70: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
eb80: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
eb90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
eba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78     }.        idx
ebb0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
ebc0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75  eInsert(pWC, pDu
ebd0: 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  p, TERM_VIRTUAL|
ebe0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
ebf0: 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65         if( idxNe
ec00: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  w==0 ) return;. 
ec10: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70         pNew = &p
ec20: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
ec30: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61         pNew->iPa
ec40: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
ec50: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
ec60: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
ec70: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
ec80: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
ec90: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
eca0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
ecb0: 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
ecc0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
ecd0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
ece0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
ecf0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
ed00: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  ).         && Op
ed10: 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
ed20: 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61  d(db, SQLITE_Tra
ed30: 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20 20  nsitive).       
ed40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
ed50: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c  erm->eOperator |
ed60: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
ed70: 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d        eExtraOp =
ed80: 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20   WO_EQUIV;.     
ed90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
eda0: 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  {.        pDup =
edb0: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
edc0: 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pNew = pTerm;.  
edd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72      }.      expr
ede0: 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20  Commute(pParse, 
edf0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65  pDup);.      pLe
ee00: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
ee10: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75 70  SkipCollate(pDup
ee20: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
ee30: 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pNew->leftCursor
ee40: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
ee50: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
ee60: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
ee70: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
ee80: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 72     testcase( (pr
ee90: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
eea0: 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65 71  Right) != prereq
eeb0: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Left );.      pN
eec0: 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  ew->prereqRight 
eed0: 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65  = prereqLeft | e
eee0: 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20  xtraRight;.     
eef0: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c   pNew->prereqAll
ef00: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
ef10: 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61      pNew->eOpera
ef20: 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d  tor = (operatorM
ef30: 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20  ask(pDup->op) + 
ef40: 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d 61  eExtraOp) & opMa
ef50: 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  sk;.    }.  }..#
ef60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ef70: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
ef80: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20  IZATION.  /* If 
ef90: 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45  a term is the BE
efa0: 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20  TWEEN operator, 
efb0: 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76  create two new v
efc0: 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a  irtual terms.  *
efd0: 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68  * that define th
efe0: 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65  e range that the
eff0: 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65   BETWEEN impleme
f000: 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  nts.  For exampl
f010: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
f020: 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e    a BETWEEN b AN
f030: 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  D c.  **.  ** is
f040: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a   converted into:
f050: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
f060: 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44  (a BETWEEN b AND
f070: 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41   c) AND (a>=b) A
f080: 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20  ND (a<=c).  **. 
f090: 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20   ** The two new 
f0a0: 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
f0b0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
f0c0: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
f0d0: 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65  object..  ** The
f0e0: 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22   new terms are "
f0f0: 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65  dynamic" and are
f100: 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65   children of the
f110: 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45   original BETWEE
f120: 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68  N.  ** term.  Th
f130: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  at means that if
f140: 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72   the BETWEEN ter
f150: 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20  m is coded, the 
f160: 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a  children are.  *
f170: 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20  * skipped.  Or, 
f180: 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  if the children 
f190: 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79  are satisfied by
f1a0: 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f   an index, the o
f1b0: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54  riginal.  ** BET
f1c0: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69  WEEN term is ski
f1d0: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
f1e0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
f1f0: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70  =TK_BETWEEN && p
f200: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
f210: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
f220: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
f230: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  .pList;.    int 
f240: 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  i;.    static co
f250: 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b  nst u8 ops[] = {
f260: 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20  TK_GE, TK_LE};. 
f270: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
f280: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
f290: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
f2a0: 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =2 );.    for(i=
f2b0: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
f2c0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
f2d0: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  pr;.      int id
f2e0: 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNew;.      pNew
f2f0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
f300: 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b  xpr(pParse, ops[
f310: 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  i], .           
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
f340: 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
f350: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f370: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
f380: 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
f390: 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29  i].pExpr, 0), 0)
f3a0: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
f3b0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
f3c0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
f3d0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
f3e0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
f3f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
f400: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
f410: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
f420: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
f430: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
f440: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
f450: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
f460: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
f470: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  idxTerm;.    }. 
f480: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
f490: 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 2;.  }.#endif
f4a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f4b0: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
f4c0: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65  TION */..#if !de
f4d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f4e0: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
f4f0: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
f500: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
f510: 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  ERY).  /* Analyz
f520: 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73  e a term that is
f530: 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f   composed of two
f540: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
f550: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  s connected by. 
f560: 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74   ** an OR operat
f570: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  or..  */.  else 
f580: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
f590: 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65  K_OR ){.    asse
f5a0: 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  rt( pWC->op==TK_
f5b0: 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41  AND );.    exprA
f5c0: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72  nalyzeOrTerm(pSr
f5d0: 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29  c, pWC, idxTerm)
f5e0: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
f5f0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
f600: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
f610: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
f620: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
f630: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f640: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
f650: 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e  ION.  /* Add con
f660: 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75  straints to redu
f670: 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ce the search sp
f680: 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72  ace on a LIKE or
f690: 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61   GLOB.  ** opera
f6a0: 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  tor..  **.  ** A
f6b0: 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66   like pattern of
f6c0: 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b   the form "x LIK
f6d0: 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68 61  E 'abc%'" is cha
f6e0: 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72  nged into constr
f6f0: 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  aints.  **.  ** 
f700: 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63           x>='abc
f710: 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e  ' AND x<'abd' AN
f720: 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a  D x LIKE 'abc%'.
f730: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61    **.  ** The la
f740: 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
f750: 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22  the prefix "abc"
f760: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
f770: 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a  to form the.  **
f780: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e   termination con
f790: 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20  dition "abd"..  
f7a0: 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70  */.  if( pWC->op
f7b0: 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20  ==TK_AND .   && 
f7c0: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61  isLikeOrGlob(pPa
f7d0: 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74  rse, pExpr, &pSt
f7e0: 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c  r1, &isComplete,
f7f0: 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20   &noCase).  ){. 
f800: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20     Expr *pLeft; 
f810: 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20        /* LHS of 
f820: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
f830: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
f840: 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20  pStr2;       /* 
f850: 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20  Copy of pStr1 - 
f860: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
f870: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
f880: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31   Expr *pNewExpr1
f890: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
f8a0: 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  Expr2;.    int i
f8b0: 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20  dxNew1;.    int 
f8c0: 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f 6b  idxNew2;.    Tok
f8d0: 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b  en sCollSeqName;
f8e0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c    /* Name of col
f8f0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
f900: 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  */..    pLeft = 
f910: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
f920: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
f930: 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45  pStr2 = sqlite3E
f940: 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72 31  xprDup(db, pStr1
f950: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 64  , 0);.    if( !d
f960: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f970: 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a  ){.      u8 c, *
f980: 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73  pC;       /* Las
f990: 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f  t character befo
f9a0: 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69 6c  re the first wil
f9b0: 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70  dcard */.      p
f9c0: 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d  C = (u8*)&pStr2-
f9d0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65  >u.zToken[sqlite
f9e0: 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d  3Strlen30(pStr2-
f9f0: 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20  >u.zToken)-1];. 
fa00: 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20       c = *pC;.  
fa10: 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29      if( noCase )
fa20: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
fa30: 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63   point is to inc
fa40: 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20  rement the last 
fa50: 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65  character before
fa60: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
fa70: 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20     ** wildcard. 
fa80: 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72 65   But if we incre
fa90: 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77  ment '@', that w
faa0: 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f  ill push it into
fab0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
fac0: 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67 65  alphabetic range
fad0: 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76   where case conv
fae0: 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73  ersions will mes
faf0: 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20 20  s up the .      
fb00: 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e    ** inequality.
fb10: 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c    To avoid this,
fb20: 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c   make sure to al
fb30: 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a  so run the full.
fb40: 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20          ** LIKE 
fb50: 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65  on all candidate
fb60: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20   expressions by 
fb70: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73 43  clearing the isC
fb80: 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20  omplete flag.   
fb90: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
fba0: 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69  if( c=='A'-1 ) i
fbb0: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20  sComplete = 0;  
fbc0: 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33 33 39 2d   /* EV: R-64339-
fbd0: 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20 20 20 20  08207 */...     
fbe0: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70     c = sqlite3Up
fbf0: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20  perToLower[c];. 
fc00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43       }.      *pC
fc10: 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a   = c + 1;.    }.
fc20: 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65      sCollSeqName
fc30: 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e  .z = noCase ? "N
fc40: 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59  OCASE" : "BINARY
fc50: 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e  ";.    sCollSeqN
fc60: 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70  ame.n = 6;.    p
fc70: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
fc80: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
fc90: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
fca0: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
fcb0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
fcc0: 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  _GE, .          
fcd0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
fce0: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72  ollateToken(pPar
fcf0: 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43  se,pNewExpr1,&sC
fd00: 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20  ollSeqName),.   
fd10: 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30          pStr1, 0
fd20: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d  );.    idxNew1 =
fd30: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
fd40: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
fd50: 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  1, TERM_VIRTUAL|
fd60: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
fd70: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
fd80: 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65  New1==0 );.    e
fd90: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
fda0: 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a   pWC, idxNew1);.
fdb0: 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20      pNewExpr2 = 
fdc0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
fdd0: 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  b, pLeft, 0);.  
fde0: 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71    pNewExpr2 = sq
fdf0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
fe00: 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20  e, TK_LT,.      
fe10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fe20: 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28  AddCollateToken(
fe30: 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 32  pParse,pNewExpr2
fe40: 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c  ,&sCollSeqName),
fe50: 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72  .           pStr
fe60: 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65  2, 0);.    idxNe
fe70: 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w2 = whereClause
fe80: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
fe90: 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54  Expr2, TERM_VIRT
fea0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
feb0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
fec0: 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20   idxNew2==0 );. 
fed0: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
fee0: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
fef0: 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  2);.    pTerm = 
ff00: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
ff10: 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70  ;.    if( isComp
ff20: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57  lete ){.      pW
ff30: 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50  C->a[idxNew1].iP
ff40: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
ff50: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
ff60: 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d  xNew2].iParent =
ff70: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
ff80: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
ff90: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  2;.    }.  }.#en
ffa0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ffb0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
ffc0: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
ffd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
ffe0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41  TUALTABLE.  /* A
fff0: 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75  dd a WO_MATCH au
10000 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20  xiliary term to 
10010 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73  the constraint s
10020 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63  et if the.  ** c
10030 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f  urrent expressio
10040 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
10050 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20  :  column MATCH 
10060 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20  expr..  ** This 
10070 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
10080 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  sed by the xBest
10090 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66  Index methods of
100a0 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
100b0 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76  bles.  The nativ
100c0 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65  e query optimize
100d0 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d  r does not attem
100e0 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e  pt.  ** to do an
100f0 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43  ything with MATC
10100 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  H functions..  *
10110 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f  /.  if( isMatchO
10120 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29  fColumn(pExpr) )
10130 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  {.    int idxNew
10140 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  ;.    Expr *pRig
10150 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  ht, *pLeft;.    
10160 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54  WhereTerm *pNewT
10170 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b  erm;.    Bitmask
10180 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70   prereqColumn, p
10190 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20  rereqExpr;..    
101a0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
101b0 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
101c0 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d  xpr;.    pLeft =
101d0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
101e0 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
101f0 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65 78   prereqExpr = ex
10200 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
10210 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a  skSet, pRight);.
10220 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e      prereqColumn
10230 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
10240 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66  e(pMaskSet, pLef
10250 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65  t);.    if( (pre
10260 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71  reqExpr & prereq
10270 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20  Column)==0 ){.  
10280 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
10290 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  pr;.      pNewEx
102a0 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
102b0 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54  r(pParse, TK_MAT
102c0 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  CH, .           
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70     0, sqlite3Exp
102f0 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c  rDup(db, pRight,
10300 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69   0), 0);.      i
10310 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
10320 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
10330 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49  NewExpr, TERM_VI
10340 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
10350 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  IC);.      testc
10360 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
10370 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
10380 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
10390 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  w];.      pNewTe
103a0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
103b0 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20  = prereqExpr;.  
103c0 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65      pNewTerm->le
103d0 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
103e0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
103f0 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  pNewTerm->u.left
10400 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
10410 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
10420 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  NewTerm->eOperat
10430 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20  or = WO_MATCH;. 
10440 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
10450 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
10460 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
10470 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
10480 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
10490 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
104a0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
104b0 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
104c0 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
104d0 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
104e0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
104f0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
10500 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
10510 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
10520 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10530 42 4c 45 5f 53 54 41 54 33 0a 20 20 2f 2a 20 57  BLE_STAT3.  /* W
10540 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33  hen sqlite_stat3
10550 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
10560 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20  is available an 
10570 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a  operator of the.
10580 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20    ** form "x IS 
10590 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f  NOT NULL" can so
105a0 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75  metimes be evalu
105b0 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69  ated more effici
105c0 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78  ently.  ** as "x
105d0 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e  >NULL" if x is n
105e0 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
105f0 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63  IMARY KEY.  So c
10600 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20  onstruct a.  ** 
10610 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20  virtual term of 
10620 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a  that form..  **.
10630 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
10640 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  he virtual term 
10650 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20 77  must be tagged w
10660 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20  ith TERM_VNULL. 
10670 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f   This.  ** TERM_
10680 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73  VNULL tag will s
10690 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d  uppress the not-
106a0 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68  null check at th
106b0 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
106c0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57   of the loop.  W
106d0 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f  ithout the TERM_
106e0 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20  VNULL flag, the 
106f0 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
10700 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74  t.  ** the start
10710 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c   of the loop wil
10720 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65  l prevent any re
10730 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  sults from being
10740 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a   returned..  */.
10750 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
10760 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
10770 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
10780 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
10790 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
107a0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 29  ->iColumn>=0.  )
107b0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
107c0 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
107d0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
107e0 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64  Left;.    int id
107f0 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54  xNew;.    WhereT
10800 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a  erm *pNewTerm;..
10810 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
10820 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
10830 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20  se, TK_GT,.     
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
10860 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
10870 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10890 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
108a0 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30  arse, TK_NULL, 0
108b0 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20  , 0, 0), 0);..  
108c0 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
108d0 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
108e0 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20  , pNewExpr,.    
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10900 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56            TERM_V
10910 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
10920 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b  MIC|TERM_VNULL);
10930 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 20  .    if( idxNew 
10940 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ){.      pNewTer
10950 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
10960 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
10970 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
10980 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
10990 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
109a0 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
109b0 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
109c0 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
109d0 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
109e0 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
109f0 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
10a00 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  GT;.      pNewTe
10a10 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  rm->iParent = id
10a20 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
10a30 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
10a40 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
10a50 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
10a60 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
10a70 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
10a80 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
10a90 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
10aa0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
10ab0 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
10ac0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
10ad0 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20 20  ABLE_STAT */..  
10ae0 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c  /* Prevent ON cl
10af0 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20  ause terms of a 
10b00 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62  LEFT JOIN from b
10b10 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69  eing used to dri
10b20 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  ve.  ** an index
10b30 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74   for tables to t
10b40 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
10b50 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72  oin..  */.  pTer
10b60 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c  m->prereqRight |
10b70 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a  = extraRight;.}.
10b80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
10b90 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 70 4c  tion searches pL
10ba0 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72 79 20  ist for a entry 
10bb0 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
10bc0 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a   iCol-th column.
10bd0 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  ** of index pIdx
10be0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
10bf0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
10c00 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65   found, its inde
10c10 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20  x in pList->a[] 
10c20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a  is returned. If.
10c30 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e  ** no expression
10c40 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73   is found, -1 is
10c50 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
10c60 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64  atic int findInd
10c70 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a  exCol(.  Parse *
10c80 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
10c90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
10ca0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e context */.  E
10cb0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10cd0 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * Expression lis
10ce0 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  t to search */. 
10cf0 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20   int iBase,     
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d10 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74   /* Cursor for t
10d20 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
10d30 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49  with pIdx */.  I
10d40 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10d60 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  * Index to match
10d70 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20   column of */.  
10d80 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20  int iCol        
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10da0 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  /* Column of ind
10db0 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29  ex to match */.)
10dc0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  {.  int i;.  con
10dd0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
10de0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43   pIdx->azColl[iC
10df0 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ol];..  for(i=0;
10e00 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
10e10 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
10e20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  *p = sqlite3Expr
10e30 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
10e40 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
10e50 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
10e60 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26  K_COLUMN.     &&
10e70 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64   p->iColumn==pId
10e80 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
10e90 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61  ].     && p->iTa
10ea0 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29  ble==iBase.    )
10eb0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
10ec0 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
10ed0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
10ee0 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
10ef0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
10f00 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  ( ALWAYS(pColl) 
10f10 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
10f20 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
10f30 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
10f40 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
10f50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10f60 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ..  return -1;.}
10f70 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
10f80 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
10f90 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
10fa0 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
10fb0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
10fc0 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
10fd0 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
10fe0 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
10ff0 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61  dant if the data
11000 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f  base contains so
11010 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20  me subset of.** 
11020 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
11030 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d   unique and non-
11040 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  null..*/.static 
11050 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65  int isDistinctRe
11060 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65  dundant(.  Parse
11070 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
11080 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11090 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
110a0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
110b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
110c0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
110d0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
110e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
110f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
11100 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
11110 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54  tinct       /* T
11120 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 68  he result set th
11130 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44  at needs to be D
11140 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20  ISTINCT */.){.  
11150 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
11160 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
11170 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
11190 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f   int iBase;..  /
111a0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f  * If there is mo
111b0 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c  re than one tabl
111c0 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20  e or sub-select 
111d0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
111e0 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  se of.  ** this 
111f0 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77  query, then it w
11200 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
11210 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74  ble to show that
11220 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20   the DISTINCT . 
11230 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65   ** clause is re
11240 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  dundant. */.  if
11250 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
11260 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
11270 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69    iBase = pTabLi
11280 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
11290 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c  ;.  pTab = pTabL
112a0 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  ist->a[0].pTab;.
112b0 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  /* If any of 
112c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
112d0 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e  is an IPK column
112e0 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c   on table iBase,
112f0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20   then return .  
11300 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54  ** true. Note: T
11310 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  he (p->iTable==i
11320 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68  Base) part of th
11330 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66  is test may be f
11340 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a  alse if the.  **
11350 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
11360 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
11370 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  sub-query..  */.
11380 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
11390 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
113a0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
113b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
113c0 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69  ipCollate(pDisti
113d0 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  nct->a[i].pExpr)
113e0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
113f0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
11400 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26  >iTable==iBase &
11410 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  & p->iColumn<0 )
11420 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
11430 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
11440 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e  h all indices on
11450 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63   the table, chec
11460 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65  king each to see
11470 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a   if it makes.  *
11480 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  * the DISTINCT q
11490 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61  ualifier redunda
114a0 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69  nt. It does so i
114b0 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  f:.  **.  **   1
114c0 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69  . The index is i
114d0 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e  tself UNIQUE, an
114e0 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e  d.  **.  **   2.
114f0 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75   All of the colu
11500 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
11510 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74   are either part
11520 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63   of the pDistinc
11530 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74  t.  **      list
11540 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48  , or else the WH
11550 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
11560 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  ins a term of th
11570 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a  e form "col=X",.
11580 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20    **      where 
11590 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  X is a constant 
115a0 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61  value. The colla
115b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f  tion sequences o
115c0 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20  f the.  **      
115d0 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73  comparison and s
115e0 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65  elect-list expre
115f0 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63  ssions must matc
11600 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69  h those of the i
11610 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
11620 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73    3. All of thos
11630 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  e index columns 
11640 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48  for which the WH
11650 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
11660 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f  not.  **      co
11670 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20  ntain a "col=X" 
11680 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74  term are subject
11690 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63   to a NOT NULL c
116a0 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
116b0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
116c0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
116d0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
116e0 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  {.    if( pIdx->
116f0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
11700 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11710 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
11720 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
11730 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
11740 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
11750 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  [i];.      if( 0
11760 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ==findTerm(pWC, 
11770 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42  iBase, iCol, ~(B
11780 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c  itmask)0, WO_EQ,
11790 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
117a0 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20    int iIdxCol = 
117b0 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
117c0 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
117d0 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b  iBase, pIdx, i);
117e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49 64  .        if( iId
117f0 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e  xCol<0 || pTab->
11800 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
11810 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 3d  umn[i]].notNull=
11820 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11830 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
11840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11850 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e     if( i==pIdx->
11860 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
11870 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
11880 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20  mplies that the 
11890 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
118a0 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  er is redundant.
118b0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
118c0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
118d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
118e0 20 0a 2a 2a 20 54 68 65 20 28 61 6e 20 61 70 70   .** The (an app
118f0 72 6f 78 69 6d 61 74 65 29 20 73 75 6d 20 6f 66  roximate) sum of
11900 20 74 77 6f 20 57 68 65 72 65 43 6f 73 74 73 2e   two WhereCosts.
11910 20 20 54 68 69 73 20 63 6f 6d 70 75 74 61 74 69    This computati
11920 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20 73  on is.** not a s
11930 69 6d 70 6c 65 20 22 2b 22 20 6f 70 65 72 61 74  imple "+" operat
11940 6f 72 20 62 65 63 61 75 73 65 20 57 68 65 72 65  or because Where
11950 43 6f 73 74 20 69 73 20 73 74 6f 72 65 64 20 61  Cost is stored a
11960 73 20 61 20 6c 6f 67 61 72 69 74 68 6d 69 63 0a  s a logarithmic.
11970 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20 0a 2a 2f  ** value..** .*/
11980 0a 73 74 61 74 69 63 20 57 68 65 72 65 43 6f 73  .static WhereCos
11990 74 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 57  t whereCostAdd(W
119a0 68 65 72 65 43 6f 73 74 20 61 2c 20 57 68 65 72  hereCost a, Wher
119b0 65 43 6f 73 74 20 62 29 7b 0a 20 20 73 74 61 74  eCost b){.  stat
119c0 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
119d0 64 20 63 68 61 72 20 78 5b 5d 20 3d 20 7b 0a 20  d char x[] = {. 
119e0 20 20 20 20 31 30 2c 20 31 30 2c 20 20 20 20 20      10, 10,     
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 20 20 2f 2a 20 30 2c 31 20 2a 2f 0a 20 20      /* 0,1 */.  
11a10 20 20 20 20 39 2c 20 39 2c 20 20 20 20 20 20 20      9, 9,       
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 20 20 20 2f 2a 20 32 2c 33 20 2a 2f 0a 20 20 20     /* 2,3 */.   
11a40 20 20 20 38 2c 20 38 2c 20 20 20 20 20 20 20 20     8, 8,        
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a60 20 20 2f 2a 20 34 2c 35 20 2a 2f 0a 20 20 20 20    /* 4,5 */.    
11a70 20 20 37 2c 20 37 2c 20 37 2c 20 20 20 20 20 20    7, 7, 7,      
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a90 20 2f 2a 20 36 2c 37 2c 38 20 2a 2f 0a 20 20 20   /* 6,7,8 */.   
11aa0 20 20 20 36 2c 20 36 2c 20 36 2c 20 20 20 20 20     6, 6, 6,     
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ac0 20 20 2f 2a 20 39 2c 31 30 2c 31 31 20 2a 2f 0a    /* 9,10,11 */.
11ad0 20 20 20 20 20 20 35 2c 20 35 2c 20 35 2c 20 20        5, 5, 5,  
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11af0 20 20 20 20 20 2f 2a 20 31 32 2d 31 34 20 2a 2f       /* 12-14 */
11b00 0a 20 20 20 20 20 20 34 2c 20 34 2c 20 34 2c 20  .      4, 4, 4, 
11b10 34 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4,              
11b20 20 20 20 20 20 20 2f 2a 20 31 35 2d 31 38 20 2a        /* 15-18 *
11b30 2f 0a 20 20 20 20 20 20 33 2c 20 33 2c 20 33 2c  /.      3, 3, 3,
11b40 20 33 2c 20 33 2c 20 33 2c 20 20 20 20 20 20 20   3, 3, 3,       
11b50 20 20 20 20 20 20 20 2f 2a 20 31 39 2d 32 34 20         /* 19-24 
11b60 2a 2f 0a 20 20 20 20 20 20 32 2c 20 32 2c 20 32  */.      2, 2, 2
11b70 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 20 20  , 2, 2, 2, 2,   
11b80 20 20 20 20 20 20 20 20 2f 2a 20 32 35 2d 33 31          /* 25-31
11b90 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 66 28 20 61   */.  };.  if( a
11ba0 3e 3d 62 20 29 7b 0a 20 20 20 20 69 66 28 20 61  >=b ){.    if( a
11bb0 3e 62 2b 34 39 20 29 20 72 65 74 75 72 6e 20 61  >b+49 ) return a
11bc0 3b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b 33 31  ;.    if( a>b+31
11bd0 20 29 20 72 65 74 75 72 6e 20 61 2b 31 3b 0a 20   ) return a+1;. 
11be0 20 20 20 72 65 74 75 72 6e 20 61 2b 78 5b 61 2d     return a+x[a-
11bf0 62 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b];.  }else{.   
11c00 20 69 66 28 20 62 3e 61 2b 34 39 20 29 20 72 65   if( b>a+49 ) re
11c10 74 75 72 6e 20 62 3b 0a 20 20 20 20 69 66 28 20  turn b;.    if( 
11c20 62 3e 61 2b 33 31 20 29 20 72 65 74 75 72 6e 20  b>a+31 ) return 
11c30 62 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  b+1;.    return 
11c40 62 2b 78 5b 62 2d 61 5d 3b 0a 20 20 7d 0a 7d 0a  b+x[b-a];.  }.}.
11c50 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
11c60 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  n integer into a
11c70 20 57 68 65 72 65 43 6f 73 74 2e 20 20 49 6e 20   WhereCost.  In 
11c80 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63 6f 6d  other words, com
11c90 70 75 74 65 20 61 0a 2a 2a 20 67 6f 6f 64 20 61  pute a.** good a
11ca0 70 70 72 6f 78 69 6d 61 74 61 74 69 6f 6e 20 66  pproximatation f
11cb0 6f 72 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a 2a  or 10*log2(x)..*
11cc0 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43 6f  /.static WhereCo
11cd0 73 74 20 77 68 65 72 65 43 6f 73 74 28 74 52 6f  st whereCost(tRo
11ce0 77 63 6e 74 20 78 29 7b 0a 20 20 73 74 61 74 69  wcnt x){.  stati
11cf0 63 20 57 68 65 72 65 43 6f 73 74 20 61 5b 5d 20  c WhereCost a[] 
11d00 3d 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35 2c 20  = { 0, 2, 3, 5, 
11d10 36 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a 20 20  6, 7, 8, 9 };.  
11d20 57 68 65 72 65 43 6f 73 74 20 79 20 3d 20 34 30  WhereCost y = 40
11d30 3b 0a 20 20 69 66 28 20 78 3c 38 20 29 7b 0a 20  ;.  if( x<8 ){. 
11d40 20 20 20 69 66 28 20 78 3c 32 20 29 20 72 65 74     if( x<2 ) ret
11d50 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  urn 0;.    while
11d60 28 20 78 3c 38 20 29 7b 20 20 79 20 2d 3d 20 31  ( x<8 ){  y -= 1
11d70 30 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d 0a 20 20  0; x <<= 1; }.  
11d80 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
11d90 28 20 78 3e 32 35 35 20 29 7b 20 79 20 2b 3d 20  ( x>255 ){ y += 
11da0 34 30 3b 20 78 20 3e 3e 3d 20 34 3b 20 7d 0a 20  40; x >>= 4; }. 
11db0 20 20 20 77 68 69 6c 65 28 20 78 3e 31 35 20 29     while( x>15 )
11dc0 7b 20 20 79 20 2b 3d 20 31 30 3b 20 78 20 3e 3e  {  y += 10; x >>
11dd0 3d 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  = 1; }.  }.  ret
11de0 75 72 6e 20 61 5b 78 26 37 5d 20 2b 20 79 20 2d  urn a[x&7] + y -
11df0 20 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   10;.}..#ifndef 
11e00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
11e10 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43  UALTABLE./*.** C
11e20 6f 6e 76 65 72 74 20 61 20 64 6f 75 62 6c 65 20  onvert a double 
11e30 28 61 73 20 72 65 63 65 69 76 65 64 20 66 72 6f  (as received fro
11e40 6d 20 78 42 65 73 74 49 6e 64 65 78 20 6f 66 20  m xBestIndex of 
11e50 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 29  a virtual table)
11e60 0a 2a 2a 20 69 6e 74 6f 20 61 20 57 68 65 72 65  .** into a Where
11e70 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  Cost.  In other 
11e80 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20 61  words, compute a
11e90 6e 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20  n approximation 
11ea0 66 6f 72 0a 2a 2a 20 31 30 2a 6c 6f 67 32 28 78  for.** 10*log2(x
11eb0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  )..*/.static Whe
11ec0 72 65 43 6f 73 74 20 77 68 65 72 65 43 6f 73 74  reCost whereCost
11ed0 46 72 6f 6d 44 6f 75 62 6c 65 28 64 6f 75 62 6c  FromDouble(doubl
11ee0 65 20 78 29 7b 0a 20 20 75 36 34 20 61 3b 0a 20  e x){.  u64 a;. 
11ef0 20 57 68 65 72 65 43 6f 73 74 20 65 3b 0a 20 20   WhereCost e;.  
11f00 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78  assert( sizeof(x
11f10 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 61  )==8 && sizeof(a
11f20 29 3d 3d 38 20 29 3b 0a 20 20 69 66 28 20 78 3c  )==8 );.  if( x<
11f30 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
11f40 20 69 66 28 20 78 3c 3d 32 30 30 30 30 30 30 30   if( x<=20000000
11f50 30 30 20 29 20 72 65 74 75 72 6e 20 77 68 65 72  00 ) return wher
11f60 65 43 6f 73 74 28 28 74 52 6f 77 63 6e 74 29 78  eCost((tRowcnt)x
11f70 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 2c 20  );.  memcpy(&a, 
11f80 26 78 2c 20 38 29 3b 0a 20 20 65 20 3d 20 28 61  &x, 8);.  e = (a
11f90 3e 3e 35 32 29 20 2d 20 31 30 32 32 3b 0a 20 20  >>52) - 1022;.  
11fa0 72 65 74 75 72 6e 20 65 2a 31 30 3b 0a 7d 0a 23  return e*10;.}.#
11fb0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11fc0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11fd0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  E */../*.** Esti
11fe0 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74  mate the logarit
11ff0 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  hm of the input 
12000 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e  value to base 2.
12010 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
12020 43 6f 73 74 20 65 73 74 4c 6f 67 28 57 68 65 72  Cost estLog(Wher
12030 65 43 6f 73 74 20 4e 29 7b 0a 20 20 57 68 65 72  eCost N){.  Wher
12040 65 43 6f 73 74 20 78 20 3d 20 77 68 65 72 65 43  eCost x = whereC
12050 6f 73 74 28 4e 29 3b 0a 20 20 72 65 74 75 72 6e  ost(N);.  return
12060 20 78 3e 33 33 20 3f 20 78 20 2d 20 33 33 20 3a   x>33 ? x - 33 :
12070 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f   0;.}../*.** Two
12080 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72   routines for pr
12090 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  inting the conte
120a0 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33  nt of an sqlite3
120b0 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73  _index_info.** s
120c0 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20  tructure.  Used 
120d0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
120e0 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20  debugging only. 
120f0 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53   If neither.** S
12100 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51  QLITE_TEST or SQ
12110 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64  LITE_DEBUG are d
12120 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  efined, then the
12130 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61  se routines.** a
12140 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69  re no-ops..*/.#i
12150 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
12160 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12170 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
12180 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
12190 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ED).static void 
121a0 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
121b0 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
121c0 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  nfo *p){.  int i
121d0 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
121e0 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74  WhereTrace ) ret
121f0 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
12200 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
12210 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
12220 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12230 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d    constraint[%d]
12240 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d  : col=%d termid=
12250 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64  %d op=%d usabled
12260 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
12270 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
12280 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75  straint[i].iColu
12290 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  mn,.       p->aC
122a0 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65  onstraint[i].iTe
122b0 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20  rmOffset,.      
122c0 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
122d0 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d  i].op,.       p-
122e0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
122f0 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66  usable);.  }.  f
12300 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72  or(i=0; i<p->nOr
12310 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
12320 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
12330 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25  ntf("  orderby[%
12340 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d  d]: col=%d desc=
12350 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
12360 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
12370 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  rBy[i].iColumn,.
12380 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
12390 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d  By[i].desc);.  }
123a0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  .}.static void T
123b0 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
123c0 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
123d0 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  nfo *p){.  int i
123e0 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
123f0 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74  WhereTrace ) ret
12400 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
12410 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
12420 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
12430 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12440 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67    usage[%d]: arg
12450 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c  vIdx=%d omit=%d\
12460 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
12470 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
12480 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
12490 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d  Index,.       p-
124a0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
124b0 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a  e[i].omit);.  }.
124c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
124d0 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25  intf("  idxNum=%
124e0 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29  d\n", p->idxNum)
124f0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
12500 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72  Printf("  idxStr
12510 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74  =%s\n", p->idxSt
12520 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  r);.  sqlite3Deb
12530 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65  ugPrintf("  orde
12540 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e  rByConsumed=%d\n
12550 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  ", p->orderByCon
12560 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  sumed);.  sqlite
12570 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
12580 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67  estimatedCost=%g
12590 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65  \n", p->estimate
125a0 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a  dCost);.}.#else.
125b0 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
125c0 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66  X_INPUTS(A).#def
125d0 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ine TRACE_IDX_OU
125e0 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a  TPUTS(A).#endif.
125f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12600 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
12610 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  NDEX./*.** Retur
12620 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48  n TRUE if the WH
12630 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
12640 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f  pTerm is of a fo
12650 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63  rm where it.** c
12660 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69 74  ould be used wit
12670 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63  h an index to ac
12680 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d  cess pSrc, assum
12690 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ing an appropria
126a0 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73  te.** index exis
126b0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
126c0 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  nt termCanDriveI
126d0 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65 72  ndex(.  WhereTer
126e0 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20  m *pTerm,       
126f0 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
12700 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63  clause term to c
12710 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74  heck */.  struct
12720 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
12730 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c  Src,     /* Tabl
12740 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  e we are trying 
12750 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42  to access */.  B
12760 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12780 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72   Tables in outer
12790 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f   loops of the jo
127a0 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  in */.){.  char 
127b0 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d  aff;.  if( pTerm
127c0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53  ->leftCursor!=pS
127d0 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65  rc->iCursor ) re
127e0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
127f0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
12800 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72 65  & WO_EQ)==0 ) re
12810 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
12820 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
12830 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  t & notReady)!=0
12840 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
12850 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  f( pTerm->u.left
12860 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
12870 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72  n 0;.  aff = pSr
12880 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  c->pTab->aCol[pT
12890 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
128a0 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69  n].affinity;.  i
128b0 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
128c0 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d  AffinityOk(pTerm
128d0 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20  ->pExpr, aff) ) 
128e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
128f0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
12900 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12910 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
12920 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  NDEX./*.** Gener
12930 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73  ate code to cons
12940 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20  truct the Index 
12950 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75  object for an au
12960 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a  tomatic index.**
12970 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74   and to set up t
12980 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62  he WhereLevel ob
12990 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74  ject pLevel so t
129a0 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hat the code gen
129b0 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20  erator.** makes 
129c0 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d  use of the autom
129d0 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  atic index..*/.s
129e0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74  tatic void const
129f0 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  ructAutomaticInd
12a00 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
12a10 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
12a20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
12a30 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
12a40 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
12a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12a60 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
12a70 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
12a80 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
12a90 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
12aa0 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68  e term to get th
12ab0 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a  e next index */.
12ac0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
12ad0 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
12ae0 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
12af0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
12b00 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  ailable */.  Whe
12b10 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
12b20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
12b30 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65  e new index here
12b40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f   */.){.  int nCo
12b50 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20  lumn;           
12b60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12b70 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
12b80 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64   constructed ind
12b90 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ex */.  WhereTer
12ba0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
12bb0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
12bc0 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
12bd0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
12be0 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b  ereTerm *pWCEnd;
12bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
12c00 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a   of pWC->a[] */.
12c10 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12c30 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20   Byte of memory 
12c40 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64 78 20  needed for pIdx 
12c50 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
12c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c70 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72   /* Object descr
12c80 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69  ibing the transi
12c90 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56  ent index */.  V
12ca0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
12cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
12cc0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
12cd0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
12ce0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
12cf0 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  rInit;          
12d00 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
12d10 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  of the initializ
12d20 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d  ation bypass jum
12d30 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  p */.  Table *pT
12d40 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
12d50 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
12d60 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
12d70 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
12d80 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  info;          /
12d90 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f  * Key informatio
12da0 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  n for the index 
12db0 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64 72  */   .  int addr
12dc0 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
12dd0 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
12de0 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f  e index fill loo
12df0 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  p */.  int regRe
12e00 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
12e10 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
12e20 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  olding an index 
12e30 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
12e40 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
12e50 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
12e60 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  n counter */.  i
12e70 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
12e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
12e90 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
12ea0 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20  int mxBitCol;   
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
12ec0 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e  aximum column in
12ed0 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a   pSrc->colUsed *
12ee0 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
12ef0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
12f00 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
12f10 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f  uence to on a co
12f20 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  lumn */.  WhereL
12f30 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
12f40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f        /* The Loo
12f50 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 42 69  p object */.  Bi
12f60 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20  tmask idxCols;  
12f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
12f80 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75  map of columns u
12f90 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  sed for indexing
12fa0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
12fb0 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  traCols;        
12fc0 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61    /* Bitmap of a
12fd0 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
12fe0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  s */.  const int
12ff0 20 6d 78 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20   mxConstraint = 
13000 31 30 3b 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e  10; /* Maximum n
13010 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61  umber of constra
13020 69 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65  ints */..  /* Ge
13030 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73  nerate code to s
13040 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65  kip over the cre
13050 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61  ation and initia
13060 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  lization of the.
13070 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69    ** transient i
13080 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20  ndex on 2nd and 
13090 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
130a0 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f  tions of the loo
130b0 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  p. */.  v = pPar
130c0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
130d0 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
130e0 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  ddrInit = sqlite
130f0 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
13100 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
13110 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
13120 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
13130 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
13140 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73  ndex.  ** and us
13150 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52  ed to match WHER
13160 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
13170 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d  ints */.  nColum
13180 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20  n = 0;.  pTable 
13190 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
131a0 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
131b0 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
131c0 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
131d0 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c  pWLoop;.  idxCol
131e0 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  s = 0;.  for(pTe
131f0 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
13200 3c 70 57 43 45 6e 64 20 26 26 20 70 4c 6f 6f 70  <pWCEnd && pLoop
13210 2d 3e 6e 4c 54 65 72 6d 3c 6d 78 43 6f 6e 73 74  ->nLTerm<mxConst
13220 72 61 69 6e 74 3b 20 70 54 65 72 6d 2b 2b 29 7b  raint; pTerm++){
13230 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
13240 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
13250 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
13260 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
13270 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
13280 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
13290 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
132a0 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
132b0 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
132c0 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
132d0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
132e0 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
132f0 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
13300 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69  BMS-1 );.      i
13310 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
13320 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
13330 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
13340 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
13350 62 2c 20 70 4c 6f 6f 70 2c 20 6e 43 6f 6c 75 6d  b, pLoop, nColum
13360 6e 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  n+1) ) return;. 
13370 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c         pLoop->aL
13380 54 65 72 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b 5d 20  Term[nColumn++] 
13390 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
133a0 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
133b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
133c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
133d0 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c  Column>0 );.  pL
133e0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
133f0 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d   = pLoop->nLTerm
13400 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4c   = nColumn;.  pL
13410 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
13420 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
13430 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
13440 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a  | WHERE_INDEXED.
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 20 20 20 20 20 7c 20 57 48 45 52 45 5f 54 45 4d       | WHERE_TEM
13470 50 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43  P_INDEX;..  /* C
13480 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
13490 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
134a0 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
134b0 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
134c0 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
134d0 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
134e0 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
134f0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
13500 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
13510 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
13520 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
13530 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
13540 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
13550 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
13560 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
13570 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
13580 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
13590 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
135a0 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
135b0 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
135c0 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
135d0 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
135e0 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
135f0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
13600 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
13610 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
13620 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
13630 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
13640 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
13650 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
13660 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54  dxCols | MASKBIT
13670 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69  (BMS-1));.  mxBi
13680 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d 3e  tCol = (pTable->
13690 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20 3f  nCol >= BMS-1) ?
136a0 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65 2d   BMS-1 : pTable-
136b0 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61 73  >nCol;.  testcas
136c0 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  e( pTable->nCol=
136d0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74  =BMS-1 );.  test
136e0 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
136f0 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66  ol==BMS-2 );.  f
13700 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43  or(i=0; i<mxBitC
13710 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
13720 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41  ( extraCols & MA
13730 53 4b 42 49 54 28 69 29 20 29 20 6e 43 6f 6c 75  SKBIT(i) ) nColu
13740 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  mn++;.  }.  if( 
13750 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
13760 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
13770 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d  {.    nColumn +=
13780 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20   pTable->nCol - 
13790 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 70  BMS + 1;.  }.  p
137a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
137b0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
137c0 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
137d0 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75  Y;..  /* Constru
137e0 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
137f0 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
13800 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
13810 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49  nByte = sizeof(I
13820 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20 2b  ndex);.  nByte +
13830 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
13840 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49 6e  (int);     /* In
13850 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f 0a  dex.aiColumn */.
13860 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
13870 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  mn*sizeof(char*)
13880 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43  ;   /* Index.azC
13890 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  oll */.  nByte +
138a0 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  = nColumn;      
138b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
138c0 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
138d0 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74  /.  pIdx = sqlit
138e0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
138f0 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65  Parse->db, nByte
13900 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
13910 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c 6f   ) return;.  pLo
13920 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
13930 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  ex = pIdx;.  pId
13940 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
13950 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20  r**)&pIdx[1];.  
13960 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
13970 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a   (int*)&pIdx->az
13980 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  Coll[nColumn];. 
13990 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
139a0 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e  r = (u8*)&pIdx->
139b0 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
139c0 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  ];.  pIdx->zName
139d0 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
139e0 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
139f0 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49   = nColumn;.  pI
13a00 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  dx->pTable = pTa
13a10 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  ble;.  n = 0;.  
13a20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
13a30 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
13a40 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
13a50 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
13a60 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
13a70 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
13a80 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
13a90 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
13aa0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
13ab0 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
13ac0 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
13ad0 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53  MS ? MASKBIT(BMS
13ae0 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43  -1) : MASKBIT(iC
13af0 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  ol);.      if( (
13b00 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
13b10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
13b20 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
13b30 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
13b40 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
13b50 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
13b60 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54  aiColumn[n] = pT
13b70 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
13b80 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  n;.        pColl
13b90 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
13ba0 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
13bb0 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
13bc0 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
13bd0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
13be0 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28  oll[n] = ALWAYS(
13bf0 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e  pColl) ? pColl->
13c00 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22  zName : "BINARY"
13c10 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
13c20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13c30 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29  .  assert( (u32)
13c40 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  n==pLoop->u.btre
13c50 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41  e.nEq );..  /* A
13c60 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  dd additional co
13c70 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
13c80 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74  make the automat
13c90 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20  ic index into.  
13ca0 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ** a covering in
13cb0 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  dex */.  for(i=0
13cc0 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
13cd0 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
13ce0 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
13cf0 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i) ){.      pIdx
13d00 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
13d10 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
13d20 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
13d30 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
13d40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
13d50 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
13d60 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
13d70 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d  {.    for(i=BMS-
13d80 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  1; i<pTable->nCo
13d90 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
13da0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
13db0 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
13dc0 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
13dd0 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
13de0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
13df0 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d  ssert( n==nColum
13e00 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n );..  /* Creat
13e10 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
13e20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69  index */.  pKeyi
13e30 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  nfo = sqlite3Ind
13e40 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
13e50 2c 20 70 49 64 78 29 3b 0a 20 20 61 73 73 65 72  , pIdx);.  asser
13e60 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
13e70 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65  ur>=0 );.  pLeve
13e80 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
13e90 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
13ea0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13eb0 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
13ec0 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
13ed0 64 78 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31  dxCur, nColumn+1
13ee0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
13ef0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
13f00 70 4b 65 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyinfo, P4_KEY
13f10 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
13f20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13f30 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c   "for %s", pTabl
13f40 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f  e->zName));..  /
13f50 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d  * Fill the autom
13f60 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68 20  atic index with 
13f70 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64  content */.  add
13f80 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
13f90 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
13fa0 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  ewind, pLevel->i
13fb0 54 61 62 43 75 72 29 3b 0a 20 20 72 65 67 52 65  TabCur);.  regRe
13fc0 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
13fd0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
13fe0 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ;.  sqlite3Gener
13ff0 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
14000 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c  se, pIdx, pLevel
14010 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65  ->iTabCur, regRe
14020 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69  cord, 1);.  sqli
14030 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14040 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
14050 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
14060 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
14070 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
14080 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
14090 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
140a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
140b0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76  v, OP_Next, pLev
140c0 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64  el->iTabCur, add
140d0 72 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74  rTop+1);.  sqlit
140e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
140f0 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
14100 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a  TUS_AUTOINDEX);.
14110 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
14120 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
14130 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
14140 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
14150 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
14160 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65   .  /* Jump here
14170 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74   when skipping t
14180 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
14190 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  n */.  sqlite3Vd
141a0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
141b0 64 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69  drInit);.}.#endi
141c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
141d0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
141e0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
141f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
14200 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
14210 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
14220 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
14230 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14240 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
14250 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
14260 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
14270 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
14280 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
14290 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
142a0 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
142b0 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
142c0 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
142d0 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
142e0 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
142f0 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
14300 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73  ndexInfo(.  Pars
14310 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65  e *pParse,.  Whe
14320 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
14330 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
14340 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78  item *pSrc,.  Ex
14350 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
14360 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
14370 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73    int nTerm;.  s
14380 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
14390 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
143a0 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
143b0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
143c0 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
143d0 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
143e0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
143f0 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
14400 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54  pUsage;.  WhereT
14410 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
14420 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71  t nOrderBy;.  sq
14430 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
14440 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f   *pIdxInfo;..  /
14450 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
14460 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  er of possible W
14470 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
14480 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e  traints referrin
14490 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76  g.  ** to this v
144a0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
144b0 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c    for(i=nTerm=0,
144c0 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
144d0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
144e0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
144f0 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
14500 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
14510 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
14520 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
14530 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
14540 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
14550 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
14560 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
14570 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
14580 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
14590 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
145a0 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
145b0 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  L );.    if( pTe
145c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
145d0 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  (WO_ISNULL) ) co
145e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
145f0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
14600 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
14610 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72  ntinue;.    nTer
14620 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  m++;.  }..  /* I
14630 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
14640 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f  lause contains o
14650 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  nly columns in t
14660 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a  he current .  **
14670 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
14680 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  hen allocate spa
14690 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65  ce for the aOrde
146a0 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a  rBy part of.  **
146b0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
146c0 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
146d0 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72  e..  */.  nOrder
146e0 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f  By = 0;.  if( pO
146f0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
14700 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  t n = pOrderBy->
14710 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
14720 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
14730 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
14740 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
14750 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
14760 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
14770 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
14780 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  ->iTable!=pSrc->
14790 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
147a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
147b0 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64  ==n){.      nOrd
147c0 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  erBy = n;.    }.
147d0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
147e0 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
147f0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
14800 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
14810 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
14820 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
14830 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
14840 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
14870 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
14880 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
14890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
148a0 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
148b0 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
148c0 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20  y)*nOrderBy );. 
148d0 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
148e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
148f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14900 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
14910 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
14920 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
14930 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75  lize the structu
14940 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  re.  The sqlite3
14950 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
14960 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20  cture contains. 
14970 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20   ** many fields 
14980 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65  that are declare
14990 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65  d "const" to pre
149a0 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20  vent xBestIndex 
149b0 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69  from.  ** changi
149c0 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76  ng them.  We hav
149d0 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e  e to do some fun
149e0 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72  ky casting in or
149f0 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74  der to.  ** init
14a00 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65  ialize those fie
14a10 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  lds..  */.  pIdx
14a20 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73  Cons = (struct s
14a30 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
14a40 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e  straint*)&pIdxIn
14a50 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64  fo[1];.  pIdxOrd
14a60 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73  erBy = (struct s
14a70 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
14a80 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b  erby*)&pIdxCons[
14a90 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65  nTerm];.  pUsage
14aa0 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
14ab0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14ac0 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78  int_usage*)&pIdx
14ad0 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79  OrderBy[nOrderBy
14ae0 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  ];.  *(int*)&pId
14af0 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
14b00 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28  nt = nTerm;.  *(
14b10 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
14b20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
14b30 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
14b40 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
14b50 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
14b60 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
14b70 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20  t = pIdxCons;.  
14b80 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
14b90 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a  _index_orderby**
14ba0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  )&pIdxInfo->aOrd
14bb0 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72  erBy = pIdxOrder
14bc0 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
14bd0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
14be0 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29  straint_usage**)
14bf0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
14c00 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20  traintUsage =.  
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c50 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28   pUsage;..  for(
14c60 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
14c70 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
14c80 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
14c90 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20  {.    u8 op;.   
14ca0 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
14cb0 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
14cc0 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
14cd0 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
14ce0 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
14cf0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
14d00 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
14d10 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
14d20 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
14d30 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
14d40 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
14d50 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
14d60 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  LL );.    if( pT
14d70 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
14d80 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63   (WO_ISNULL) ) c
14d90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
14da0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
14db0 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
14dc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64  ontinue;.    pId
14dd0 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e  xCons[j].iColumn
14de0 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
14df0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
14e00 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  Cons[j].iTermOff
14e10 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20  set = i;.    op 
14e20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70  = (u8)pTerm->eOp
14e30 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b  erator & WO_ALL;
14e40 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f  .    if( op==WO_
14e50 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b  IN ) op = WO_EQ;
14e60 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
14e70 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a  .op = op;.    /*
14e80 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69   The direct assi
14e90 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72  gnment in the pr
14ea0 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70  evious line is p
14eb0 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63  ossible only bec
14ec0 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
14ed0 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  WO_ and SQLITE_I
14ee0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
14ef0 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74   codes are ident
14f00 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a  ical.  The.    *
14f10 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  * following asse
14f20 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20  rts verify this 
14f30 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73  fact. */.    ass
14f40 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49  ert( WO_EQ==SQLI
14f50 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
14f60 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  INT_EQ );.    as
14f70 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c  sert( WO_LT==SQL
14f80 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
14f90 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61  AINT_LT );.    a
14fa0 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
14fb0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
14fc0 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
14fd0 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53  assert( WO_GT==S
14fe0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
14ff0 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20  TRAINT_GT );.   
15000 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d   assert( WO_GE==
15010 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
15020 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20  STRAINT_GE );.  
15030 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54    assert( WO_MAT
15040 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  CH==SQLITE_INDEX
15050 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
15060 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  H );.    assert(
15070 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
15080 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51  r & (WO_IN|WO_EQ
15090 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
150a0 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43  GT|WO_GE|WO_MATC
150b0 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20  H) );.    j++;. 
150c0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
150d0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
150e0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
150f0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
15100 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78  .pExpr;.    pIdx
15110 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
15120 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
15130 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  umn;.    pIdxOrd
15140 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70  erBy[i].desc = p
15150 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
15160 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
15170 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b  return pIdxInfo;
15180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61  .}../*.** The ta
15190 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72  ble object refer
151a0 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74  ence passed as t
151b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
151c0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
151d0 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72  ion.** must repr
151e0 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20  esent a virtual 
151f0 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63  table. This func
15200 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65  tion invokes the
15210 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a   xBestIndex().**
15220 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76   method of the v
15230 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74  irtual table wit
15240 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  h the sqlite3_in
15250 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20  dex_info object 
15260 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e  that.** comes in
15270 20 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75   as the 3rd argu
15280 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
15290 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
152a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
152b0 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c   pParse is popul
152c0 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  ated with an err
152d0 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61  or message and a
152e0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
152f0 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ue is returned. 
15300 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
15310 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
15320 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20   output.** part 
15330 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
15340 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
15350 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75  ure is left popu
15360 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  lated..**.** Whe
15370 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65  ther or not an e
15380 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
15390 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
153a0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
153b0 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
153c0 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70  ventually free p
153d0 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e  ->idxStr if p->n
153e0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
153f0 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61  indicates.** tha
15400 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72  t this is requir
15410 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
15420 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  t vtabBestIndex(
15430 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
15440 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69  able *pTab, sqli
15450 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
15460 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  p){.  sqlite3_vt
15470 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69  ab *pVtab = sqli
15480 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61  te3GetVTable(pPa
15490 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e  rse->db, pTab)->
154a0 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVtab;.  int i;.
154b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41    int rc;..  TRA
154c0 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29  CE_IDX_INPUTS(p)
154d0 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
154e0 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
154f0 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20  dex(pVtab, p);. 
15500 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
15510 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  TS(p);..  if( rc
15520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15530 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15540 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
15550 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
15560 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
15570 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56     }else if( !pV
15580 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  tab->zErrMsg ){.
15590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
155a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
155b0 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
155c0 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  r(rc));.    }els
155d0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
155e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
155f0 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45   "%s", pVtab->zE
15600 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
15610 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
15620 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
15630 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
15640 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  sg = 0;..  for(i
15650 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
15660 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
15670 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61  if( !p->aConstra
15680 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26  int[i].usable &&
15690 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
156a0 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
156b0 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x>0 ){.      sql
156c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
156d0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
156e0 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74  "table %s: xBest
156f0 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61  Index returned a
15700 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c  n invalid plan",
15710 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
15720 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
15730 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  rn pParse->nErr;
15740 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
15750 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15760 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
15770 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  */...#ifdef SQLI
15780 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
15790 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
157a0 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61  he location of a
157b0 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20   particular key 
157c0 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69  among all keys i
157d0 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  n an.** index.  
157e0 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
157f0 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f  s in aStat as fo
15800 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
15810 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73  aStat[0]      Es
15820 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
15830 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c  s less than pVal
15840 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  .**    aStat[1] 
15850 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
15860 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74   of rows equal t
15870 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74  o pVal.**.** Ret
15880 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
15890 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
158a0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79  tic int whereKey
158b0 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a  Stats(.  Parse *
158c0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
158d0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
158e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
158f0 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15910 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65  Index to conside
15920 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20  r domain of */. 
15930 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
15940 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  pVal,        /* 
15950 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65  Value to conside
15960 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
15970 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
15980 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
15990 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
159a0 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
159b0 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
159d0 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
159e0 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
159f0 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e   tRowcnt n;.  In
15a00 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70  dexSample *aSamp
15a10 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54 79  le;.  int i, eTy
15a20 70 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d  pe;.  int isEq =
15a30 20 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 64   0;.  i64 v;.  d
15a40 6f 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20  ouble r, rS;..  
15a50 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d  assert( roundUp=
15a60 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31  =0 || roundUp==1
15a70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
15a80 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b  dx->nSample>0 );
15a90 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29  .  if( pVal==0 )
15aa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
15ab0 52 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78  RROR;.  n = pIdx
15ac0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
15ad0 20 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d   aSample = pIdx-
15ae0 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70  >aSample;.  eTyp
15af0 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
15b00 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20  e_type(pVal);.. 
15b10 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
15b20 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TE_INTEGER ){.  
15b30 20 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    v = sqlite3_va
15b40 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b  lue_int64(pVal);
15b50 0a 20 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b  .    r = (i64)v;
15b60 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15b70 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69  pIdx->nSample; i
15b80 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
15b90 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
15ba0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63  =SQLITE_NULL ) c
15bb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
15bc0 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
15bd0 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype>=SQLITE_TEXT
15be0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
15bf0 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
15c00 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  Type==SQLITE_INT
15c10 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
15c20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  if( aSample[i].u
15c30 2e 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20  .i>=v ){.       
15c40 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c     isEq = aSampl
15c50 65 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20  e[i].u.i==v;.   
15c60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
15c80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
15c90 65 72 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ert( aSample[i].
15ca0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
15cb0 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69  OAT );.        i
15cc0 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  f( aSample[i].u.
15cd0 72 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=r ){.        
15ce0 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65    isEq = aSample
15cf0 5b 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20  [i].u.r==r;.    
15d00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15d20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
15d30 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46   eType==SQLITE_F
15d40 4c 4f 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20  LOAT ){.    r = 
15d50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
15d60 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20  uble(pVal);.    
15d70 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
15d80 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
15d90 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
15da0 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[i].eType==SQLI
15db0 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  TE_NULL ) contin
15dc0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  ue;.      if( aS
15dd0 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d  ample[i].eType>=
15de0 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72  SQLITE_TEXT ) br
15df0 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61  eak;.      if( a
15e00 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
15e10 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b  =SQLITE_FLOAT ){
15e20 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20 61 53  .        rS = aS
15e30 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20  ample[i].u.r;.  
15e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15e50 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b     rS = aSample[
15e60 69 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a  i].u.i;.      }.
15e70 20 20 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20        if( rS>=r 
15e80 29 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71 20  ){.        isEq 
15e90 3d 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20  = rS==r;.       
15ea0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15eb0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
15ec0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
15ed0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20  NULL ){.    i = 
15ee0 30 3b 0a 20 20 20 20 69 66 28 20 61 53 61 6d 70  0;.    if( aSamp
15ef0 6c 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[0].eType==SQL
15f00 49 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20  ITE_NULL ) isEq 
15f10 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
15f20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
15f30 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20  =SQLITE_TEXT || 
15f40 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
15f50 4f 42 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  OB );.    for(i=
15f60 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  0; i<pIdx->nSamp
15f70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
15f80 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
15f90 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
15fa0 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  T || aSample[i].
15fb0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
15fc0 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  OB ){.        br
15fd0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
15fe0 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64   }.    if( i<pId
15ff0 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20  x->nSample ){   
16000 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65     .      sqlite
16010 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
16020 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  db;.      CollSe
16030 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
16040 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20  const u8 *z;.   
16050 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
16060 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
16070 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20       z = (const 
16080 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  u8 *)sqlite3_val
16090 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20  ue_blob(pVal);. 
160a0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64         pColl = d
160b0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
160c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
160d0 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  oll->enc==SQLITE
160e0 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d  _UTF8 );.      }
160f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
16100 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
16110 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
16120 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
16130 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a  *pIdx->azColl);.
16140 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
16150 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
16160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16170 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
16180 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f  .        z = (co
16190 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33  nst u8 *)sqlite3
161a0 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20  ValueText(pVal, 
161b0 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
161c0 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20       if( !z ){. 
161d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
161e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
161f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16200 61 73 73 65 72 74 28 20 7a 20 26 26 20 70 43 6f  assert( z && pCo
16210 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll && pColl->xCm
16220 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p );.      }.   
16230 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56 61     n = sqlite3Va
16240 6c 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20 70  lueBytes(pVal, p
16250 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 0a 20  Coll->enc);.  . 
16260 20 20 20 20 20 66 6f 72 28 3b 20 69 3c 70 49 64       for(; i<pId
16270 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29  x->nSample; i++)
16280 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  {.        int c;
16290 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 53 61  .        int eSa
162a0 6d 70 6c 65 74 79 70 65 20 3d 20 61 53 61 6d 70  mpletype = aSamp
162b0 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20 20  le[i].eType;.   
162c0 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65       if( eSample
162d0 74 79 70 65 3c 65 54 79 70 65 20 29 20 63 6f 6e  type<eType ) con
162e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
162f0 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65 21 3d  f( eSampletype!=
16300 65 54 79 70 65 20 29 20 62 72 65 61 6b 3b 0a 23  eType ) break;.#
16310 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16320 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 20 20  IT_UTF16.       
16330 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21   if( pColl->enc!
16340 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a  =SQLITE_UTF8 ){.
16350 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53            int nS
16360 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  ample;.         
16370 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20 3d   char *zSample =
16380 20 73 71 6c 69 74 65 33 55 74 66 38 74 6f 31 36   sqlite3Utf8to16
16390 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
163a0 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20  db, pColl->enc, 
163b0 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20  aSample[i].u.z, 
163c0 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65  aSample[i].nByte
163d0 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20  , &nSample.     
163e0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
163f0 20 20 69 66 28 20 21 7a 53 61 6d 70 6c 65 20 29    if( !zSample )
16400 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
16410 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
16420 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
16430 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16440 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
16450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16460 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70   c = pColl->xCmp
16470 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e  (pColl->pUser, n
16480 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c  Sample, zSample,
16490 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20   n, z);.        
164a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
164b0 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20 20  db, zSample);.  
164c0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
164d0 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
164e0 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c         c = pColl
164f0 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
16500 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ser, aSample[i].
16510 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b 69  nByte, aSample[i
16520 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20  ].u.z, n, z);.  
16530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16540 69 66 28 20 63 3e 3d 30 20 29 7b 0a 20 20 20 20  if( c>=0 ){.    
16550 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
16560 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 20 20 20   isEq = 1;.     
16570 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16580 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16590 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74    }.  }..  /* At
165a0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53 61   this point, aSa
165b0 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20 66  mple[i] is the f
165c0 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74  irst sample that
165d0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
165e0 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74  .  ** or equal t
165f0 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20 69  o pVal.  Or if i
16600 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c  ==pIdx->nSample,
16610 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c 65   then all sample
16620 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a 20  s are less.  ** 
16630 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20 61  than pVal.  If a
16640 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c  Sample[i]==pVal,
16650 20 74 68 65 6e 20 69 73 45 71 3d 3d 31 2e 0a 20   then isEq==1.. 
16660 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 71 20 29   */.  if( isEq )
16670 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
16680 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b  pIdx->nSample );
16690 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
166a0 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a  aSample[i].nLt;.
166b0 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61      aStat[1] = a
166c0 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45 71 3b 0a 20  Sample[i].nEq;. 
166d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f 77   }else{.    tRow
166e0 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70  cnt iLower, iUpp
166f0 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66  er, iGap;.    if
16700 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
16710 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
16720 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70    iUpper = aSamp
16730 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d  le[0].nLt;.    }
16740 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70  else{.      iUpp
16750 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53  er = i>=pIdx->nS
16760 61 6d 70 6c 65 20 3f 20 6e 20 3a 20 61 53 61 6d  ample ? n : aSam
16770 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20  ple[i].nLt;.    
16780 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70    iLower = aSamp
16790 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20 2b 20 61 53  le[i-1].nEq + aS
167a0 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 4c 74 3b 0a  ample[i-1].nLt;.
167b0 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b      }.    aStat[
167c0 31 5d 20 3d 20 70 49 64 78 2d 3e 61 76 67 45 71  1] = pIdx->avgEq
167d0 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72  ;.    if( iLower
167e0 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20  >=iUpper ){.    
167f0 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20    iGap = 0;.    
16800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
16810 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f  p = iUpper - iLo
16820 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  wer;.    }.    i
16830 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20  f( roundUp ){.  
16840 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70      iGap = (iGap
16850 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65  *2)/3;.    }else
16860 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
16870 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20  Gap/3;.    }.   
16880 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77   aStat[0] = iLow
16890 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 20  er + iGap;.  }. 
168a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
168b0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
168c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
168d0 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  T3 */../*.** If 
168e0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
168f0 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69   represents a li
16900 74 65 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74  teral value, set
16910 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f   *pp to point to
16920 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  .** an sqlite3_v
16930 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
16940 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61  ontaining the sa
16950 6d 65 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61  me value, with a
16960 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61  ffinity.** aff a
16970 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65  pplied to it, be
16980 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
16990 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
169a0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
169b0 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
169c0 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
169d0 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
169e0 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f  by passing it to
169f0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75   .** sqlite3Valu
16a00 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  eFree()..**.** I
16a10 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  f the current pa
16a20 72 73 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69  rse is a recompi
16a30 6c 65 20 28 73 71 6c 69 74 65 33 52 65 70 72 65  le (sqlite3Repre
16a40 70 61 72 65 28 29 29 20 61 6e 64 20 70 45 78 70  pare()) and pExp
16a50 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76  r.** is an SQL v
16a60 61 72 69 61 62 6c 65 20 74 68 61 74 20 63 75 72  ariable that cur
16a70 72 65 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e  rently has a non
16a80 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e  -NULL value boun
16a90 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61  d to it,.** crea
16aa0 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  te an sqlite3_va
16ab0 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
16ac0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61  ntaining this va
16ad0 6c 75 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a  lue, again with.
16ae0 2a 2a 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ** affinity aff 
16af0 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69  applied to it, i
16b00 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
16b10 20 6e 65 69 74 68 65 72 20 6f 66 20 74 68 65 20   neither of the 
16b20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74  above apply, set
16b30 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   *pp to NULL..**
16b40 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
16b50 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
16b60 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
16b70 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
16b80 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  OK..*/.#ifdef SQ
16b90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
16ba0 33 0a 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c  3.static int val
16bb0 75 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61  ueFromExpr(.  Pa
16bc0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
16bd0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20  Expr *pExpr, .  
16be0 75 38 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74  u8 aff, .  sqlit
16bf0 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b  e3_value **pp.){
16c00 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
16c10 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20  ==TK_VARIABLE.  
16c20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d   || (pExpr->op==
16c30 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
16c40 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41  Expr->op2==TK_VA
16c50 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20 20  RIABLE).  ){.   
16c60 20 69 6e 74 20 69 56 61 72 20 3d 20 70 45 78 70   int iVar = pExp
16c70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
16c80 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
16c90 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
16ca0 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20  dbe, iVar);.    
16cb0 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  *pp = sqlite3Vdb
16cc0 65 47 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eGetValue(pParse
16cd0 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69 56  ->pReprepare, iV
16ce0 61 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 72 65  ar, aff);.    re
16cf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16d00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
16d10 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70  ite3ValueFromExp
16d20 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  r(pParse->db, pE
16d30 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  xpr, SQLITE_UTF8
16d40 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65  , aff, pp);.}.#e
16d50 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
16d60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
16d70 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  d to estimate th
16d80 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
16d90 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69   that will be vi
16da0 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e  sited.** by scan
16db0 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f  ning an index fo
16dc0 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c  r a range of val
16dd0 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d  ues. The range m
16de0 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72  ay have an upper
16df0 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77  .** bound, a low
16e00 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74  er bound, or bot
16e10 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  h. The WHERE cla
16e20 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73  use terms that s
16e30 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20  et the upper.** 
16e40 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73  and lower bounds
16e50 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64   are represented
16e60 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70   by pLower and p
16e70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65  Upper respective
16e80 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  ly. For.** examp
16e90 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  le, assuming tha
16ea0 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  t index p is on 
16eb0 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  t1(a):.**.**   .
16ec0 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
16ed0 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
16ee0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
16ef0 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f             |____
16f00 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20  _|   |_____|.** 
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16f30 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
16f40 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
16f50 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20     pUpper.**.** 
16f60 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
16f70 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20   upper or lower 
16f80 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65  bound is not pre
16f90 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20  sent, then NULL 
16fa0 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20  is passed in.** 
16fb0 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72  place of the cor
16fc0 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
16fd0 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Term..**.** The 
16fe0 6e 45 71 20 70 61 72 61 6d 65 74 65 72 20 69 73  nEq parameter is
16ff0 20 70 61 73 73 65 64 20 74 68 65 20 69 6e 64 65   passed the inde
17000 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63  x of the index c
17010 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f  olumn subject to
17020 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f   the.** range co
17030 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71  nstraint. Or, eq
17040 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20  uivalently, the 
17050 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  number of equali
17060 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ty constraints.*
17070 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74  * optimized by t
17080 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65  he proposed inde
17090 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d  x scan. For exam
170a0 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e  ple, assuming in
170b0 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74  dex p is.** on t
170c0 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65  1(a, b), and the
170d0 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a   SQL query is:.*
170e0 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
170f0 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41  t1 WHERE a = ? A
17100 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c  ND b > ? AND b <
17110 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
17120 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20  n nEq should be 
17130 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65  passed the value
17140 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65   1 (as the range
17150 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75   restricted colu
17160 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65  mn,.** b, is the
17170 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73   second left-mos
17180 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
17190 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74  index). Or, if t
171a0 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  he query is:.**.
171b0 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
171c0 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
171d0 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   a < ? ....**.**
171e0 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64   then nEq should
171f0 20 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a   be passed 0..**
17200 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
17210 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74   value is an int
17220 65 67 65 72 20 64 69 76 69 73 6f 72 20 74 6f 20  eger divisor to 
17230 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69 6d  reduce the estim
17240 61 74 65 64 0a 2a 2a 20 73 65 61 72 63 68 20 73  ated.** search s
17250 70 61 63 65 2e 20 20 41 20 72 65 74 75 72 6e 20  pace.  A return 
17260 76 61 6c 75 65 20 6f 66 20 31 20 6d 65 61 6e 73  value of 1 means
17270 20 74 68 61 74 20 72 61 6e 67 65 20 63 6f 6e 73   that range cons
17280 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 6e  traints are.** n
17290 6f 20 68 65 6c 70 20 61 74 20 61 6c 6c 2e 20 20  o help at all.  
172a0 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  A return value o
172b0 66 20 32 20 6d 65 61 6e 73 20 72 61 6e 67 65 20  f 2 means range 
172c0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a  constraints are.
172d0 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 72  ** expected to r
172e0 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
172f0 20 73 70 61 63 65 20 62 79 20 68 61 6c 66 2e 20   space by half. 
17300 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 2e 2e   And so forth...
17310 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  .**.** In the ab
17320 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f  sence of sqlite_
17330 73 74 61 74 33 20 41 4e 41 4c 59 5a 45 20 64 61  stat3 ANALYZE da
17340 74 61 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69  ta, each range i
17350 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64  nequality.** red
17360 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
17370 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f  space by a facto
17380 72 20 6f 66 20 34 2e 20 20 48 65 6e 63 65 20 61  r of 4.  Hence a
17390 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
173a0 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75  nt (x>?).** resu
173b0 6c 74 73 20 69 6e 20 61 20 72 65 74 75 72 6e 20  lts in a return 
173c0 6f 66 20 34 20 61 6e 64 20 61 20 72 61 6e 67 65  of 4 and a range
173d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f   constraint (x>?
173e0 20 41 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c 74   AND x<?) result
173f0 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75 72 6e  s.** in a return
17400 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74 69   of 16..*/.stati
17410 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
17420 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
17430 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
17440 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
17450 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
17460 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
17470 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
17480 2a 20 54 68 65 20 69 6e 64 65 78 20 63 6f 6e 74  * The index cont
17490 61 69 6e 69 6e 67 20 74 68 65 20 72 61 6e 67 65  aining the range
174a0 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e  -compared column
174b0 3b 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e  ; "x" */.  int n
174c0 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq,             
174d0 2f 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d  /* index into p-
174e0 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72  >aCol[] of the r
174f0 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f  ange-compared co
17500 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  lumn */.  WhereT
17510 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
17520 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
17530 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
17540 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
17550 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
17560 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
17570 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
17580 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
17590 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
175a0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
175b0 65 43 6f 73 74 20 2a 70 52 61 6e 67 65 44 69 76  eCost *pRangeDiv
175c0 20 2f 2a 20 4f 55 54 3a 20 52 65 64 75 63 65 20   /* OUT: Reduce 
175d0 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
175e0 74 68 69 73 20 64 69 76 69 73 6f 72 20 2a 2f 0a  this divisor */.
175f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
17600 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66  LITE_OK;..#ifdef
17610 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
17620 54 41 54 33 0a 0a 20 20 69 66 28 20 6e 45 71 3d  TAT3..  if( nEq=
17630 3d 30 20 26 26 20 70 2d 3e 6e 53 61 6d 70 6c 65  =0 && p->nSample
17640 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
17650 76 61 6c 75 65 20 2a 70 52 61 6e 67 65 56 61 6c  value *pRangeVal
17660 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c  ;.    tRowcnt iL
17670 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 74 52  ower = 0;.    tR
17680 6f 77 63 6e 74 20 69 55 70 70 65 72 20 3d 20 70  owcnt iUpper = p
17690 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
176a0 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b     tRowcnt a[2];
176b0 0a 20 20 20 20 75 38 20 61 66 66 20 3d 20 70 2d  .    u8 aff = p-
176c0 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
176d0 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66  >aiColumn[0]].af
176e0 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66 28  finity;..    if(
176f0 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20   pLower ){.     
17700 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
17710 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
17720 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  ight;.      rc =
17730 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70   valueFromExpr(p
17740 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66  Parse, pExpr, af
17750 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a  f, &pRangeVal);.
17760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
17770 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
17780 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29   & (WO_GT|WO_GE)
17790 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
177a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
177b0 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65 4b         && whereK
177c0 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
177d0 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 30 2c  p, pRangeVal, 0,
177e0 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   a)==SQLITE_OK. 
177f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
17800 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iLower = a[0];. 
17810 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 77         if( (pLow
17820 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
17830 57 4f 5f 47 54 29 21 3d 30 20 29 20 69 4c 6f 77  WO_GT)!=0 ) iLow
17840 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  er += a[1];.    
17850 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
17860 33 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67  3ValueFree(pRang
17870 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eVal);.    }.   
17880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17890 4f 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a  OK && pUpper ){.
178a0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
178b0 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70  r = pUpper->pExp
178c0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
178d0 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45   rc = valueFromE
178e0 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
178f0 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56  r, aff, &pRangeV
17900 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
17910 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65  t( (pUpper->eOpe
17920 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
17930 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20  O_LE))!=0 );.   
17940 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17950 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77  E_OK.       && w
17960 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
17970 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61  rse, p, pRangeVa
17980 6c 2c 20 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45  l, 1, a)==SQLITE
17990 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  _OK.      ){.   
179a0 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b       iUpper = a[
179b0 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
179c0 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
179d0 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29  or & WO_LE)!=0 )
179e0 20 69 55 70 70 65 72 20 2b 3d 20 61 5b 31 5d 3b   iUpper += a[1];
179f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17a00 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
17a10 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20  pRangeVal);.    
17a20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
17a30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17a40 20 57 68 65 72 65 43 6f 73 74 20 69 42 61 73 65   WhereCost iBase
17a50 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70 2d 3e   = whereCost(p->
17a60 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b 0a 20 20  aiRowEst[0]);.  
17a70 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69      if( iUpper>i
17a80 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Lower ){.       
17a90 20 69 42 61 73 65 20 2d 3d 20 77 68 65 72 65 43   iBase -= whereC
17aa0 6f 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f  ost(iUpper - iLo
17ab0 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  wer);.      }.  
17ac0 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d      *pRangeDiv =
17ad0 20 69 42 61 73 65 3b 0a 20 20 20 20 20 20 57 48   iBase;.      WH
17ae0 45 52 45 54 52 41 43 45 28 30 78 31 30 30 2c 20  ERETRACE(0x100, 
17af0 28 22 72 61 6e 67 65 20 73 63 61 6e 20 72 65 67  ("range scan reg
17b00 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64 69  ions: %u..%u  di
17b10 76 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  v=%d\n",.       
17b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b30 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28    (u32)iLower, (
17b40 75 33 32 29 69 55 70 70 65 72 2c 20 2a 70 52 61  u32)iUpper, *pRa
17b50 6e 67 65 44 69 76 29 29 3b 0a 20 20 20 20 20 20  ngeDiv));.      
17b60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17b70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
17b80 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
17b90 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20  ETER(pParse);.  
17ba0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
17bb0 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  (p);.  UNUSED_PA
17bc0 52 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23 65  RAMETER(nEq);.#e
17bd0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
17be0 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20  Lower || pUpper 
17bf0 29 3b 0a 20 20 2a 70 52 61 6e 67 65 44 69 76 20  );.  *pRangeDiv 
17c00 3d 20 30 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  = 0;.  /* TUNING
17c10 3a 20 20 45 61 63 68 20 69 6e 65 71 75 61 6c 69  :  Each inequali
17c20 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65  ty constraint re
17c30 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
17c40 20 73 70 61 63 65 20 34 2d 66 6f 6c 64 2e 0a 20   space 4-fold.. 
17c50 20 2a 2a 20 41 20 42 45 54 57 45 45 4e 20 6f 70   ** A BETWEEN op
17c60 65 72 61 74 6f 72 2c 20 74 68 65 72 65 66 6f 72  erator, therefor
17c70 65 2c 20 72 65 64 75 63 65 73 20 74 68 65 20 73  e, reduces the s
17c80 65 61 72 63 68 20 73 70 61 63 65 20 31 36 2d 66  earch space 16-f
17c90 6f 6c 64 20 2a 2f 0a 20 20 69 66 28 20 70 4c 6f  old */.  if( pLo
17ca0 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e  wer && (pLower->
17cb0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
17cc0 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
17cd0 2a 70 52 61 6e 67 65 44 69 76 20 2b 3d 20 32 30  *pRangeDiv += 20
17ce0 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 77  ;  assert( 20==w
17cf0 68 65 72 65 43 6f 73 74 28 34 29 20 29 3b 0a 20  hereCost(4) );. 
17d00 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20   }.  if( pUpper 
17d10 29 7b 0a 20 20 20 20 2a 70 52 61 6e 67 65 44 69  ){.    *pRangeDi
17d20 76 20 2b 3d 20 32 30 3b 20 20 61 73 73 65 72 74  v += 20;  assert
17d30 28 20 32 30 3d 3d 77 68 65 72 65 43 6f 73 74 28  ( 20==whereCost(
17d40 34 29 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  4) );.  }.  retu
17d50 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
17d60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
17d70 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT3./*.** Estim
17d80 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
17d90 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
17da0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
17db0 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61  ed on.** an equa
17dc0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
17dd0 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72  x=VALUE and wher
17de0 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63  e that VALUE occ
17df0 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69  urs in.** the hi
17e00 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54  stogram data.  T
17e10 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77  his only works w
17e20 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66  hen x is the lef
17e30 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  t-most.** column
17e40 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64   of an index and
17e50 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69   sqlite_stat3 hi
17e60 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20  stogram data is 
17e70 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72  available.** for
17e80 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68   that index.  Wh
17e90 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74  en pExpr==NULL t
17ea0 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  hat means the co
17eb0 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22  nstraint is.** "
17ec0 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65  x IS NULL" inste
17ed0 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e  ad of "x=VALUE".
17ee0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
17ef0 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63   estimated row c
17f00 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77  ount into *pnRow
17f10 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
17f20 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e  TE_OK. .** If un
17f30 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20  able to make an 
17f40 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20  estimate, leave 
17f50 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64  *pnRow unchanged
17f60 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
17f70 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  on-zero..**.** T
17f80 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
17f90 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e  fail if it is un
17fa0 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63  able to load a c
17fb0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
17fc0 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f  e.** required fo
17fd0 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69  r string compari
17fe0 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c  son, or if unabl
17ff0 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
18000 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54  mory.** for a UT
18010 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71  F conversion req
18020 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72  uired for compar
18030 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  ison.  The error
18040 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   is stored.** in
18050 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
18060 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
18070 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53   int whereEqualS
18080 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
18090 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
180a0 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
180b0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
180c0 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
180d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
180e0 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
180f0 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
18100 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20  n is pTerm */.  
18110 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
18120 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
18130 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20  on for VALUE in 
18140 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73  the x=VALUE cons
18150 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77  traint */.  tRow
18160 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20  cnt *pnRow      
18170 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
18180 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61  vised row estima
18190 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  te here */.){.  
181a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
181b0 52 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56 41 4c  Rhs = 0;  /* VAL
181c0 55 45 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64  UE on right-hand
181d0 20 73 69 64 65 20 6f 66 20 70 54 65 72 6d 20 2a   side of pTerm *
181e0 2f 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20  /.  u8 aff;     
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18200 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   Column affinity
18210 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
18240 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
18250 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20  tRowcnt a[2];   
18260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
18270 74 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73  tistics */..  as
18280 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
18290 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
182a0 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
182b0 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  .  aff = p->pTab
182c0 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
182d0 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74  lumn[0]].affinit
182e0 79 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  y;.  if( pExpr )
182f0 7b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65  {.    rc = value
18300 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
18310 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52   pExpr, aff, &pR
18320 68 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  hs);.    if( rc 
18330 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61  ) goto whereEqua
18340 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b  lScanEst_cancel;
18350 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
18360 68 73 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  hs = sqlite3Valu
18370 65 4e 65 77 28 70 50 61 72 73 65 2d 3e 64 62 29  eNew(pParse->db)
18380 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 68 73  ;.  }.  if( pRhs
18390 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
183a0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
183b0 72 63 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61  rc = whereKeySta
183c0 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
183d0 68 73 2c 20 30 2c 20 61 29 3b 0a 20 20 69 66 28  hs, 0, a);.  if(
183e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
183f0 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  {.    WHERETRACE
18400 28 30 78 31 30 30 2c 28 22 65 71 75 61 6c 69 74  (0x100,("equalit
18410 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  y scan regions: 
18420 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d  %d\n", (int)a[1]
18430 29 29 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d  ));.    *pnRow =
18440 20 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68 65 72 65   a[1];.  }.where
18450 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e  EqualScanEst_can
18460 63 65 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56 61  cel:.  sqlite3Va
18470 6c 75 65 46 72 65 65 28 70 52 68 73 29 3b 0a 20  lueFree(pRhs);. 
18480 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
18490 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
184a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
184b0 41 54 33 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  AT3) */..#ifdef 
184c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
184d0 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT3./*.** Estima
184e0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
184f0 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
18500 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65  be returned base
18510 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f  d on.** an IN co
18520 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20 74  nstraint where t
18530 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
18540 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
18550 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69  rator.** is a li
18560 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45  st of values.  E
18570 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
18580 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20       WHERE x IN 
18590 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20  (1,2,3,4).**.** 
185a0 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61  Write the estima
185b0 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e  ted row count in
185c0 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65  to *pnRow and re
185d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
185e0 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  .** If unable to
185f0 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74   make an estimat
18600 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20  e, leave *pnRow 
18610 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65  unchanged and re
18620 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
18630 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
18640 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66  tine can fail if
18650 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f   it is unable to
18660 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e   load a collatin
18670 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65  g sequence.** re
18680 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e  quired for strin
18690 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72  g comparison, or
186a0 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c   if unable to al
186b0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a  locate memory.**
186c0 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65   for a UTF conve
186d0 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66  rsion required f
186e0 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  or comparison.  
186f0 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f  The error is sto
18700 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50  red.** in the pP
18710 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
18720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
18730 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20  ereInScanEst(.  
18740 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
18750 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
18760 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
18770 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
18780 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
18790 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
187a0 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74   whose left-most
187b0 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d   column is pTerm
187c0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
187d0 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68  pList,     /* Th
187e0 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20  e value list on 
187f0 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e  the RHS of "x IN
18800 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22   (v1,v2,v3,...)"
18810 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
18820 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
18830 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
18840 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
18850 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
18860 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
18870 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
18880 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
18890 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20    tRowcnt nEst; 
188a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
188b0 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20  ber of rows for 
188c0 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f  a single term */
188d0 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45  .  tRowcnt nRowE
188e0 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65  st = 0;    /* Ne
188f0 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  w estimate of th
18900 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
18910 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18930 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
18940 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ..  assert( p->a
18950 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66  Sample!=0 );.  f
18960 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
18970 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74  TE_OK && i<pList
18980 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
18990 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52     nEst = p->aiR
189a0 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63  owEst[0];.    rc
189b0 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
189c0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 2c 20  nEst(pParse, p, 
189d0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
189e0 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e  r, &nEst);.    n
189f0 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a  RowEst += nEst;.
18a00 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
18a10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
18a20 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e  f( nRowEst > p->
18a30 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52  aiRowEst[0] ) nR
18a40 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77  owEst = p->aiRow
18a50 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52  Est[0];.    *pnR
18a60 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
18a70 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
18a80 30 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69  00,("IN row esti
18a90 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c  mate: est=%g\n",
18aa0 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a   nRowEst));.  }.
18ab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
18ac0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
18ad0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
18ae0 54 41 54 33 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TAT3) */../*.** 
18af0 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69  Disable a term i
18b00 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
18b10 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20  se.  Except, do 
18b20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20  not disable the 
18b30 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f  term.** if it co
18b40 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55  ntrols a LEFT OU
18b50 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20  TER JOIN and it 
18b60 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
18b70 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f  e in the ON.** o
18b80 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
18b90 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a  f that join..**.
18ba0 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
18bb0 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69  term t2.z='ok' i
18bc0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
18bd0 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  queries:.**.**  
18be0 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (1)  SELECT * F
18bf0 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
18c00 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
18c10 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27   WHERE t2.z='ok'
18c20 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43  .**   (2)  SELEC
18c30 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
18c40 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
18c50 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
18c60 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45  ok'.**   (3)  SE
18c70 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
18c80 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32  t2 WHERE t1.a=t2
18c90 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
18ca0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d  .**.** The t2.z=
18cb0 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64  'ok' is disabled
18cc0 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62   in the in (2) b
18cd0 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e  ecause it origin
18ce0 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  ates.** in the O
18cf0 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74  N clause.  The t
18d00 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20  erm is disabled 
18d10 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69  in (3) because i
18d20 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a  t is not part.**
18d30 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
18d40 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20   JOIN.  In (1), 
18d50 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
18d60 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  disabled..**.** 
18d70 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
18d80 46 3a 20 52 2d 32 34 35 39 37 2d 35 38 36 35 35  F: R-24597-58655
18d90 20 4e 6f 20 74 65 73 74 73 20 61 72 65 20 64 6f   No tests are do
18da0 6e 65 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61  ne for terms tha
18db0 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74  t are.** complet
18dc0 65 6c 79 20 73 61 74 69 73 66 69 65 64 20 62 79  ely satisfied by
18dd0 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   indices..**.** 
18de0 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d  Disabling a term
18df0 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72   causes that ter
18e00 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74  m to not be test
18e10 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ed in the inner 
18e20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  loop.** of the j
18e30 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  oin.  Disabling 
18e40 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
18e50 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20  on.  When terms 
18e60 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
18e70 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20   by indices, we 
18e80 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20  disable them to 
18e90 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e  prevent redundan
18ea0 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69  t tests in the i
18eb0 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57  nner.** loop.  W
18ec0 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20  e would get the 
18ed0 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20  correct results 
18ee0 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20  if nothing were 
18ef0 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a  ever disabled,.*
18f00 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68  * but joins migh
18f10 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
18f20 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63  lower.  The tric
18f30 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20  k is to disable 
18f40 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65  as much.** as we
18f50 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73   can without dis
18f60 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e  abling too much.
18f70 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64    If we disabled
18f80 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65   in (1), we'd ge
18f90 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61  t.** the wrong a
18fa0 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b  nswer.  See tick
18fb0 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74  et #813..*/.stat
18fc0 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54  ic void disableT
18fd0 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a  erm(WhereLevel *
18fe0 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72  pLevel, WhereTer
18ff0 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28  m *pTerm){.  if(
19000 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20   pTerm.      && 
19010 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
19020 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
19030 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  .      && (pLeve
19040 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20  l->iLeftJoin==0 
19050 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
19060 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
19070 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
19080 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77   ){.    pTerm->w
19090 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
190a0 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
190b0 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
190c0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
190d0 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
190e0 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
190f0 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
19100 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
19110 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
19120 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
19130 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
19140 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
19150 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
19160 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e  Code an OP_Affin
19170 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70  ity opcode to ap
19180 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  ply the column a
19190 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a  ffinity string z
191a0 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20  Aff.** to the n 
191b0 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
191c0 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a  ng at base. .**.
191d0 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** As an optimiz
191e0 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46  ation, SQLITE_AF
191f0 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28  F_NONE entries (
19200 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73  which are no-ops
19210 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69  ) at the.** begi
19220 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66  nning and end of
19230 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65   zAff are ignore
19240 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69  d.  If all entri
19250 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a  es in zAff are.*
19260 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
19270 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20  E, then no code 
19280 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  gets generated..
19290 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
192a0 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e  ne makes its own
192b0 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f   copy of zAff so
192c0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
192d0 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d   is free.** to m
192e0 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72  odify zAff after
192f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
19300 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
19310 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41   void codeApplyA
19320 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
19330 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c  Parse, int base,
19340 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41   int n, char *zA
19350 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ff){.  Vdbe *v =
19360 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
19370 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b    if( zAff==0 ){
19380 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
19390 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
193a0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
193b0 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
193c0 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
193d0 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64   Adjust base and
193e0 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20   n to skip over 
193f0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
19400 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62  entries at the b
19410 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e  eginning.  ** an
19420 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66  d end of the aff
19430 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  inity string..  
19440 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  */.  while( n>0 
19450 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49  && zAff[0]==SQLI
19460 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
19470 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65     n--;.    base
19480 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a  ++;.    zAff++;.
19490 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31    }.  while( n>1
194a0 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53   && zAff[n-1]==S
194b0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
194c0 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a  {.    n--;.  }..
194d0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50    /* Code the OP
194e0 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
194f0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
19500 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f  thing left to do
19510 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29  . */.  if( n>0 )
19520 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
19530 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66  eAddOp2(v, OP_Af
19540 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29  finity, base, n)
19550 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19560 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
19570 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73   zAff, n);.    s
19580 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
19590 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
195a0 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  arse, base, n);.
195b0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
195c0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
195d0 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
195e0 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
195f0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
19600 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
19610 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
19620 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
19630 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
19640 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
19650 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
19660 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
19670 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
19680 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20  aint is left in 
19690 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
196a0 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74  *.** For a const
196b0 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  raint of the for
196c0 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78  m X=expr, the ex
196d0 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
196e0 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a  uated and its.**
196f0 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20   result is left 
19700 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46  on the stack.  F
19710 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
19720 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
19730 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
19740 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
19750 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
19760 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
19770 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
19780 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
19790 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
197a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
197b0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
197c0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
197d0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
197e0 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
197f0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
19800 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
19810 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
19820 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c  pLevel, /* The l
19830 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d  evel of the FROM
19840 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77   clause we are w
19850 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69  orking on */.  i
19860 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20  nt iEq,         
19870 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
19880 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
19890 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76   within this lev
198a0 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  el */.  int bRev
198b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
198c0 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d  rue for reverse-
198d0 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69  order IN operati
198e0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
198f0 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20  rget         /* 
19900 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65  Attempt to leave
19910 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73   results in this
19920 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
19930 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
19940 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
19950 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
19960 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67  Vdbe;.  int iReg
19970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19980 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
19990 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  olding results *
199a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61  /..  assert( iTa
199b0 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
199c0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b  pX->op==TK_EQ ){
199d0 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
199e0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
199f0 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  t(pParse, pX->pR
19a00 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  ight, iTarget);.
19a10 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e    }else if( pX->
19a20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
19a30 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
19a40 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  get;.    sqlite3
19a50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19a60 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b  _Null, 0, iReg);
19a70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19a80 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
19a90 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65  }else{.    int e
19aa0 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54  Type;.    int iT
19ab0 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  ab;.    struct I
19ac0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
19ad0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
19ae0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
19af0 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  p;..    if( (pLo
19b00 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
19b10 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
19b20 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  )==0.      && pL
19b30 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
19b40 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20  dex!=0.      && 
19b50 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
19b60 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
19b70 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20  r[iEq].    ){.  
19b80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45      testcase( iE
19b90 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  q==0 );.      te
19ba0 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a  stcase( bRev );.
19bb0 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52        bRev = !bR
19bc0 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ev;.    }.    as
19bd0 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
19be0 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
19bf0 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
19c00 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
19c10 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
19c20 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66  , pX, 0);.    if
19c30 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
19c40 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
19c50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19c60 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52  bRev );.      bR
19c70 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20  ev = !bRev;.    
19c80 7d 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d  }.    iTab = pX-
19c90 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c  >iTable;.    sql
19ca0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19cb0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
19cc0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54   : OP_Rewind, iT
19cd0 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  ab, 0);.    asse
19ce0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
19cf0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
19d00 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20  I_OR)==0 );.    
19d10 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
19d20 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b  = WHERE_IN_ABLE;
19d30 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
19d40 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a  >u.in.nIn==0 ){.
19d50 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64        pLevel->ad
19d60 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
19d70 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19d80 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
19d90 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20  l->u.in.nIn++;. 
19da0 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
19db0 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20  aInLoop =.      
19dc0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
19dd0 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e  cOrFree(pParse->
19de0 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  db, pLevel->u.in
19df0 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20  .aInLoop,.      
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e10 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70          sizeof(p
19e20 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
19e30 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e  oop[0])*pLevel->
19e40 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70  u.in.nIn);.    p
19e50 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  In = pLevel->u.i
19e60 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69  n.aInLoop;.    i
19e70 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20  f( pIn ){.      
19e80 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIn += pLevel->u
19e90 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20  .in.nIn - 1;.   
19ea0 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69     pIn->iCur = i
19eb0 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65  Tab;.      if( e
19ec0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
19ed0 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OWID ){.        
19ee0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
19ef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19f00 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
19f10 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20  iTab, iReg);.   
19f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19f30 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
19f40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19f50 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
19f60 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67  n, iTab, 0, iReg
19f70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19f80 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
19f90 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
19fa0 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
19fb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19fc0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
19fd0 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65  l, iReg);.    }e
19fe0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
19ff0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b  l->u.in.nIn = 0;
1a000 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1a010 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28  }.  disableTerm(
1a020 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
1a030 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
1a040 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1a050 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1a060 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20  evaluate all == 
1a070 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
1a080 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64  ts for an.** ind
1a090 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ex..**.** For ex
1a0a0 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
1a0b0 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
1a0c0 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
1a0d0 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
1a0e0 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
1a0f0 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
1a100 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
1a110 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
1a120 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
1a130 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
1a140 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
1a150 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
1a160 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
1a170 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
1a180 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
1a190 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
1a1a0 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
1a1b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
1a1c0 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
1a1d0 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
1a1e0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
1a1f0 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
1a200 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
1a210 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1a220 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
1a230 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20  ll be stored.** 
1a240 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  in consecutive r
1a250 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
1a260 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
1a270 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20  rst register is 
1a280 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1a290 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
1a2a0 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
1a2b0 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
1a2c0 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
1a2d0 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
1a2e0 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
1a2f0 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
1a300 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
1a310 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
1a320 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
1a330 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
1a340 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
1a350 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a  memory cell and.
1a360 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61  ** compute the a
1a370 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
1a380 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a390 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ne always alloca
1a3a0 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  tes at least one
1a3b0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
1a3c0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
1a3d0 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65  index of that me
1a3e0 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63  mory cell. The c
1a3f0 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c  ode that.** call
1a400 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
1a410 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d  ill use that mem
1a420 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72  ory cell to stor
1a430 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f  e the terminatio
1a440 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f  n.** key value o
1a450 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
1a460 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f  one or more IN o
1a470 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c  perators appear,
1a480 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
1a490 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
1a4a0 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45  an additional nE
1a4b0 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  q memory cells f
1a4c0 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75  or internal.** u
1a4d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  se..**.** Before
1a4e0 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41   returning, *pzA
1a4f0 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ff is set to poi
1a500 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
1a510 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63  ontaining a.** c
1a520 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
1a530 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
1a540 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  g of the index a
1a550 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a  llocated using.*
1a560 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  * sqlite3DbMallo
1a570 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74  c(). Except, ent
1a580 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79  ries in the copy
1a590 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61   of the string a
1a5a0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
1a5b0 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  h equality const
1a5c0 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20  raints that use 
1a5d0 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72  NONE affinity ar
1a5e0 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49  e set to.** SQLI
1a5f0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69  TE_AFF_NONE. Thi
1a600 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74  s is to deal wit
1a610 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68  h SQL such as th
1a620 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
1a630 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
1a640 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d  E t1(a TEXT PRIM
1a650 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20  ARY KEY, b);.** 
1a660 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
1a670 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57  M t1 AS t2, t1 W
1a680 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62  HERE t1.a = t2.b
1a690 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ;.**.** In the e
1a6a0 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
1a6b0 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29  e index on t1(a)
1a6c0 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69   has TEXT affini
1a6d0 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a  ty. But since.**
1a6e0 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
1a6f0 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61  side of the equa
1a700 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1a710 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20  (t2.b) has NONE 
1a720 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20  affinity,.** no 
1a730 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c  conversion shoul
1a740 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62  d be attempted b
1a750 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32  efore using a t2
1a760 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74  .b value as part
1a770 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20   of.** a key to 
1a780 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78  search the index
1a790 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73  . Hence the firs
1a7a0 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65  t byte in the re
1a7b0 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a  turned affinity.
1a7c0 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69  ** string in thi
1a7d0 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20  s example would 
1a7e0 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
1a7f0 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74  _AFF_NONE..*/.st
1a800 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c  atic int codeAll
1a810 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20  EqualityTerms(. 
1a820 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1a830 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1a840 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
1a850 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1a860 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65  l,   /* Which ne
1a870 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
1a880 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64   FROM we are cod
1a890 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ing */.  WhereCl
1a8a0 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f  ause *pWC,     /
1a8b0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1a8c0 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  se */.  Bitmask 
1a8d0 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
1a8e0 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20   Which parts of 
1a8f0 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65  FROM have not ye
1a900 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a  t been coded */.
1a910 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20    int bRev,     
1a920 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65 72          /* Rever
1a930 73 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  se the order of 
1a940 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  IN operators */.
1a950 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c    int nExtraReg,
1a960 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a970 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
1a980 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
1a990 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41   */.  char **pzA
1a9a0 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ff          /* O
1a9b0 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74  UT: Set to point
1a9c0 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72   to affinity str
1a9d0 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
1a9e0 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
1a9f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1aa00 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
1aa10 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
1aa20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62  to code */.  Vdb
1aa30 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1aa40 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
1aa50 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
1aa60 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
1aa70 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
1aa80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1aa90 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
1aaa0 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
1aab0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1aac0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
1aad0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
1aae0 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20  constraint term 
1aaf0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1ab00 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
1ab10 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
1ab20 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
1ab30 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ab50 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1ab60 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab80 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
1ab90 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b  r */.  int nReg;
1aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1abc0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  f registers to a
1abd0 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
1abe0 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20  r *zAff;        
1abf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
1ac00 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
1ac10 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
1ac20 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   This module is 
1ac30 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71  only called on q
1ac40 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20  uery plans that 
1ac50 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f  use an index. */
1ac60 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
1ac70 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73  l->pWLoop;.  ass
1ac80 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
1ac90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1aca0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
1acb0 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  .  nEq = pLoop->
1acc0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 70  u.btree.nEq;.  p
1acd0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
1ace0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61  tree.pIndex;.  a
1acf0 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
1ad00 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
1ad10 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
1ad20 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
1ad30 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
1ad40 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
1ad50 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
1ad60 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
1ad70 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Reg = pLoop->u.b
1ad80 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72  tree.nEq + nExtr
1ad90 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  aReg;.  pParse->
1ada0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20  nMem += nReg;.. 
1adb0 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44   zAff = sqlite3D
1adc0 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
1add0 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78  db, sqlite3Index
1ade0 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
1adf0 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41  Idx));.  if( !zA
1ae00 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ff ){.    pParse
1ae10 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1ae20 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = 1;.  }..  /
1ae30 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
1ae40 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1ae50 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
1ae60 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
1ae70 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a  >=nEq );.  for(j
1ae80 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
1ae90 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20  .    int r1;.   
1aea0 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
1aeb0 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61  aLTerm[j];.    a
1aec0 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
1aed0 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  );.    /* The fo
1aee0 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20 66 6f 72  llowing true for
1aef0 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 72 65   indices with re
1af00 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e  dundant columns.
1af10 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45   .    ** Ex: CRE
1af20 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
1af30 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43  t1(a,b,a); SELEC
1af40 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
1af50 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a  E a=0 AND b=0; *
1af60 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  /.    testcase( 
1af70 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
1af80 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30  & TERM_CODED)!=0
1af90 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1afa0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
1afb0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1afc0 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
1afd0 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 72  5-11662 */.    r
1afe0 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  1 = codeEquality
1aff0 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1b000 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62  rm, pLevel, j, b
1b010 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b  Rev, regBase+j);
1b020 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67  .    if( r1!=reg
1b030 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20  Base+j ){.      
1b040 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
1b050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
1b060 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1b070 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20  rse, regBase);. 
1b080 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
1b090 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   r1;.      }else
1b0a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b0b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b0c0 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67  P_SCopy, r1, reg
1b0d0 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  Base+j);.      }
1b0e0 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1b0f0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
1b100 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
1b110 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
1b120 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
1b130 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
1b140 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
1b150 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
1b160 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30  SNULL|WO_IN))==0
1b170 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1b180 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e  pRight = pTerm->
1b190 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
1b1a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b1b0 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
1b1c0 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
1b1d0 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e+j, pLevel->add
1b1e0 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  rBrk);.      if(
1b1f0 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20   zAff ){.       
1b200 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
1b210 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
1b220 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51  ht, zAff[j])==SQ
1b230 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
1b240 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
1b250 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  j] = SQLITE_AFF_
1b260 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
1b270 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1b280 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
1b290 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
1b2a0 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b  ght, zAff[j]) ){
1b2b0 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
1b2c0 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  j] = SQLITE_AFF_
1b2d0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
1b2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b2f0 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66  }.  *pzAff = zAf
1b300 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42  f;.  return regB
1b310 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ase;.}..#ifndef 
1b320 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
1b330 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  AIN./*.** This r
1b340 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70  outine is a help
1b350 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e  er for explainIn
1b360 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77  dexRange() below
1b370 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64  .**.** pStr hold
1b380 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e  s the text of an
1b390 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
1b3a0 20 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67   we are building
1b3b0 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20   up one term.** 
1b3c0 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73  at a time.  This
1b3d0 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20   routine adds a 
1b3e0 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20  new term to the 
1b3f0 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70 72 65  end of the expre
1b400 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20  ssion..** Terms 
1b410 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62 79  are separated by
1b420 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20   AND so add the 
1b430 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73  "AND" text for s
1b440 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71  econd and subseq
1b450 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e  uent.** terms on
1b460 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
1b470 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64  id explainAppend
1b480 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d  Term(.  StrAccum
1b490 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20 20   *pStr,         
1b4a0 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
1b4b0 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67  expression being
1b4c0 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20   built */.  int 
1b4d0 69 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iTerm,          
1b4e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1b4f0 20 6f 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20   of this term.  
1b500 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f  First is zero */
1b510 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b520 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f  Column,        /
1b530 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
1b540 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
1b550 63 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20  char *zOp       
1b560 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1b570 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f   the operator */
1b580 0a 29 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20  .){.  if( iTerm 
1b590 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
1b5a0 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20  mAppend(pStr, " 
1b5b0 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c  AND ", 5);.  sql
1b5c0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1b5d0 6e 64 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e  nd(pStr, zColumn
1b5e0 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , -1);.  sqlite3
1b5f0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
1b600 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20  Str, zOp, 1);.  
1b610 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1b620 70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c  ppend(pStr, "?",
1b630 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72   1);.}../*.** Ar
1b640 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65  gument pLevel de
1b650 73 63 72 69 62 65 73 20 61 20 73 74 72 61 74 65  scribes a strate
1b660 67 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20  gy for scanning 
1b670 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73  table pTab. This
1b680 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
1b690 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
1b6a0 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
1b6b0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
1b6c0 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f  description.** o
1b6d0 66 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20  f the subset of 
1b6e0 74 61 62 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e  table rows scann
1b6f0 65 64 20 62 79 20 74 68 65 20 73 74 72 61 74 65  ed by the strate
1b700 67 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f  gy in the form o
1b710 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72  f an.** SQL expr
1b720 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61  ession. Or, if a
1b730 6c 6c 20 72 6f 77 73 20 61 72 65 20 73 63 61 6e  ll rows are scan
1b740 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  ned, NULL is ret
1b750 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  urned..**.** For
1b760 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1b770 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1b780 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1b790 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62   WHERE a=1 AND b
1b7a0 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e  >2;.**.** is run
1b7b0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e   and there is an
1b7c0 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29   index on (a, b)
1b7d0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1b7e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a  tion returns a.*
1b7f0 2a 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61 72  * string similar
1b800 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d   to:.**.**   "a=
1b810 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a  ? AND b>?".**.**
1b820 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f   The returned po
1b830 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  inter points to 
1b840 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
1b850 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
1b860 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73  lloc()..** It is
1b870 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
1b880 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
1b890 72 20 74 6f 20 66 72 65 65 20 74 68 65 20 62 75  r to free the bu
1b8a0 66 66 65 72 20 77 68 65 6e 20 69 74 20 69 73 0a  ffer when it is.
1b8b0 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  ** no longer req
1b8c0 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
1b8d0 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e   char *explainIn
1b8e0 64 65 78 52 61 6e 67 65 28 73 71 6c 69 74 65 33  dexRange(sqlite3
1b8f0 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
1b900 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70  *pLoop, Table *p
1b910 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
1b920 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
1b930 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
1b940 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   int nEq = pLoop
1b950 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
1b960 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c   int i, j;.  Col
1b970 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62  umn *aCol = pTab
1b980 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61  ->aCol;.  int *a
1b990 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  iColumn = pIndex
1b9a0 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74  ->aiColumn;.  St
1b9b0 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69  rAccum txt;..  i
1b9c0 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 72  f( pIndex==0 ) r
1b9d0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 6e  eturn 0;.  if( n
1b9e0 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d  Eq==0 && (pLoop-
1b9f0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
1ba00 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
1ba10 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30  E_TOP_LIMIT))==0
1ba20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1ba30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
1ba40 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74  trAccumInit(&txt
1ba50 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d  , 0, 0, SQLITE_M
1ba60 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78  AX_LENGTH);.  tx
1ba70 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c  t.db = db;.  sql
1ba80 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1ba90 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32  nd(&txt, " (", 2
1baa0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1bab0 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65  nEq; i++){.    e
1bac0 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
1bad0 28 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61  (&txt, i, aCol[a
1bae0 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d  iColumn[i]].zNam
1baf0 65 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20  e, "=");.  }..  
1bb00 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c 6f  j = i;.  if( pLo
1bb10 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  op->wsFlags&WHER
1bb20 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
1bb30 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d     char *z = (j=
1bb40 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
1bb50 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61   ) ? "rowid" : a
1bb60 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  Col[aiColumn[j]]
1bb70 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c  .zName;.    expl
1bb80 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74  ainAppendTerm(&t
1bb90 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29  xt, i++, z, ">")
1bba0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  ;.  }.  if( pLoo
1bbb0 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  p->wsFlags&WHERE
1bbc0 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
1bbd0 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d    char *z = (j==
1bbe0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
1bbf0 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  ) ? "rowid" : aC
1bc00 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
1bc10 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
1bc20 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
1bc30 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20  t, i, z, "<");. 
1bc40 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
1bc50 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c  ccumAppend(&txt,
1bc60 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75   ")", 1);.  retu
1bc70 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  rn sqlite3StrAcc
1bc80 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a  umFinish(&txt);.
1bc90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1bca0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1bcb0 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74  p unless current
1bcc0 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  ly processing an
1bcd0 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
1bce0 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20  LAN.** command. 
1bcf0 49 66 20 74 68 65 20 71 75 65 72 79 20 62 65 69  If the query bei
1bd00 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61  ng compiled is a
1bd10 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
1bd20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a  PLAN, a single.*
1bd30 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65  * record is adde
1bd40 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
1bd50 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
1bd60 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74  table scan strat
1bd70 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65  egy in .** pLeve
1bd80 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
1bd90 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  d explainOneScan
1bda0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1bdb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1bdc0 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
1bdd0 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
1bde0 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
1bdf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1be00 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f  le list this loo
1be10 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20  p refers to */. 
1be20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1be30 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
1be40 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74   /* Scan to writ
1be50 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63  e OP_Explain opc
1be60 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ode for */.  int
1be70 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1be90 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c  Value for "level
1bea0 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70  " column of outp
1beb0 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  ut */.  int iFro
1bec0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
1bed0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1bee0 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75   for "from" colu
1bef0 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a  mn of output */.
1bf00 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
1bf30 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
1bf40 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20  eBegin() */.){. 
1bf50 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
1bf60 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 73  lain==2 ){.    s
1bf70 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1bf80 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
1bf90 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
1bfa0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62  >iFrom];.    Vdb
1bfb0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1bfc0 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d  Vdbe;      /* VM
1bfd0 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
1bfe0 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
1bff0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1c000 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  db;     /* Datab
1c010 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
1c020 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20    char *zMsg;   
1c030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c040 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74  /* Text to add t
1c050 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a  o EQP output */.
1c060 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50      int iId = pP
1c070 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
1c080 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28    /* Select id (
1c090 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74  left-most output
1c0a0 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20   column) */.    
1c0b0 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20 20  int isSearch;   
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c0d0 20 54 72 75 65 20 66 6f 72 20 61 20 53 45 41 52   True for a SEAR
1c0e0 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43  CH. False for SC
1c0f0 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  AN. */.    Where
1c100 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
1c110 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c120 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65 72  controlling Wher
1c130 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
1c140 20 20 20 20 75 33 32 20 66 6c 61 67 73 3b 20 20      u32 flags;  
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c160 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20    /* Flags that 
1c170 64 65 73 63 72 69 62 65 20 74 68 69 73 20 6c 6f  describe this lo
1c180 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70  op */..    pLoop
1c190 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
1c1a0 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70  p;.    flags = p
1c1b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
1c1c0 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48     if( (flags&WH
1c1d0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c  ERE_MULTI_OR) ||
1c1e0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
1c1f0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
1c200 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  ) ) return;..   
1c210 20 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61   isSearch = (fla
1c220 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49  gs&(WHERE_BTM_LI
1c230 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
1c240 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20  MIT))!=0.       
1c250 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26       || ((flags&
1c260 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1c270 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70  LE)==0 && (pLoop
1c280 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29  ->u.btree.nEq>0)
1c290 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ).            ||
1c2a0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48   (wctrlFlags&(WH
1c2b0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c  ERE_ORDERBY_MIN|
1c2c0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1c2d0 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d  X));..    zMsg =
1c2e0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1c2f0 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72  db, "%s", isSear
1c300 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41  ch?"SEARCH":"SCA
1c310 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  N");.    if( pIt
1c320 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1c330 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1c340 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1c350 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55 45  zMsg, "%s SUBQUE
1c360 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74  RY %d", zMsg,pIt
1c370 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a  em->iSelectId);.
1c380 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c390 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1c3a0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1c3b0 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c  , "%s TABLE %s",
1c3c0 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e   zMsg, pItem->zN
1c3d0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ame);.    }..   
1c3e0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
1c3f0 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  as ){.      zMsg
1c400 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1c410 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1c420 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70   AS %s", zMsg, p
1c430 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1c440 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
1c450 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b  ags & (WHERE_IPK
1c460 7c 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  |WHERE_VIRTUALTA
1c470 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26  BLE))==0.     &&
1c480 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1c490 70 49 6e 64 65 78 21 3d 30 0a 20 20 20 20 29 7b  pIndex!=0.    ){
1c4a0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68  .      char *zWh
1c4b0 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64  ere = explainInd
1c4c0 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f 6f  exRange(db, pLoo
1c4d0 70 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  p, pItem->pTab);
1c4e0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
1c4f0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1c500 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e  , zMsg, "%s USIN
1c510 47 20 25 73 25 73 49 4e 44 45 58 25 73 25 73 25  G %s%sINDEX%s%s%
1c520 73 22 2c 20 7a 4d 73 67 2c 20 0a 20 20 20 20 20  s", zMsg, .     
1c530 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57       ((flags & W
1c540 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
1c550 3f 22 41 55 54 4f 4d 41 54 49 43 20 22 3a 22 22  ?"AUTOMATIC ":""
1c560 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66  ),.          ((f
1c570 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
1c580 5f 4f 4e 4c 59 29 3f 22 43 4f 56 45 52 49 4e 47  _ONLY)?"COVERING
1c590 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20   ":""),.        
1c5a0 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
1c5b0 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22  E_TEMP_INDEX)?""
1c5c0 3a 22 20 22 29 2c 0a 20 20 20 20 20 20 20 20 20  :" "),.         
1c5d0 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
1c5e0 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a  _TEMP_INDEX)?"":
1c5f0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1c600 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a  pIndex->zName),.
1c610 20 20 20 20 20 20 20 20 20 20 7a 57 68 65 72 65            zWhere
1c620 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
1c630 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1c640 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d  , zWhere);.    }
1c650 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
1c660 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 20  & WHERE_IPK)!=0 
1c670 26 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  && (flags & WHER
1c680 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30  E_CONSTRAINT)!=0
1c690 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
1c6a0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1c6b0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55  (db, zMsg, "%s U
1c6c0 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49  SING INTEGER PRI
1c6d0 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29  MARY KEY", zMsg)
1c6e0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ;..      if( fla
1c6f0 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  gs&(WHERE_COLUMN
1c700 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _EQ|WHERE_COLUMN
1c710 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _IN) ){.        
1c720 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c730 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c740 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c   "%s (rowid=?)",
1c750 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
1c760 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57  lse if( (flags&W
1c770 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29  HERE_BOTH_LIMIT)
1c780 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d  ==WHERE_BOTH_LIM
1c790 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
1c7a0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1c7b0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1c7c0 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20  %s (rowid>? AND 
1c7d0 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29  rowid<?)", zMsg)
1c7e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1c7f0 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54  ( flags&WHERE_BT
1c800 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
1c810 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c820 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1c830 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f  sg, "%s (rowid>?
1c840 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
1c850 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1c860 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  &WHERE_TOP_LIMIT
1c870 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
1c880 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1c890 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1c8a0 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73   (rowid<?)", zMs
1c8b0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1c8c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1c8d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1c8e0 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  LE.    else if( 
1c8f0 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  (flags & WHERE_V
1c900 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
1c910 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
1c920 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1c930 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49  db, zMsg, "%s VI
1c940 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
1c950 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a  X %d:%s", zMsg,.
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1c980 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75  idxNum, pLoop->u
1c990 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
1c9a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1c9b0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c9c0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c9d0 20 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20   "%s", zMsg);.  
1c9e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c9f0 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
1ca00 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20  n, iId, iLevel, 
1ca10 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f  iFrom, zMsg, P4_
1ca20 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
1ca30 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
1ca40 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c  xplainOneScan(u,
1ca50 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
1ca60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1ca70 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a  _EXPLAIN */.../*
1ca80 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1ca90 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  e for the start 
1caa0 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68  of the iLevel-th
1cab0 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45   loop in the WHE
1cac0 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70  RE clause.** imp
1cad0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63  lementation desc
1cae0 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e  ribed by pWInfo.
1caf0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
1cb00 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  sk codeOneLoopSt
1cb10 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  art(.  WhereInfo
1cb20 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43   *pWInfo,   /* C
1cb30 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74  omplete informat
1cb40 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48  ion about the WH
1cb50 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1cb60 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
1cb70 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65       /* Which le
1cb80 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61  vel of pWInfo->a
1cb90 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64  [] should be cod
1cba0 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
1cbb0 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20  notReady     /* 
1cbc0 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  Which tables are
1cbd0 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
1cbe0 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
1cbf0 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
1cc00 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1cc10 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
1cc20 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1cc30 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1cc40 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
1cc50 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20  .  int addrNxt; 
1cc60 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
1cc70 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
1cc80 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
1cc90 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
1cca0 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20  int omitTable;  
1ccb0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1ccc0 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
1ccd0 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62   only */.  int b
1cce0 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
1ccf0 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
1cd00 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
1cd10 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
1cd20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1cd30 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65  vel;  /* The whe
1cd40 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63  re level to be c
1cd50 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
1cd60 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f  oop *pLoop;    /
1cd70 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
1cd80 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64  object being cod
1cd90 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
1cda0 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20  use *pWC;    /* 
1cdb0 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66  Decomposition of
1cdc0 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52   the entire WHER
1cdd0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
1cde0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ce00 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   A WHERE clause 
1ce10 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20  term */.  Parse 
1ce20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
1ce30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1ce40 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1ce50 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce70 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
1ce80 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e  d stmt under con
1ce90 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  structions */.  
1cea0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1ceb0 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
1cec0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
1ced0 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20  erm being coded 
1cee0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b  */.  int addrBrk
1cef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cf00 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1cf10 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
1cf20 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
1cf30 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20  int addrCont;   
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
1cf60 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
1cf70 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  xt cycle */.  in
1cf80 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b  t iRowidReg = 0;
1cf90 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
1cfa0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
1cfb0 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20  is register, if 
1cfc0 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e  not zero */.  in
1cfd0 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  t iReleaseReg = 
1cfe0 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  0;      /* Temp 
1cff0 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65  register to free
1d000 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1d010 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  g */.  Bitmask n
1d020 65 77 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  ewNotReady;     
1d030 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1d040 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
1d050 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1d060 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
1d070 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  dbe;.  pWC = &pW
1d080 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 65  Info->sWC;.  pLe
1d090 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
1d0a0 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f  [iLevel];.  pLoo
1d0b0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
1d0c0 6f 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  op;.  pTabItem =
1d0d0 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
1d0e0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
1d0f0 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70  rom];.  iCur = p
1d100 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
1d110 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 57 49 6e  ;.  bRev = (pWIn
1d120 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e 69 4c 65  fo->revMask>>iLe
1d130 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69 74 54 61  vel)&1;.  omitTa
1d140 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73  ble = (pLoop->ws
1d150 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
1d160 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20  X_ONLY)!=0 .    
1d170 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
1d180 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1d190 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
1d1a0 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65 4e 6f 6f  E)==0;.  VdbeNoo
1d1b0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  pComment((v, "Be
1d1c0 67 69 6e 20 4a 6f 69 6e 20 4c 6f 6f 70 20 25 64  gin Join Loop %d
1d1d0 22 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 0a 20 20  ", iLevel));..  
1d1e0 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
1d1f0 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22   for the "break"
1d200 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20   and "continue" 
1d210 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a  instructions.  *
1d220 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  * for the curren
1d230 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f  t loop.  Jump to
1d240 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61   addrBrk to brea
1d250 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e  k out of a loop.
1d260 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f  .  ** Jump to co
1d270 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61  nt to go immedia
1d280 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74  tely to the next
1d290 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
1d2a0 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a  e.  ** loop..  *
1d2b0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72  *.  ** When ther
1d2c0 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  e is an IN opera
1d2d0 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76  tor, we also hav
1d2e0 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61  e a "addrNxt" la
1d2f0 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65  bel that.  ** me
1d300 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ans to continue 
1d310 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
1d320 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69   value combinati
1d330 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74  on.  When.  ** t
1d340 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f  here are no IN o
1d350 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20  perators in the 
1d360 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
1d370 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
1d380 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  .  ** is the sam
1d390 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a  e as "addrBrk"..
1d3a0 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d    */.  addrBrk =
1d3b0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1d3c0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1d3d0 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
1d3e0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1d3f0 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65  addrCont = pLeve
1d400 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  l->addrCont = sq
1d410 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1d420 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  el(v);..  /* If 
1d430 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
1d440 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
1d450 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
1d460 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20  locate and.  ** 
1d470 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d  initialize a mem
1d480 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65  ory cell that re
1d490 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61  cords if this ta
1d4a0 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a  ble matches any.
1d4b0 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
1d4c0 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68  left table of th
1d4d0 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  e join..  */.  i
1d4e0 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  f( pLevel->iFrom
1d4f0 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
1d500 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  0].jointype & JT
1d510 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
1d520 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1d530 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  in = ++pParse->n
1d540 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
1d550 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d560 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65  _Integer, 0, pLe
1d570 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
1d580 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1d590 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20  ((v, "init LEFT 
1d5a0 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c  JOIN no-match fl
1d5b0 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ag"));.  }..  /*
1d5c0 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   Special case of
1d5d0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 73   a FROM clause s
1d5e0 75 62 71 75 65 72 79 20 69 6d 70 6c 65 6d 65 6e  ubquery implemen
1d5f0 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
1d600 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ine */.  if( pTa
1d610 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  bItem->viaCorout
1d620 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
1d630 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
1d640 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
1d650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d660 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1d670 65 72 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64  er, pTabItem->ad
1d680 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20 72 65 67  drFillSub-1, reg
1d690 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 4c 65 76  Yield);.    pLev
1d6a0 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65  el->p2 =  sqlite
1d6b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
1d6c0 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c  P_Yield, regYiel
1d6d0 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  d);.    VdbeComm
1d6e0 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f  ent((v, "next ro
1d6f0 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 20  w of co-routine 
1d700 25 73 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70  %s", pTabItem->p
1d710 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
1d720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d730 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
1d740 67 59 69 65 6c 64 2b 31 2c 20 61 64 64 72 42 72  gYield+1, addrBr
1d750 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  k);.    pLevel->
1d760 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20  op = OP_Goto;.  
1d770 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
1d780 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1d790 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28  ALTABLE.  if(  (
1d7a0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1d7b0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1d7c0 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f  BLE)!=0 ){.    /
1d7d0 2a 20 43 61 73 65 20 31 3a 20 20 54 68 65 20 74  * Case 1:  The t
1d7e0 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61  able is a virtua
1d7f0 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68  l-table.  Use th
1d800 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e  e VFilter and VN
1d810 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ext.    **      
1d820 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68      to access th
1d830 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  e data..    */. 
1d840 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f     int iReg;   /
1d850 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f  * P3 Value for O
1d860 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20  P_VFilter */.   
1d870 20 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e   int addrNotFoun
1d880 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  d;.    int nCons
1d890 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e  traint = pLoop->
1d8a0 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c  nLTerm;..    sql
1d8b0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1d8c0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  h(pParse);.    i
1d8d0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1d8e0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1d8f0 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
1d900 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75  ;.    addrNotFou
1d910 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  nd = pLevel->add
1d920 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  rBrk;.    for(j=
1d930 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; j<nConstraint
1d940 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; j++){.      in
1d950 74 20 69 54 61 72 67 65 74 20 3d 20 69 52 65 67  t iTarget = iReg
1d960 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72  +j+2;.      pTer
1d970 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
1d980 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[j];.      if( 
1d990 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69  pTerm==0 ) conti
1d9a0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
1d9b0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1d9c0 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
1d9d0 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54     codeEqualityT
1d9e0 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
1d9f0 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52  m, pLevel, j, bR
1da00 65 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ev, iTarget);.  
1da10 20 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75        addrNotFou
1da20 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  nd = pLevel->add
1da30 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rNxt;.      }els
1da40 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1da50 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1da60 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e, pTerm->pExpr-
1da70 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74  >pRight, iTarget
1da80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1da90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1daa0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1dab0 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76  eger, pLoop->u.v
1dac0 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67  tab.idxNum, iReg
1dad0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1dae0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1daf0 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61  nteger, nConstra
1db00 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20  int, iReg+1);.  
1db10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1db20 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65  Op4(v, OP_VFilte
1db30 72 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74  r, iCur, addrNot
1db40 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20  Found, iReg,.   
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db60 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62     pLoop->u.vtab
1db70 2e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20  .idxStr,.       
1db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1db90 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  Loop->u.vtab.nee
1dba0 64 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e  dFree ? P4_MPRIN
1dbb0 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b  TF : P4_STATIC);
1dbc0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  .    pLoop->u.vt
1dbd0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
1dbe0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1dbf0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20 6a  nConstraint && j
1dc00 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  <16; j++){.     
1dc10 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76   if( (pLoop->u.v
1dc20 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29  tab.omitMask>>j)
1dc30 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  &1 ){.        di
1dc40 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1dc50 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  , pLoop->aLTerm[
1dc60 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j]);.      }.   
1dc70 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f   }.    pLevel->o
1dc80 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20  p = OP_VNext;.  
1dc90 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
1dca0 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Cur;.    pLevel-
1dcb0 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
1dcc0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1dcd0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1dce0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
1dcf0 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73  rse, iReg, nCons
1dd00 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73  traint+2);.    s
1dd10 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1dd20 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
1dd30 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
1dd40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1dd50 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
1dd60 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
1dd70 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1dd80 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70  !=0.   && (pLoop
1dd90 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
1dda0 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45  RE_COLUMN_IN|WHE
1ddb0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d  RE_COLUMN_EQ))!=
1ddc0 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  0.  ){.    /* Ca
1ddd0 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69  se 2:  We can di
1dde0 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65  rectly reference
1ddf0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73   a single row us
1de00 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20  ing an.    **   
1de10 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
1de20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
1de30 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
1de40 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20  ld.  Or.    **  
1de50 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
1de60 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
1de70 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
1de80 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
1de90 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  **          cons
1dea0 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  truct..    */.  
1deb0 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
1dec0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20  >u.btree.nEq==1 
1ded0 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52  );.    iReleaseR
1dee0 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
1def0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
1df00 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1df10 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20  p->aLTerm[0];.  
1df20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
1df30 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1df40 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d  ( pTerm->pExpr!=
1df50 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1df60 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
1df70 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1df80 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1df90 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
1dfa0 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
1dfb0 31 36 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f 77  1662 */.    iRow
1dfc0 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61  idReg = codeEqua
1dfd0 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
1dfe0 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
1dff0 30 2c 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73  0, bRev, iReleas
1e000 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e  eReg);.    addrN
1e010 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  xt = pLevel->add
1e020 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rNxt;.    sqlite
1e030 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e040 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f  P_MustBeInt, iRo
1e050 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29  widReg, addrNxt)
1e060 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1e070 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
1e080 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61  tExists, iCur, a
1e090 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65  ddrNxt, iRowidRe
1e0a0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
1e0b0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1e0c0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
1e0d0 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20  RowidReg, 1);.  
1e0e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1e0f0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1e100 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1e110 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Reg);.    VdbeCo
1e120 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
1e130 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1e140 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65   = OP_Noop;.  }e
1e150 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e  lse if( (pLoop->
1e160 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1e170 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IPK)!=0.        
1e180 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
1e190 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
1e1a0 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29  MN_RANGE)!=0.  )
1e1b0 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a  {.    /* Case 3:
1e1c0 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65    We have an ine
1e1d0 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
1e1e0 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
1e1f0 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20  OWID field..    
1e200 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f  */.    int testO
1e210 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
1e220 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
1e230 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20  int memEndValue 
1e240 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65  = 0;.    WhereTe
1e250 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e  rm *pStart, *pEn
1e260 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  d;..    assert( 
1e270 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
1e280 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70      j = 0;.    p
1e290 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30  Start = pEnd = 0
1e2a0 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
1e2b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1e2c0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74  _BTM_LIMIT ) pSt
1e2d0 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  art = pLoop->aLT
1e2e0 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66  erm[j++];.    if
1e2f0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1e300 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
1e310 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f  IT ) pEnd = pLoo
1e320 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a  p->aLTerm[j++];.
1e330 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
1e340 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53        pTerm = pS
1e350 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61  tart;.      pSta
1e360 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  rt = pEnd;.     
1e370 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20   pEnd = pTerm;. 
1e380 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74     }.    if( pSt
1e390 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
1e3a0 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
1e3b0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
1e3c0 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65  sion that define
1e3d0 73 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  s the start boun
1e3e0 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  d */.      int r
1e3f0 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20  1, rTemp;       
1e400 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f   /* Registers fo
1e410 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74  r holding the st
1e420 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a  art boundary */.
1e430 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
1e440 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74  llowing constant
1e450 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65   maps TK_xx code
1e460 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e  s into correspon
1e470 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73  ding .      ** s
1e480 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74  eek opcodes.  It
1e490 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61   depends on a pa
1e4a0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e  rticular orderin
1e4b0 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20  g of TK_xx.     
1e4c0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
1e4d0 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b  u8 aMoveOp[] = {
1e4e0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1e4f0 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GT */  OP_Seek
1e500 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Gt,.           /
1e510 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53  * TK_LE */  OP_S
1e520 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20  eekLe,.         
1e530 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f    /* TK_LT */  O
1e540 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20  P_SeekLt,.      
1e550 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f       /* TK_GE */
1e560 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20    OP_SeekGe.    
1e570 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72    };.      asser
1e580 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b  t( TK_LE==TK_GT+
1e590 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b  1 );      /* Mak
1e5a0 65 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72  e sure the order
1e5b0 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ing.. */.      a
1e5c0 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
1e5d0 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+2 );      /*
1e5e0 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f    ... of the TK_
1e5f0 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a  xx values... */.
1e600 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e610 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20  _GE==TK_GT+3 ); 
1e620 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20       /*  ... is 
1e630 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20  correcct. */..  
1e640 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
1e650 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
1e660 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
1e670 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
1e680 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 70 58  1662 */.      pX
1e690 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
1e6a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e6b0 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pX!=0 );.      a
1e6c0 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c  ssert( pStart->l
1e6d0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
1e6e0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1e6f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e700 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  p(pParse, pX->pR
1e710 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20  ight, &rTemp);. 
1e720 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e730 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f  AddOp3(v, aMoveO
1e740 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c  p[pX->op-TK_GT],
1e750 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20   iCur, addrBrk, 
1e760 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
1e770 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
1e780 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e790 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1e7a0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1e7b0 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  r1, 1);.      sq
1e7c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1e7d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d  Reg(pParse, rTem
1e7e0 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c  p);.      disabl
1e7f0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53  eTerm(pLevel, pS
1e800 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tart);.    }else
1e810 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1e820 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
1e830 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
1e840 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61  _Rewind, iCur, a
1e850 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  ddrBrk);.    }. 
1e860 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
1e870 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
1e880 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
1e890 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1e8a0 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1e8b0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
1e8c0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
1e8d0 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ur );.      test
1e8e0 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c  case( pEnd->wtFl
1e8f0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1e900 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
1e910 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
1e920 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20      memEndValue 
1e930 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1e940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e950 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1e960 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45  pX->pRight, memE
1e970 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  ndValue);.      
1e980 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  if( pX->op==TK_L
1e990 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  T || pX->op==TK_
1e9a0 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  GT ){.        te
1e9b0 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
1e9c0 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20  _Le : OP_Ge;.   
1e9d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e9e0 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
1e9f0 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
1ea00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
1ea10 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1ea20 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a  l, pEnd);.    }.
1ea30 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
1ea40 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1ea50 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65  dr(v);.    pLeve
1ea60 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
1ea70 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
1ea80 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1ea90 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
1eaa0 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
1eab0 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 3d  .    if( pStart=
1eac0 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 20 29 7b  =0 && pEnd==0 ){
1ead0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
1eae0 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
1eaf0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
1eb00 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
1eb10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1eb20 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
1eb30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 73     }.    if( tes
1eb40 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
1eb50 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20        iRowidReg 
1eb60 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  = iReleaseReg = 
1eb70 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1eb80 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
1eb90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1eba0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
1ebb0 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
1ebc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1ebd0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1ebe0 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
1ebf0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1ec00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ec10 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d  Op3(v, testOp, m
1ec20 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72  emEndValue, addr
1ec30 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Brk, iRowidReg);
1ec40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ec50 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
1ec60 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
1ec70 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
1ec80 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NULL);.    }.  }
1ec90 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  else if( pLoop->
1eca0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1ecb0 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 2f  INDEXED ){.    /
1ecc0 2a 20 43 61 73 65 20 34 3a 20 41 20 73 63 61 6e  * Case 4: A scan
1ecd0 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e   using an index.
1ece0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1ecf0 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45         The WHERE
1ed00 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74   clause may cont
1ed10 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ain zero or more
1ed20 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a   equality .    *
1ed30 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20  *         terms 
1ed40 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70  ("==" or "IN" op
1ed50 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65  erators) that re
1ed60 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20  fer to the N.   
1ed70 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74   **         left
1ed80 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  -most columns of
1ed90 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d   the index. It m
1eda0 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a  ay also contain.
1edb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
1edc0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1edd0 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20  aints (>, <, >= 
1ede0 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e  or <=) on the in
1edf0 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dexed.    **    
1ee00 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74       column that
1ee10 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1ee20 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c  lows the N equal
1ee30 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20  ities. Only .   
1ee40 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
1ee50 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
1ee60 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
1ee70 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
1ee80 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20  t must.    **   
1ee90 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d        use the "=
1eea0 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72  =" and "IN" oper
1eeb0 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ators. For examp
1eec0 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20  le, if the .    
1eed0 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78  **         index
1eee0 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20   is on (x,y,z), 
1eef0 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
1ef00 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61  ng clauses are a
1ef10 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ll .    **      
1ef20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20     optimized:.  
1ef30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1ef40 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a         x=5.    *
1ef50 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1ef60 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a   AND y=10.    **
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1ef80 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1ef90 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1efa0 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a  ND y>5 AND y<10.
1efb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1efc0 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e    x=5 AND y=5 AN
1efd0 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20  D z<=10.    **. 
1efe0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
1eff0 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74  e z<10 term of t
1f000 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e  he following can
1f010 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c  not be used, onl
1f020 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  y.    **        
1f030 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20   the x=5 term:. 
1f040 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f050 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1f060 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  z<10.    **.    
1f070 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79  **         N may
1f080 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72   be zero if ther
1f090 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79  e are inequality
1f0a0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
1f0b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20    **         If 
1f0c0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65  there are no ine
1f0d0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1f0e0 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61  nts, then N is a
1f0f0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1f100 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20   least one..    
1f110 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1f120 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61    This case is a
1f130 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68  lso used when th
1f140 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
1f150 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20   clause.    **  
1f160 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
1f170 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20  ts but an index 
1f180 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77  is selected anyw
1f190 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20  ay, in order.   
1f1a0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66   **         to f
1f1b0 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20  orce the output 
1f1c0 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d  order to conform
1f1d0 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e   to an ORDER BY.
1f1e0 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74  .    */  .    st
1f1f0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
1f200 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  tartOp[] = {.   
1f210 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20     0,.      0,. 
1f220 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20       OP_Rewind, 
1f230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
1f240 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
1f250 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
1f260 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  &  !bRev) */.   
1f270 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20     OP_Last,     
1f280 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21          /* 3: (!
1f290 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1f2a0 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
1f2b0 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
1f2c0 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20   OP_SeekGt,     
1f2d0 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61        /* 4: (sta
1f2e0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1f2f0 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21  && !startEq && !
1f300 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1f310 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20  P_SeekLt,       
1f320 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74      /* 5: (start
1f330 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1f340 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52   !startEq &&  bR
1f350 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1f360 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20  SeekGe,         
1f370 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63    /* 6: (start_c
1f380 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
1f390 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76  startEq && !bRev
1f3a0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1f3b0 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20 20  ekLe            
1f3c0 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 7: (start_con
1f3d0 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
1f3e0 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
1f3f0 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74  */.    };.    st
1f400 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45  atic const u8 aE
1f410 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndOp[] = {.     
1f420 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20   OP_Noop,       
1f430 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e        /* 0: (!en
1f440 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a  d_constraints) *
1f450 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45  /.      OP_IdxGE
1f460 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1f470 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  1: (end_constrai
1f480 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f  nts && !bRev) */
1f490 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20  .      OP_IdxLT 
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
1f4b0 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1f4c0 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20  ts && bRev) */. 
1f4d0 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45     };.    int nE
1f4e0 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
1f4f0 65 65 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62  ee.nEq;  /* Numb
1f500 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74  er of == or IN t
1f510 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  erms */.    int 
1f520 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20  isMinQuery = 0; 
1f530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1f540 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   this is an opti
1f550 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e  mized SELECT min
1f560 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  (x).. */.    int
1f570 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
1f580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73            /* Bas
1f590 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
1f5a0 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61  ng constraint va
1f5b0 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lues */.    int 
1f5c0 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
1f5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
1f5e0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20   register */.   
1f5f0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
1f600 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a  geStart = 0;  /*
1f610 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
1f620 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
1f630 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65  start */.    Whe
1f640 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e  reTerm *pRangeEn
1f650 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65  d = 0;    /* Ine
1f660 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1f670 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20  nt at range end 
1f680 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
1f690 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
1f6a0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1f6b0 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73 20  ange start uses 
1f6c0 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
1f6d0 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20      int endEq;  
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6f0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
1f700 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e  e end uses ==, >
1f710 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
1f720 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  nt start_constra
1f730 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53  ints;       /* S
1f740 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73  tart of range is
1f750 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a   constrained */.
1f760 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
1f770 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
1f780 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
1f790 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a  nstraint terms *
1f7a0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
1f7b0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1f7c0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
1f7d0 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
1f7e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
1f7f0 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
1f800 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
1f810 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1f820 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
1f830 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20   nExtraReg = 0; 
1f840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f850 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
1f860 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f  isters needed */
1f870 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  .    int op;    
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f890 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
1f8a0 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63   opcode */.    c
1f8b0 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20  har *zStartAff; 
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1f8d0 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72  ffinity for star
1f8e0 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74  t of range const
1f8f0 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61  raint */.    cha
1f900 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20 20  r *zEndAff;     
1f910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
1f920 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66  inity for end of
1f930 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1f940 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d  t */..    pIdx =
1f950 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1f960 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 49 64 78  pIndex;.    iIdx
1f970 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
1f980 64 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20 28  dxCur;.    k = (
1f990 6e 45 71 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  nEq==pIdx->nColu
1f9a0 6d 6e 20 3f 20 2d 31 20 3a 20 70 49 64 78 2d 3e  mn ? -1 : pIdx->
1f9b0 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 3b 0a  aiColumn[nEq]);.
1f9c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1f9d0 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61  loop satisfies a
1f9e0 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72   sort order (pOr
1f9f0 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74  derBy) request t
1fa00 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20  hat .    ** was 
1fa10 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1fa20 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
1fa30 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
1fa40 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
1fa50 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74  ** query, then t
1fa60 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
1fa70 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f  nly allow the lo
1fa80 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20  op to run for.  
1fa90 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74    ** a single it
1faa0 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  eration. This me
1fab0 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72  ans that the fir
1fac0 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a  st row returned.
1fad0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f      ** should no
1fae0 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61  t have a NULL va
1faf0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78  lue stored in 'x
1fb00 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27  '. If column 'x'
1fb10 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66   is.    ** the f
1fb20 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74  irst one after t
1fb30 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20  he nEq equality 
1fb40 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
1fb50 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
1fb60 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73   this requires s
1fb70 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ome special hand
1fb80 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ling..    */.   
1fb90 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
1fba0 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
1fbb0 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20  RDERBY_MIN)!=0. 
1fbc0 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
1fbd0 62 4f 42 53 61 74 21 3d 30 29 0a 20 20 20 20 20  bOBSat!=0).     
1fbe0 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  && (pIdx->nColum
1fbf0 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  n>nEq).    ){.  
1fc00 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
1fc10 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
1fc20 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  1 ); */.      /*
1fc30 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1fc40 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69  y->a[0].pExpr->i
1fc50 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
1fc60 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a  Column[nEq] ); *
1fc70 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65  /.      isMinQue
1fc80 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45  ry = 1;.      nE
1fc90 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
1fca0 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
1fcb0 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
1fcc0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1fcd0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
1fce0 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  d end .    ** of
1fcf0 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
1fd00 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b   */.    j = nEq;
1fd10 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1fd20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1fd30 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1fd40 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d     pRangeStart =
1fd50 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1fd60 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  ++];.      nExtr
1fd70 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1fd80 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1fd90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
1fda0 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
1fdb0 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c    pRangeEnd = pL
1fdc0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1fdd0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1fde0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
1fdf0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1fe00 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
1fe10 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
1fe20 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
1fe30 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74  IN.    ** and st
1fe40 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ore the values o
1fe50 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e  f those terms in
1fe60 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
1fe70 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
1fe80 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73  arting at regBas
1fe90 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  e..    */.    re
1fea0 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45  gBase = codeAllE
1feb0 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
1fec0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4c        pParse, pL
1fed0 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65  evel, pWC, notRe
1fee0 61 64 79 2c 20 62 52 65 76 2c 20 6e 45 78 74 72  ady, bRev, nExtr
1fef0 61 52 65 67 2c 20 26 7a 53 74 61 72 74 41 66 66  aReg, &zStartAff
1ff00 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e 64  .    );.    zEnd
1ff10 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
1ff20 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
1ff30 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
1ff40 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
1ff50 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20  el->addrNxt;..  
1ff60 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1ff70 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f  oing a reverse o
1ff80 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20  rder scan on an 
1ff90 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  ascending index,
1ffa0 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72   or.    ** a for
1ffb0 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20  ward order scan 
1ffc0 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
1ffd0 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e  index, interchan
1ffe0 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  ge the .    ** s
1fff0 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72  tart and end ter
20000 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20  ms (pRangeStart 
20010 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a  and pRangeEnd)..
20020 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
20030 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  nEq<pIdx->nColum
20040 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78  n && bRev==(pIdx
20050 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
20060 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  ]==SQLITE_SO_ASC
20070 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76  )).     || (bRev
20080 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   && pIdx->nColum
20090 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  n==nEq).    ){. 
200a0 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54       SWAP(WhereT
200b0 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64  erm *, pRangeEnd
200c0 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
200d0 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63      }..    testc
200e0 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
200f0 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d   && pRangeStart-
20100 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
20110 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LE );.    testca
20120 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
20130 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  && pRangeStart->
20140 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
20150 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
20160 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
20170 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
20180 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a  ator & WO_LE );.
20190 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
201a0 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67  angeEnd && pRang
201b0 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
201c0 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73  & WO_GE );.    s
201d0 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65  tartEq = !pRange
201e0 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53  Start || pRangeS
201f0 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
20200 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
20210 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21  .    endEq =   !
20220 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61  pRangeEnd || pRa
20230 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
20240 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
20250 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  );.    start_con
20260 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67  straints = pRang
20270 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b  eStart || nEq>0;
20280 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
20290 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74  e index cursor t
202a0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
202b0 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
202c0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
202d0 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
202e0 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  geStart ){.     
202f0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
20300 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78  pRangeStart->pEx
20310 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
20320 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
20330 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
20340 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
20350 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
20360 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
20370 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
20380 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20390 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
203a0 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c  lJump(v, pRight,
203b0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
203c0 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  drNxt);.      }.
203d0 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74        if( zStart
203e0 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
203f0 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
20400 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
20410 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
20420 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
20430 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
20440 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
20450 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
20460 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
20470 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
20480 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
20490 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
204a0 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
204b0 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
204c0 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
204d0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
204e0 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
204f0 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
20500 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
20510 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
20520 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
20530 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
20540 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
20550 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
20560 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
20570 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
20580 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
20590 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
205a0 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
205b0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
205c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
205d0 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74   pRangeStart->wt
205e0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
205f0 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
20600 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
20610 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
20620 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20  MinQuery ){.    
20630 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20640 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
20650 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  0, regBase+nEq);
20660 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
20670 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72  nt++;.      star
20680 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  tEq = 0;.      s
20690 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
206a0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
206b0 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
206c0 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
206d0 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20  e, nConstraint, 
206e0 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
206f0 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73  op = aStartOp[(s
20700 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
20710 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c  <<2) + (startEq<
20720 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20  <1) + bRev];.   
20730 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29   assert( op!=0 )
20740 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20750 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b  op==OP_Rewind );
20760 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
20770 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20  p==OP_Last );.  
20780 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
20790 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20  OP_SeekGt );.   
207a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
207b0 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20  P_SeekGe );.    
207c0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
207d0 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74  _SeekLe );.    t
207e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
207f0 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71  SeekLt );.    sq
20800 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
20810 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
20820 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
20830 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
20840 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  );..    /* Load 
20850 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
20860 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
20870 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65  straint at the e
20880 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
20890 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e   range (if any).
208a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e  .    */.    nCon
208b0 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20  straint = nEq;. 
208c0 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64     if( pRangeEnd
208d0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
208e0 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45  pRight = pRangeE
208f0 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  nd->pExpr->pRigh
20900 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
20910 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
20920 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b  pParse, regBase+
20930 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  nEq, 1);.      s
20940 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
20950 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
20960 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
20970 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e     if( (pRangeEn
20980 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
20990 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
209a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
209b0 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
209c0 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  (v, pRight, regB
209d0 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
209e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
209f0 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a   if( zEndAff ){.
20a00 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
20a10 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
20a20 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41  ty(pRight, zEndA
20a30 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
20a40 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
20a50 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
20a60 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
20a70 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
20a80 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
20a90 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
20aa0 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
20ab0 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
20ac0 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
20ad0 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
20ae0 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
20af0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
20b00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
20b10 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  EndAff[nEq] = SQ
20b20 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
20b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20b40 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
20b50 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
20b60 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45  hange(pRight, zE
20b70 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  ndAff[nEq]) ){. 
20b80 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66           zEndAff
20b90 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
20ba0 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
20bb0 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20   }.      }  .   
20bc0 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
20bd0 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
20be0 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e  Base, nEq+1, zEn
20bf0 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f  dAff);.      nCo
20c00 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
20c10 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
20c20 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
20c30 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
20c40 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
20c50 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  11662 */.    }. 
20c60 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
20c70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74  (pParse->db, zSt
20c80 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c  artAff);.    sql
20c90 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
20ca0 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b  e->db, zEndAff);
20cb0 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  ..    /* Top of 
20cc0 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f  the loop body */
20cd0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
20ce0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
20cf0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
20d00 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
20d10 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69  e index cursor i
20d20 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
20d30 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
20d40 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b      op = aEndOp[
20d50 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45  (pRangeEnd || nE
20d60 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d  q) * (1 + bRev)]
20d70 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20d80 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20  op==OP_Noop );. 
20d90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20da0 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
20db0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
20dc0 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69  P_IdxLT );.    i
20dd0 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  f( op!=OP_Noop )
20de0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
20df0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
20e00 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
20e10 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
20e20 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
20e30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
20e40 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21  angeP5(v, endEq!
20e50 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20  =bRev ?1:0);.   
20e60 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
20e70 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69  ere are inequali
20e80 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
20e90 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
20ea0 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  alue.    ** of t
20eb0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
20ec0 74 68 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c  that the inequal
20ed0 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73  ity contrains is
20ee0 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a   not NULL..    *
20ef0 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70  * If it is, jump
20f00 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
20f10 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
20f20 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
20f30 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
20f40 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
20f50 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 6f     testcase( pLo
20f60 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
20f70 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b  ERE_BTM_LIMIT );
20f80 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
20f90 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
20fa0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
20fb0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  );.    if( (pLoo
20fc0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
20fd0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48  ERE_BTM_LIMIT|WH
20fe0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21  ERE_TOP_LIMIT))!
20ff0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
21000 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
21010 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78   OP_Column, iIdx
21020 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20  Cur, nEq, r1);. 
21030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21040 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
21050 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e  ull, r1, addrCon
21060 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
21070 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
21080 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
21090 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
210a0 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20  e table cursor, 
210b0 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
210c0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
210d0 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61  Level, pRangeSta
210e0 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65  rt);.    disable
210f0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
21100 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28  ngeEnd);.    if(
21110 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20   !omitTable ){. 
21120 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d       iRowidReg =
21130 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73   iReleaseReg = s
21140 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
21150 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
21160 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21170 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64  2(v, OP_IdxRowid
21180 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69  , iIdxCur, iRowi
21190 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
211a0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
211b0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
211c0 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
211d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
211e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
211f0 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  eek, iCur, iRowi
21200 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72  dReg);  /* Defer
21210 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20  red seek */.    
21220 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  }..    /* Record
21230 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
21240 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61   used to termina
21250 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73  te the loop. Dis
21260 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45  able .    ** WHE
21270 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
21280 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62  made redundant b
21290 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67  y the index rang
212a0 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  e scan..    */. 
212b0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
212c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
212d0 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 4c  EROW ){.      pL
212e0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
212f0 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  op;.    }else if
21300 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
21310 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
21320 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Prev;.    }else{
21330 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
21340 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  p = OP_Next;.   
21350 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70   }.    pLevel->p
21360 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  1 = iIdxCur;.   
21370 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
21380 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e  lags & WHERE_CON
21390 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20  STRAINT)==0 ){. 
213a0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
213b0 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
213c0 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
213d0 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  P;.    }else{.  
213e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
213f0 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
21400 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
21410 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21420 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
21430 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
21440 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
21450 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20  TI_OR ){.    /* 
21460 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20  Case 5:  Two or 
21470 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20  more separately 
21480 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
21490 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20  nnected by OR.  
214a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
214b0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
214c0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
214d0 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20  E t1(a,b,c,d);. 
214e0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
214f0 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29  NDEX i1 ON t1(a)
21500 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
21510 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31  E INDEX i2 ON t1
21520 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (b);.    **   CR
21530 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
21540 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20   t1(c);.    **. 
21550 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a     **   SELECT *
21560 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
21570 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d  =5 OR b=7 OR (c=
21580 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20  11 AND d=13).   
21590 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68   **.    ** In th
215a0 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65  e example, there
215b0 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78   are three index
215c0 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
215d0 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a  ed by OR..    **
215e0 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
215f0 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  loop looks like 
21600 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
21610 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
21620 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
21630 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
21640 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
21650 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  g 1.    **.    *
21660 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68  * Then, for each
21670 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74   indexed term, t
21680 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68  he following. Th
21690 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
216a0 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74     ** RowSetTest
216b0 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74   are such that t
216c0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
216d0 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69  current row is i
216e0 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69  nserted.    ** i
216f0 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20  nto the RowSet. 
21700 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
21710 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f   present, contro
21720 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20  l skips the.    
21730 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20  ** Gosub opcode 
21740 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67  and jumps straig
21750 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ht to the code g
21760 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72  enerated by Wher
21770 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  eEnd()..    **. 
21780 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
21790 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c  ite3WhereBegin(<
217a0 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20  term>).    **   
217b0 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73         RowSetTes
217c0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
217d0 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69     # Insert rowi
217e0 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20  d into rowset.  
217f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
21800 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20  sub      2 A.   
21810 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
21820 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20  e3WhereEnd().   
21830 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f   **.    ** Follo
21840 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20  wing the above, 
21850 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74  code to terminat
21860 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65  e the loop. Labe
21870 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a  l A, the target.
21880 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f      ** of the Go
21890 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73  sub above, jumps
218a0 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
218b0 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20  ion right after 
218c0 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a  the Goto..    **
218d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
218e0 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
21900 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
21910 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20  n reg 1.    **  
21920 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20          Goto    
21930 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20     B            
21940 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69      # The loop i
21950 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20  s finished..    
21960 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
21970 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20  A: <loop body>  
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
21990 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68   Return data, wh
219a0 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  atever..    **. 
219b0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
219c0 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20  eturn     2     
219d0 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d             # Jum
219e0 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f  p back to the Go
219f0 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sub.    **.    *
21a00 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65  *       B: <afte
21a10 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20  r the loop>.    
21a20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68  **.    */.    Wh
21a30 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
21a40 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63  ;    /* The OR-c
21a50 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74  lause broken out
21a60 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
21a70 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  /.    SrcList *p
21a80 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  OrTab;       /* 
21a90 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
21aa0 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73  list or OR-claus
21ab0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
21ac0 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20      Index *pCov 
21ad0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
21ae0 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f   /* Potential co
21af0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72  vering index (or
21b00 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e   NULL) */.    in
21b10 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72  t iCovCur = pPar
21b20 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20  se->nTab++;  /* 
21b30 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  Cursor used for 
21b40 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20  index scans (if 
21b50 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  any) */..    int
21b60 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70   regReturn = ++p
21b70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
21b80 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
21b90 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f  er used with OP_
21ba0 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74  Gosub */.    int
21bb0 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20   regRowset = 0; 
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bd0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
21be0 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62  er for RowSet ob
21bf0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
21c00 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  regRowid = 0;   
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
21c30 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20  r holding rowid 
21c40 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70  */.    int iLoop
21c50 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
21c60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
21c70 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f   /* Start of loo
21c80 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e  p body */.    in
21c90 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20  t iRetInit;     
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cb0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
21cc0 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20  ss of regReturn 
21cd0 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  init */.    int 
21ce0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
21cf0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
21d00 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74  * Some terms not
21d10 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74   completely test
21d20 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  ed */.    int ii
21d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21d50 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
21d60 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78      Expr *pAndEx
21d70 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pr = 0;         
21d80 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e         /* An "..
21d90 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72   AND (...)" expr
21da0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20  ession */.   .  
21db0 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d    pTerm = pLoop-
21dc0 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  >aLTerm[0];.    
21dd0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
21de0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21df0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
21e00 20 26 20 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20   & WO_OR );.    
21e10 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
21e20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
21e30 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20  RINFO)!=0 );.   
21e40 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d   pOrWc = &pTerm-
21e50 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
21e60 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
21e70 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20   OP_Return;.    
21e80 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67  pLevel->p1 = reg
21e90 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Return;..    /* 
21ea0 53 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63  Set up a new Src
21eb0 4c 69 73 74 20 69 6e 20 70 4f 72 54 61 62 20 63  List in pOrTab c
21ec0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
21ed0 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  ble being scanne
21ee0 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
21ef0 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30   loop in the a[0
21f00 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e  ] slot and all n
21f10 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69  otReady tables i
21f20 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a  n a[1..] slots..
21f30 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f      ** This beco
21f40 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  mes the SrcList 
21f50 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65  in the recursive
21f60 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
21f70 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20  WhereBegin()..  
21f80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49    */.    if( pWI
21f90 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b  nfo->nLevel>1 ){
21fa0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52  .      int nNotR
21fb0 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
21fc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
21fd0 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20  ber of notReady 
21fe0 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
21ff0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22000 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20  tem *origSrc;   
22010 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69    /* Original li
22020 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
22030 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20        nNotReady 
22040 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
22050 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20   - iLevel - 1;. 
22060 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71       pOrTab = sq
22070 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52  lite3StackAllocR
22080 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  aw(pParse->db,. 
22090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220a0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
220b0 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74  f(*pOrTab)+ nNot
220c0 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72  Ready*sizeof(pOr
220d0 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  Tab->a[0]));.   
220e0 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30     if( pOrTab==0
220f0 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61   ) return notRea
22100 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  dy;.      pOrTab
22110 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36 29  ->nAlloc = (i16)
22120 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b  (nNotReady + 1);
22130 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e  .      pOrTab->n
22140 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41  Src = pOrTab->nA
22150 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63  lloc;.      memc
22160 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54  py(pOrTab->a, pT
22170 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a  abItem, sizeof(*
22180 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20  pTabItem));.    
22190 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e    origSrc = pWIn
221a0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b  fo->pTabList->a;
221b0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20  .      for(k=1; 
221c0 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b  k<=nNotReady; k+
221d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  +){.        memc
221e0 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  py(&pOrTab->a[k]
221f0 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65  , &origSrc[pLeve
22200 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a  l[k].iFrom], siz
22210 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  eof(pOrTab->a[k]
22220 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
22230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72  }else{.      pOr
22240 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Tab = pWInfo->pT
22250 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20  abList;.    }.. 
22260 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
22270 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69   the rowset regi
22280 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ster to contain 
22290 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c  NULL. An SQL NUL
222a0 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75  L is .    ** equ
222b0 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d  ivalent to an em
222c0 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20  pty rowset..    
222d0 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69  **.    ** Also i
222e0 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74  nitialize regRet
222f0 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  urn to contain t
22300 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
22310 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20  e instruction . 
22320 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
22330 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
22340 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65  OP_Return at the
22350 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
22360 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  oop. This.    **
22370 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
22380 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45  a few obscure LE
22390 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68  FT JOIN cases wh
223a0 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70  ere control jump
223b0 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68  s.    ** over th
223c0 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
223d0 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  p into the body 
223e0 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63  of it. In this c
223f0 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ase the .    ** 
22400 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65  correct response
22410 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d   for the end-of-
22420 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f  loop code (the O
22430 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20  P_Return) is to 
22440 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72  .    ** fall thr
22450 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
22460 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75   instruction, ju
22470 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74  st as an OP_Next
22480 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20   does if.    ** 
22490 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69  called on an uni
224a0 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f  nitialized curso
224b0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
224c0 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
224d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
224e0 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
224f0 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 73  ){.      regRows
22500 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
22510 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f  Mem;.      regRo
22520 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
22530 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
22540 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22550 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
22560 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20  Rowset);.    }. 
22570 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71     iRetInit = sq
22580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22590 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
225a0 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
225b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 72 69     /* If the ori
225c0 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ginal WHERE clau
225d0 73 65 20 69 73 20 7a 20 6f 66 20 74 68 65 20 66  se is z of the f
225e0 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20 78 32 20  orm:  (x1 OR x2 
225f0 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20  OR ...) AND y.  
22600 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72 20 65 76    ** Then for ev
22610 65 72 79 20 74 65 72 6d 20 78 4e 2c 20 65 76 61  ery term xN, eva
22620 6c 75 61 74 65 20 61 73 20 74 68 65 20 73 75 62  luate as the sub
22630 65 78 70 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41  expression: xN A
22640 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74  ND z.    ** That
22650 20 77 61 79 2c 20 74 65 72 6d 73 20 69 6e 20 79   way, terms in y
22660 20 74 68 61 74 20 61 72 65 20 66 61 63 74 6f 72   that are factor
22670 65 64 20 69 6e 74 6f 20 74 68 65 20 64 69 73 6a  ed into the disj
22680 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  unction will.   
22690 20 2a 2a 20 62 65 20 70 69 63 6b 65 64 20 75 70   ** be picked up
226a0 20 62 79 20 74 68 65 20 72 65 63 75 72 73 69 76   by the recursiv
226b0 65 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  e calls to sqlit
226c0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 62  e3WhereBegin() b
226d0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  elow..    **.   
226e0 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 65 61   ** Actually, ea
226f0 63 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ch subexpression
22700 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f   is converted to
22710 20 22 78 4e 20 41 4e 44 20 77 22 20 77 68 65 72   "xN AND w" wher
22720 65 20 77 20 69 73 0a 20 20 20 20 2a 2a 20 74 68  e w is.    ** th
22730 65 20 22 69 6e 74 65 72 65 73 74 69 6e 67 22 20  e "interesting" 
22740 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72  terms of z - ter
22750 6d 73 20 74 68 61 74 20 64 69 64 20 6e 6f 74 20  ms that did not 
22760 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
22770 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53  .    ** ON or US
22780 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
22790 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74  LEFT JOIN, and t
227a0 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 75 73  erms that are us
227b0 61 62 6c 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  able as .    ** 
227c0 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
227d0 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69      ** This opti
227e0 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e  mization also on
227f0 6c 79 20 61 70 70 6c 69 65 73 20 69 66 20 74 68  ly applies if th
22800 65 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e  e (x1 OR x2 OR .
22810 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20  ..) term.    ** 
22820 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
22830 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
22840 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
22850 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 69 63  ..    ** See tic
22860 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  ket http://www.s
22870 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
22880 66 6f 2f 66 32 33 36 39 33 30 34 65 34 0a 20 20  fo/f2369304e4.  
22890 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 43    */.    if( pWC
228a0 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20  ->nTerm>1 ){.   
228b0 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20     int iTerm;.  
228c0 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b      for(iTerm=0;
228d0 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72   iTerm<pWC->nTer
228e0 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  m; iTerm++){.   
228f0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
22900 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d   = pWC->a[iTerm]
22910 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
22920 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
22930 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
22940 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e  omJoin) ) contin
22950 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
22960 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74  pWC->a[iTerm].wt
22970 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
22980 52 54 55 41 4c 7c 54 45 52 4d 5f 4f 52 49 4e 46  RTUAL|TERM_ORINF
22990 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  O) ) continue;. 
229a0 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d         if( (pWC-
229b0 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61  >a[iTerm].eOpera
229c0 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30  tor & WO_ALL)==0
229d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
229e0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
229f0 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
22a00 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30  se->db, pExpr, 0
22a10 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45  );.        pAndE
22a20 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
22a30 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
22a40 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72   pAndExpr, pExpr
22a50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22a60 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
22a70 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
22a80 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
22a90 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c  (pParse, TK_AND,
22aa0 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29   0, pAndExpr, 0)
22ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22ac0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
22ad0 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20  i<pOrWc->nTerm; 
22ae0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65  ii++){.      Whe
22af0 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20  reTerm *pOrTerm 
22b00 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b  = &pOrWc->a[ii];
22b10 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
22b20 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
22b30 69 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d  iCur || (pOrTerm
22b40 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
22b50 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
22b60 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70      WhereInfo *p
22b70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  SubWInfo;       
22b80 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73     /* Info for s
22b90 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63  ingle OR-term sc
22ba0 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  an */.        Ex
22bb0 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f  pr *pOrExpr = pO
22bc0 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  rTerm->pExpr;.  
22bd0 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78        if( pAndEx
22be0 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72  pr && !ExprHasPr
22bf0 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20  operty(pOrExpr, 
22c00 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
22c10 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78            pAndEx
22c20 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45  pr->pLeft = pOrE
22c30 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  xpr;.          p
22c40 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70  OrExpr = pAndExp
22c50 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
22c60 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
22c70 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
22c80 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
22c90 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
22ca0 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f         pSubWInfo
22cb0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
22cc0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72  egin(pParse, pOr
22cd0 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c  Tab, pOrExpr, 0,
22ce0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
22d00 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
22d10 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  E | WHERE_AND_ON
22d20 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  LY |.           
22d30 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
22d40 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c  RE_FORCE_TABLE |
22d50 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
22d60 4f 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a  ONLY, iCovCur);.
22d70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22d80 70 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61  pSubWInfo || pPa
22d90 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61  rse->nErr || pPa
22da0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
22db0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
22dc0 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29   if( pSubWInfo )
22dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
22de0 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b  eLoop *pSubLoop;
22df0 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61  .          expla
22e00 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
22e10 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
22e20 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49   pOrTab, &pSubWI
22e30 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65  nfo->a[0], iLeve
22e40 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  l, pLevel->iFrom
22e50 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b  , 0.          );
22e60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
22e70 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
22e80 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
22e90 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
22eb0 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72  iSet = ((ii==pOr
22ec0 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a  Wc->nTerm-1)?-1:
22ed0 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii);.           
22ee0 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20   int r;.        
22ef0 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45      r = sqlite3E
22f00 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
22f10 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
22f20 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75  m->pTab, -1, iCu
22f30 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
22f60 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20  Rowid, 0);.     
22f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22f80 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
22f90 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65  P_RowSetTest, re
22fa0 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20 20  gRowset,.       
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22fd0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
22fe0 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b  (v)+2, r, iSet);
22ff0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23010 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
23020 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c  osub, regReturn,
23030 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20   iLoopBody);..  
23040 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
23050 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  SubWInfo->untest
23060 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61  edTerms flag mea
23070 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52 20  ns that this OR 
23080 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a  term.          *
23090 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20  * contained one 
230a0 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d  or more AND term
230b0 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79   from a notReady
230c0 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20   table.  The.   
230d0 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20         ** terms 
230e0 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64  from the notRead
230f0 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f  y table could no
23100 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64 20  t be tested and 
23110 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a  will.          *
23120 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73  * need to be tes
23130 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20  ted later..     
23140 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23150 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d    if( pSubWInfo-
23160 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29  >untestedTerms )
23170 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
23180 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f   1;..          /
23190 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
231a0 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
231b0 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64  ms are optimized
231c0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a   using the same.
231d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64            ** ind
231e0 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ex, and the inde
231f0 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  x is opened usin
23200 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f  g the same curso
23210 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20  r number.       
23220 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61     ** by each ca
23230 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
23240 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62  reBegin() made b
23250 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20  y this loop, it 
23260 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  may.          **
23270 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
23280 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20 61  use that index a
23290 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
232a0 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ex..          **
232b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
232c0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
232d0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
232e0 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20   above resulted 
232f0 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20  in a scan that. 
23300 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73           ** uses
23310 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74   an index, and t
23320 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74 68  his is either th
23330 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65  e first OR-conne
23340 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20  cted term.      
23350 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
23360 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69 73   or the index is
23370 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 61   the same as tha
23380 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72  t used by all pr
23390 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
233a0 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70   ** terms, set p
233b0 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69  Cov to the candi
233c0 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e  date covering in
233d0 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  dex. Otherwise, 
233e0 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  set .          *
233f0 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74  * pCov to NULL t
23400 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
23410 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76  no candidate cov
23420 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c  ering index will
23430 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
23440 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20  e available..   
23450 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23460 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70      pSubLoop = p
23470 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70  SubWInfo->a[0].p
23480 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  WLoop;.         
23490 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e   if( (pSubLoop->
234a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
234b0 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
234c0 20 20 20 20 20 20 20 26 26 20 28 70 53 75 62 4c         && (pSubL
234d0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
234e0 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
234f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
23500 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62  & (ii==0 || pSub
23510 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
23520 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20  ndex==pCov).    
23530 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
23540 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
23550 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64  bWInfo->a[0].iId
23560 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b  xCur==iCovCur );
23570 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
23580 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e  v = pSubLoop->u.
23590 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
235a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
235b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
235c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
235d0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ..          /* F
235e0 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74  inish the loop t
235f0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
23600 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
23610 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
23620 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23630 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62 57  e3WhereEnd(pSubW
23640 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  Info);.        }
23650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23660 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f     pLevel->u.pCo
23670 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20  vidx = pCov;.   
23680 20 69 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76   if( pCov ) pLev
23690 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43  el->iIdxCur = iC
236a0 6f 76 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70  ovCur;.    if( p
236b0 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20  AndExpr ){.     
236c0 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
236d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
236e0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
236f0 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78  arse->db, pAndEx
23700 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  pr);.    }.    s
23710 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
23720 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20  P1(v, iRetInit, 
23730 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
23740 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
23750 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23760 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
23770 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
23780 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
23790 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
237a0 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
237b0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
237c0 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65  Level>1 ) sqlite
237d0 33 53 74 61 63 6b 46 72 65 65 28 70 50 61 72 73  3StackFree(pPars
237e0 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a  e->db, pOrTab);.
237f0 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65      if( !unteste
23800 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65  dTerms ) disable
23810 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
23820 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  rm);.  }else.#en
23830 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
23840 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
23850 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f  ON */..  {.    /
23860 2a 20 43 61 73 65 20 36 3a 20 20 54 68 65 72 65  * Case 6:  There
23870 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e   is no usable in
23880 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f  dex.  We must do
23890 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20   a complete.    
238a0 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e  **          scan
238b0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
238c0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
238d0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
238e0 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f   aStep[] = { OP_
238f0 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b  Next, OP_Prev };
23900 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
23910 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20  t u8 aStart[] = 
23920 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f  { OP_Rewind, OP_
23930 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65  Last };.    asse
23940 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62  rt( bRev==0 || b
23950 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70 4c  Rev==1 );.    pL
23960 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70  evel->op = aStep
23970 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76  [bRev];.    pLev
23980 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
23990 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
239a0 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
239b0 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b  ddOp2(v, aStart[
239c0 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64  bRev], iCur, add
239d0 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65  rBrk);.    pLeve
239e0 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
239f0 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
23a00 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e  AN_STEP;.  }.  n
23a10 65 77 4e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74  ewNotReady = not
23a20 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b  Ready & ~getMask
23a30 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
23a40 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a  et, iCur);..  /*
23a50 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
23a60 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78  test every subex
23a70 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61  pression that ca
23a80 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  n be completely.
23a90 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73    ** computed us
23aa0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
23ab0 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20  set of tables.. 
23ac0 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
23ad0 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39  NTATION-OF: R-49
23ae0 35 32 35 2d 35 30 39 33 35 20 54 65 72 6d 73 20  525-50935 Terms 
23af0 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 73  that cannot be s
23b00 61 74 69 73 66 69 65 64 20 74 68 72 6f 75 67 68  atisfied through
23b10 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66  .  ** the use of
23b20 20 69 6e 64 69 63 65 73 20 62 65 63 6f 6d 65 20   indices become 
23b30 74 65 73 74 73 20 74 68 61 74 20 61 72 65 20 65  tests that are e
23b40 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74  valuated against
23b50 20 65 61 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a   each row of.  *
23b60 2a 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 69  * the relevant i
23b70 6e 70 75 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a  nput tables..  *
23b80 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  /.  for(pTerm=pW
23b90 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65  C->a, j=pWC->nTe
23ba0 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54  rm; j>0; j--, pT
23bb0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  erm++){.    Expr
23bc0 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61   *pE;.    testca
23bd0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
23be0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
23bf0 4c 20 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33  L ); /* IMP: R-3
23c00 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
23c10 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
23c20 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
23c30 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69  M_CODED );.    i
23c40 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
23c50 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
23c60 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
23c70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
23c80 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
23c90 41 6c 6c 20 26 20 6e 65 77 4e 6f 74 52 65 61 64  All & newNotRead
23ca0 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  y)!=0 ){.      t
23cb0 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d  estcase( pWInfo-
23cc0 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d  >untestedTerms==
23cd0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
23ce0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
23cf0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
23d00 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d  ONETABLE_ONLY)!=
23d10 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  0 );.      pWInf
23d20 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
23d30 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 1;.      cont
23d40 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
23d50 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
23d60 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
23d70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  E!=0 );.    if( 
23d80 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
23d90 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  n && !ExprHasPro
23da0 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
23db0 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
23dc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
23dd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
23de0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
23df0 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  E, addrCont, SQL
23e00 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
23e10 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
23e20 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
23e30 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73  D;.  }..  /* Ins
23e40 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
23e50 20 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e   for implied con
23e60 73 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f  straints based o
23e70 6e 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20  n transitivity. 
23e80 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20   ** of the "==" 
23e90 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
23ea0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20   ** Example: If 
23eb0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
23ec0 20 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d   contains "t1.a=
23ed0 74 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d  t2.b" and "t2.b=
23ee0 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65  123".  ** and we
23ef0 20 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20   are coding the 
23f00 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20  t1 loop and the 
23f10 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20  t2 loop has not 
23f20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20  yet coded,.  ** 
23f30 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75  then we cannot u
23f40 73 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e  se the "t1.a=t2.
23f50 62 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62  b" constraint, b
23f60 75 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20  ut we can code. 
23f70 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20   ** the implied 
23f80 22 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74  "t1.a=123" const
23f90 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
23fa0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
23fb0 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e  j=pWC->nTerm; j>
23fc0 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
23fd0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a  {.    Expr *pE;.
23fe0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
23ff0 41 6c 74 3b 0a 20 20 20 20 45 78 70 72 20 73 45  Alt;.    Expr sE
24000 71 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  q;.    if( pTerm
24010 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
24020 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
24030 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
24040 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
24050 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f  >eOperator!=(WO_
24060 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63  EQUIV|WO_EQ) ) c
24070 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
24080 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
24090 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  or!=iCur ) conti
240a0 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54  nue;.    pE = pT
240b0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
240c0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
240d0 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
240e0 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20  FromJoin) );.   
240f0 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
24100 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
24110 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ewNotReady)!=0 )
24120 3b 0a 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e  ;.    pAlt = fin
24130 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
24140 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
24150 6c 75 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20  lumn, notReady, 
24160 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
24170 0a 20 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30  .    if( pAlt==0
24180 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24190 20 69 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61   if( pAlt->wtFla
241a0 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44  gs & (TERM_CODED
241b0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
241c0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
241d0 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72 61  t((v, "begin tra
241e0 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69  nsitive constrai
241f0 6e 74 22 29 29 3b 0a 20 20 20 20 73 45 71 20 3d  nt"));.    sEq =
24200 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20   *pAlt->pExpr;. 
24210 20 20 20 73 45 71 2e 70 4c 65 66 74 20 3d 20 70     sEq.pLeft = p
24220 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 73 71  E->pLeft;.    sq
24230 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24240 28 70 50 61 72 73 65 2c 20 26 73 45 71 2c 20 61  (pParse, &sEq, a
24250 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
24260 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d  JUMPIFNULL);.  }
24270 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
24280 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
24290 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
242a0 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
242b0 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
242c0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
242d0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
242e0 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
242f0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
24300 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
24310 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
24320 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
24330 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
24340 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
24350 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
24360 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24370 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
24380 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
24390 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
243a0 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
243b0 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
243c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
243d0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
243e0 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
243f0 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
24400 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
24410 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
24420 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
24430 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
24440 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49  VIRTUAL );  /* I
24450 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  MP: R-30575-1166
24460 32 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  2 */.      testc
24470 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
24480 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
24490 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
244a0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
244b0 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
244c0 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
244d0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
244e0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
244f0 20 26 20 6e 65 77 4e 6f 74 52 65 61 64 79 29 21   & newNotReady)!
24500 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
24510 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e  sert( pWInfo->un
24520 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20  testedTerms );. 
24530 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
24540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
24550 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
24560 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  xpr );.      sql
24570 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
24580 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
24590 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Expr, addrCont, 
245a0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
245b0 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  L);.      pTerm-
245c0 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
245d0 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
245e0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
245f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
24600 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
24610 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 4e 6f 74  .  return newNot
24620 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 64 65 66  Ready;.}..#ifdef
24630 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
24640 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
24650 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
24660 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ct for debugging
24670 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61   purposes.*/.sta
24680 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
24690 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f  opPrint(WhereLoo
246a0 70 20 2a 70 2c 20 53 72 63 4c 69 73 74 20 2a 70  p *p, SrcList *p
246b0 54 61 62 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20  TabList){.  int 
246c0 6e 62 20 3d 20 31 2b 28 70 54 61 62 4c 69 73 74  nb = 1+(pTabList
246d0 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73  ->nSrc+7)/8;.  s
246e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
246f0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 54 61 62  em *pItem = pTab
24700 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61  List->a + p->iTa
24710 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  b;.  Table *pTab
24720 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
24730 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24740 69 6e 74 66 28 22 25 63 20 25 32 64 2e 25 30 2a  intf("%c %2d.%0*
24750 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e  llx.%0*llx", p->
24760 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cId,.           
24770 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61            p->iTa
24780 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65  b, nb, p->maskSe
24790 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65  lf, nb, p->prere
247a0 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  q);.  sqlite3Deb
247b0 75 67 50 72 69 6e 74 66 28 22 20 25 38 73 22 2c  ugPrintf(" %8s",
247c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
247d0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c        pItem->zAl
247e0 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c  ias ? pItem->zAl
247f0 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d  ias : pTab->zNam
24800 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73  e);.  if( (p->ws
24810 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
24820 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
24830 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62  {.    if( p->u.b
24840 74 72 65 65 2e 70 49 6e 64 65 78 20 29 7b 0a 20  tree.pIndex ){. 
24850 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
24860 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  *zName = p->u.bt
24870 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
24880 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61  e;.      if( zNa
24890 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d 65 20 3d 20  me==0 ) zName = 
248a0 22 69 70 6b 22 3b 0a 20 20 20 20 20 20 69 66 28  "ipk";.      if(
248b0 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20   strncmp(zName, 
248c0 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
248d0 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20  x_", 17)==0 ){. 
248e0 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73         int i = s
248f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
24900 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20  Name) - 1;.     
24910 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b     while( zName[
24920 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20  i]!='_' ) i--;. 
24930 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20         zName += 
24940 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  i;.      }.     
24950 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24960 6e 74 66 28 22 2e 25 2d 31 32 73 20 25 32 64 22  ntf(".%-12s %2d"
24970 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74  , zName, p->u.bt
24980 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65  ree.nEq);.    }e
24990 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
249a0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
249b0 31 36 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a  16s","");.    }.
249c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
249d0 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d  r *z;.    if( p-
249e0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29  >u.vtab.idxStr )
249f0 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
24a00 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64  te3_mprintf("(%d
24a10 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20  ,\"%s\",%x)",.  
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
24a30 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
24a40 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
24a50 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  , p->u.vtab.omit
24a60 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Mask);.    }else
24a70 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
24a80 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64  te3_mprintf("(%d
24a90 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62  ,%x)", p->u.vtab
24aa0 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74  .idxNum, p->u.vt
24ab0 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
24ac0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
24ad0 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31  ebugPrintf(" %-1
24ae0 35 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  5s", z);.    sql
24af0 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
24b00 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
24b10 50 72 69 6e 74 66 28 22 20 66 67 20 25 30 35 78  Printf(" fg %05x
24b20 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61   N %d", p->wsFla
24b30 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a  gs, p->nLTerm);.
24b40 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24b50 69 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25  intf(" cost %d,%
24b60 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74  d,%d\n", p->rSet
24b70 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  up, p->rRun, p->
24b80 6e 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  nOut);.}.#endif.
24b90 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62  ./*.** Convert b
24ba0 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20  ulk memory into 
24bb0 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f  a valid WhereLoo
24bc0 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61  p that can be pa
24bd0 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65  ssed.** to where
24be0 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65  LoopClear harmle
24bf0 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssly..*/.static 
24c00 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e  void whereLoopIn
24c10 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  it(WhereLoop *p)
24c20 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  {.  p->aLTerm = 
24c30 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a  p->aLTermSpace;.
24c40 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b    p->nLTerm = 0;
24c50 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41  .  p->nLSlot = A
24c60 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65  rraySize(p->aLTe
24c70 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77  rmSpace);.  p->w
24c80 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f  sFlags = 0;.}../
24c90 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57  *.** Clear the W
24ca0 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e  hereLoop.u union
24cb0 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f  .  Leave WhereLo
24cc0 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74  op.pLTerm intact
24cd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24ce0 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
24cf0 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  nion(sqlite3 *db
24d00 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
24d10 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
24d20 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55  s & (WHERE_VIRTU
24d30 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 54 45  ALTABLE|WHERE_TE
24d40 4d 50 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  MP_INDEX) ){.   
24d50 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
24d60 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
24d70 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e  TABLE)!=0 && p->
24d80 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
24d90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24da0 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e  _free(p->u.vtab.
24db0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70  idxStr);.      p
24dc0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
24dd0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  e = 0;.      p->
24de0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
24df0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
24e00 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
24e10 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
24e20 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65  !=0 && p->u.btre
24e30 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  e.pIndex!=0 ){. 
24e40 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
24e50 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
24e60 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66  e.pIndex->zColAf
24e70 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
24e80 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
24e90 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a  .btree.pIndex);.
24ea0 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65        p->u.btree
24eb0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
24ec0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
24ed0 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72  Deallocate inter
24ee0 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  nal memory used 
24ef0 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  by a WhereLoop o
24f00 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
24f10 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c  void whereLoopCl
24f20 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ear(sqlite3 *db,
24f30 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
24f40 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
24f50 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
24f60 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
24f70 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
24f80 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
24f90 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20  Union(db, p);.  
24fa0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
24fb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  ;.}../*.** Incre
24fc0 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ase the memory a
24fd0 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c  llocation for pL
24fe0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f  oop->aLTerm[] to
24ff0 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a   be at least n..
25000 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
25010 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71  ereLoopResize(sq
25020 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
25030 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b  Loop *p, int n){
25040 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70  .  WhereTerm **p
25050 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  aNew;.  if( p->n
25060 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72  LSlot>=n ) retur
25070 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e  n SQLITE_OK;.  n
25080 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70   = (n+7)&~7;.  p
25090 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
250a0 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
250b0 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
250c0 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e  ])*n);.  if( paN
250d0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
250e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
250f0 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e  emcpy(paNew, p->
25100 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70  aLTerm, sizeof(p
25110 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e  ->aLTerm[0])*p->
25120 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70  nLSlot);.  if( p
25130 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
25140 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
25150 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
25160 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c  aLTerm);.  p->aL
25170 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20  Term = paNew;.  
25180 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20  p->nLSlot = n;. 
25190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
251a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  K;.}../*.** Tran
251b0 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f  sfer content fro
251c0 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f  m the second pLo
251d0 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73  op into the firs
251e0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
251f0 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73   whereLoopXfer(s
25200 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
25210 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72  eLoop *pTo, Wher
25220 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20  eLoop *pFrom){. 
25230 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
25240 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46  size(db, pTo, pF
25250 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 20 72  rom->nLTerm) ) r
25260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
25270 45 4d 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  EM;.  whereLoopC
25280 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54  learUnion(db, pT
25290 6f 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f  o);.  memcpy(pTo
252a0 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c  , pFrom, WHERE_L
252b0 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20  OOP_XFER_SZ);.  
252c0 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65  memcpy(pTo->aLTe
252d0 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72  rm, pFrom->aLTer
252e0 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73  m, pTo->nLTerm*s
252f0 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72  izeof(pTo->aLTer
25300 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46  m[0]));.  if( pF
25310 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  rom->wsFlags & W
25320 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
25330 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  E ){.    pFrom->
25340 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
25350 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
25360 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73   (pFrom->wsFlags
25370 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
25380 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  DEX)!=0 ){.    p
25390 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49  From->u.btree.pI
253a0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
253b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
253c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
253d0 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  e a WhereLoop ob
253e0 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
253f0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c  oid whereLoopDel
25400 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
25410 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
25420 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
25430 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  (db, p);.  sqlit
25440 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
25450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
25460 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
25470 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
25480 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
25490 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
254a0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
254b0 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
254c0 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 77  pWInfo) ){.    w
254d0 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
254e0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
254f0 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
25500 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20  ->pLoops ){.    
25510 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d    WhereLoop *p =
25520 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b   pWInfo->pLoops;
25530 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
25540 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74  Loops = p->pNext
25550 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72  Loop;.      wher
25560 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
25570 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
25580 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25590 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
255a0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20  /*.** Insert or 
255b0 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c  replace a WhereL
255c0 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20  oop entry using 
255d0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70  the template sup
255e0 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  plied..**.** An 
255f0 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
25600 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62  op entry might b
25610 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
25620 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
25630 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61  e.** is better a
25640 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70  nd has fewer dep
25650 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74  endencies.  Or t
25660 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c  he template will
25670 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61   be ignored.** a
25680 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c  nd no insert wil
25690 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78  l occur if an ex
256a0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
256b0 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68   is faster and h
256c0 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65  as.** fewer depe
256d0 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
256e0 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68  e template.  Oth
256f0 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65  erwise a new Whe
25700 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64  reLoop is.** add
25710 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
25720 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  template..**.** 
25730 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65  If pBuilder->pBe
25740 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  st is not NULL t
25750 68 65 6e 20 77 65 20 6f 6e 6c 79 20 63 61 72 65  hen we only care
25760 20 61 62 6f 75 74 20 74 68 65 20 76 65 72 79 0a   about the very.
25770 2a 2a 20 62 65 73 74 20 74 65 6d 70 6c 61 74 65  ** best template
25780 20 61 6e 64 20 74 68 61 74 20 74 65 6d 70 6c 61   and that templa
25790 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  te should be sto
257a0 72 65 64 20 69 6e 20 70 42 75 69 6c 64 65 72 2d  red in pBuilder-
257b0 3e 70 42 65 73 74 2e 0a 2a 2a 20 49 66 20 70 42  >pBest..** If pB
257c0 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73  uilder->pBest is
257d0 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 6c 69 73   NULL then a lis
257e0 74 20 6f 66 20 74 68 65 20 62 65 73 74 20 74 65  t of the best te
257f0 6d 70 6c 61 74 65 73 20 61 72 65 20 73 74 6f 72  mplates are stor
25800 65 64 0a 2a 2a 20 69 6e 20 70 42 75 69 6c 64 65  ed.** in pBuilde
25810 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  r->pWInfo->pLoop
25820 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63  s..**.** When ac
25830 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69  cumulating multi
25840 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20  ple loops (when 
25850 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 20  pBuilder->pBest 
25860 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73  is NULL) we.** s
25870 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77  till might overw
25880 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f  rite similar loo
25890 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ps with the new 
258a0 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a  template if the.
258b0 2a 2a 20 74 65 6d 70 6c 61 74 65 20 69 73 20 62  ** template is b
258c0 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61  etter.  Loops ma
258d0 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  y be overwritten
258e0 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
258f0 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  g .** conditions
25900 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
25910 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61 76     (1)  They hav
25920 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62 2e  e the same iTab.
25930 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 79  .**    (2)  They
25940 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69   have the same i
25950 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28  SortIdx..**    (
25960 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  3)  The template
25970 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65 77   has same or few
25980 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
25990 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
259a0 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20   loop.**    (4) 
259b0 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
259c0 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
259d0 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74 68  wer cost than th
259e0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
259f0 2a 20 20 20 20 28 35 29 20 20 54 68 65 20 74 65  *    (5)  The te
25a00 6d 70 6c 61 74 65 20 75 73 65 73 20 6d 6f 72 65  mplate uses more
25a10 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 73 61   terms of the sa
25a20 6d 65 20 69 6e 64 65 78 20 62 75 74 20 68 61 73  me index but has
25a30 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a   no additional.*
25a40 2a 20 20 20 20 20 20 20 20 20 64 65 70 65 6e 64  *         depend
25a50 65 6e 63 69 65 73 20 20 20 20 20 20 20 20 20 20  encies          
25a60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
25a70 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
25a80 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
25a90 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
25aa0 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
25ab0 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
25ac0 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e 65  ppPrev, *p, *pNe
25ad0 78 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 49  xt = 0;.  WhereI
25ae0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
25af0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
25b00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
25b10 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
25b20 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75  db;..  /* If pBu
25b30 69 6c 64 65 72 2d 3e 70 42 65 73 74 20 69 73 20  ilder->pBest is 
25b40 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
25b50 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
25b60 20 74 68 65 20 73 69 6e 67 6c 65 0a 20 20 2a 2a   the single.  **
25b70 20 62 65 73 74 20 57 68 65 72 65 4c 6f 6f 70 2e   best WhereLoop.
25b80 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73    pBuilder->pBes
25b90 74 2d 3e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 69  t->maskSelf==0 i
25ba0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 6e 6f  ndicates that no
25bb0 0a 20 20 2a 2a 20 70 72 69 6f 72 20 57 68 65 72  .  ** prior Wher
25bc0 65 4c 6f 6f 70 73 20 68 61 76 65 20 62 65 65 6e  eLoops have been
25bd0 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74   evaluated and t
25be0 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
25bf0 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a 2a 20 69  pTemplate.  ** i
25c00 73 20 74 68 65 72 65 66 6f 72 65 20 74 68 65 20  s therefore the 
25c10 66 69 72 73 74 20 61 6e 64 20 68 65 6e 63 65 20  first and hence 
25c20 74 68 65 20 62 65 73 74 20 61 6e 64 20 73 68 6f  the best and sho
25c30 75 6c 64 20 62 65 20 72 65 74 61 69 6e 65 64 2e  uld be retained.
25c40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 20 3d  .  */.  if( (p =
25c50 20 70 42 75 69 6c 64 65 72 2d 3e 70 42 65 73 74   pBuilder->pBest
25c60 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
25c70 70 2d 3e 6d 61 73 6b 53 65 6c 66 21 3d 30 20 29  p->maskSelf!=0 )
25c80 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6f 73  {.      WhereCos
25c90 74 20 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43  t rCost = whereC
25ca0 6f 73 74 41 64 64 28 70 2d 3e 72 52 75 6e 2c 70  ostAdd(p->rRun,p
25cb0 2d 3e 72 53 65 74 75 70 29 3b 0a 20 20 20 20 20  ->rSetup);.     
25cc0 20 57 68 65 72 65 43 6f 73 74 20 72 54 65 6d 70   WhereCost rTemp
25cd0 6c 61 74 65 20 3d 20 77 68 65 72 65 43 6f 73 74  late = whereCost
25ce0 41 64 64 28 70 54 65 6d 70 6c 61 74 65 2d 3e 72  Add(pTemplate->r
25cf0 52 75 6e 2c 70 54 65 6d 70 6c 61 74 65 2d 3e 72  Run,pTemplate->r
25d00 53 65 74 75 70 29 3b 0a 20 20 20 20 20 20 69 66  Setup);.      if
25d10 28 20 72 43 6f 73 74 20 3c 20 72 54 65 6d 70 6c  ( rCost < rTempl
25d20 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 67  ate ){.        g
25d30 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  oto whereLoopIns
25d40 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20  ert_noop;.      
25d50 7d 0a 20 20 20 20 20 20 69 66 28 20 72 43 6f 73  }.      if( rCos
25d60 74 20 3d 3d 20 72 54 65 6d 70 6c 61 74 65 20 26  t == rTemplate &
25d70 26 20 70 2d 3e 70 72 65 72 65 71 20 3c 3d 20 70  & p->prereq <= p
25d80 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
25d90 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
25da0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
25db0 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  _noop;.      }. 
25dc0 20 20 20 7d 0a 23 69 66 20 57 48 45 52 45 54 52     }.#if WHERETR
25dd0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
25de0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
25df0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
25e00 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25e10 67 50 72 69 6e 74 66 28 70 2d 3e 6d 61 73 6b 53  gPrintf(p->maskS
25e20 65 6c 66 3d 3d 30 20 3f 20 22 69 6e 73 2d 69 6e  elf==0 ? "ins-in
25e30 69 74 3a 20 22 20 3a 20 22 69 6e 73 2d 62 65 73  it: " : "ins-bes
25e40 74 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65  t: ");.      whe
25e50 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d  reLoopPrint(pTem
25e60 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e 70  plate, pWInfo->p
25e70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  TabList);.    }.
25e80 23 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72 65  #endif.    where
25e90 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20  LoopXfer(db, p, 
25ea0 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20  pTemplate);.    
25eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25ec0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72  ;.  }..  /* Sear
25ed0 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
25ee0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  ng WhereLoop to 
25ef0 6f 76 65 72 77 72 69 74 65 2c 20 6f 72 20 77 68  overwrite, or wh
25f00 69 63 68 20 74 61 6b 65 73 0a 20 20 2a 2a 20 70  ich takes.  ** p
25f10 72 69 6f 72 69 74 79 20 6f 76 65 72 20 70 54 65  riority over pTe
25f20 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 66  mplate..  */.  f
25f30 6f 72 28 70 70 50 72 65 76 3d 26 70 57 49 6e 66  or(ppPrev=&pWInf
25f40 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d 2a 70 70  o->pLoops, p=*pp
25f50 50 72 65 76 3b 20 70 3b 20 70 70 50 72 65 76 3d  Prev; p; ppPrev=
25f60 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70  &p->pNextLoop, p
25f70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20 69  =*ppPrev){.    i
25f80 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d  f( p->iTab!=pTem
25f90 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70  plate->iTab || p
25fa0 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65 6d  ->iSortIdx!=pTem
25fb0 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78 20  plate->iSortIdx 
25fc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25fd0 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26  if( (p->prereq &
25fe0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
25ff0 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 0a 20  eq)==p->prereq. 
26000 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
26010 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
26020 74 75 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72  tup.     && p->r
26030 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run<=pTemplate->
26040 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  rRun.    ){.    
26050 20 20 2f 2a 20 70 20 69 73 20 65 71 75 61 6c 20    /* p is equal 
26060 6f 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 70  or better than p
26070 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20  Template */.    
26080 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 3c    if( p->nLTerm<
26090 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72  pTemplate->nLTer
260a0 6d 0a 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e  m.       && (p->
260b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
260c0 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
260d0 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
260e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
260f0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
26100 20 20 20 20 20 26 26 20 70 2d 3e 75 2e 62 74 72       && p->u.btr
26110 65 65 2e 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70  ee.pIndex==pTemp
26120 6c 61 74 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49  late->u.btree.pI
26130 6e 64 65 78 0a 20 20 20 20 20 20 20 26 26 20 70  ndex.       && p
26140 2d 3e 70 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c  ->prereq==pTempl
26150 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20  ate->prereq.    
26160 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
26170 4f 76 65 72 77 72 69 74 65 20 61 6e 20 65 78 69  Overwrite an exi
26180 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
26190 77 69 74 68 20 61 6e 20 73 69 6d 69 6c 61 72 20  with an similar 
261a0 6f 6e 65 20 74 68 61 74 20 75 73 65 73 0a 20 20  one that uses.  
261b0 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65        ** more te
261c0 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
261d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 78   */.        pNex
261e0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  t = p->pNextLoop
261f0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
26200 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
26210 20 70 2d 3e 6e 4f 75 74 3e 70 54 65 6d 70 6c 61   p->nOut>pTempla
26220 74 65 2d 3e 6e 4f 75 74 0a 20 20 20 20 20 20 20  te->nOut.       
26230 26 26 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54  && p->rSetup==pT
26240 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 0a  emplate->rSetup.
26250 20 20 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75         && p->rRu
26260 6e 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n==pTemplate->rR
26270 75 6e 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  un.      ){.    
26280 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
26290 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
262a0 72 65 4c 6f 6f 70 20 77 69 74 68 20 74 68 65 20  reLoop with the 
262b0 73 61 6d 65 20 63 6f 73 74 20 62 75 74 20 6d 6f  same cost but mo
262c0 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  re.        ** ou
262d0 74 70 75 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  tputs */.       
262e0 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
262f0 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 62  tLoop;.        b
26300 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
26310 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 54  e{.        /* pT
26320 65 6d 70 6c 61 74 65 20 69 73 20 6e 6f 74 20 68  emplate is not h
26330 65 6c 70 66 75 6c 2e 0a 20 20 20 20 20 20 20 20  elpful..        
26340 2a 2a 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  ** Return withou
26350 74 20 63 68 61 6e 67 69 6e 67 20 6f 72 20 61 64  t changing or ad
26360 64 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  ding anything */
26370 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68  .        goto wh
26380 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f  ereLoopInsert_no
26390 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  op;.      }.    
263a0 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  }.    if( (p->pr
263b0 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
263c0 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70  ->prereq)==pTemp
263d0 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20  late->prereq.   
263e0 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3e 3d    && p->rSetup>=
263f0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
26400 70 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  p.     && p->rRu
26410 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
26420 75 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  un.    ){.      
26430 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e 20  /* Overwrite an 
26440 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
26450 6f 70 20 77 69 74 68 20 61 20 62 65 74 74 65 72  op with a better
26460 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e   one */.      pN
26470 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f  ext = p->pNextLo
26480 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  op;.      break;
26490 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
264a0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
264b0 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73  s point it means
264c0 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d   that either p[]
264d0 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77   should be overw
264e0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68  ritten.  ** with
264f0 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20   pTemplate[] if 
26500 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69  p[] exists, or i
26510 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61  f p==NULL then a
26520 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20  llocate a new.  
26530 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64  ** WhereLoop and
26540 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f   insert it..  */
26550 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
26560 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
26570 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
26580 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28  & 0x8 ){.    if(
26590 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p!=0 ){.      s
265a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
265b0 66 28 22 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b  f("ins-del:  ");
265c0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
265d0 50 72 69 6e 74 28 70 2c 20 70 57 49 6e 66 6f 2d  Print(p, pWInfo-
265e0 3e 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20  >pTabList);.    
265f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
26600 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65  ugPrintf("ins-ne
26610 77 3a 20 20 22 29 3b 0a 20 20 20 20 77 68 65 72  w:  ");.    wher
26620 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
26630 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54  late, pWInfo->pT
26640 61 62 4c 69 73 74 29 3b 0a 20 20 7d 0a 23 65 6e  abList);.  }.#en
26650 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
26660 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
26670 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
26680 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
26690 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
266a0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
266b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65  E_NOMEM;.    whe
266c0 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20  reLoopInit(p);. 
266d0 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58 66   }.  whereLoopXf
266e0 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c  er(db, p, pTempl
266f0 61 74 65 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  ate);.  p->pNext
26700 4c 6f 6f 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20  Loop = pNext;.  
26710 2a 70 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 69  *ppPrev = p;.  i
26720 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
26730 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
26740 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49  BLE)==0 ){.    I
26750 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70  ndex *pIndex = p
26760 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
26770 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
26780 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d   && pIndex->tnum
26790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
267a0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
267b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
267c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
267d0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
267e0 65 20 69 66 20 74 68 65 20 69 6e 73 65 72 74 20  e if the insert 
267f0 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68  is a no-op */.wh
26800 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f  ereLoopInsert_no
26810 6f 70 3a 0a 23 69 66 20 57 48 45 52 45 54 52 41  op:.#if WHERETRA
26820 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
26830 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
26840 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
26850 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
26860 74 66 28 70 42 75 69 6c 64 65 72 2d 3e 70 42 65  tf(pBuilder->pBe
26870 73 74 20 3f 20 22 69 6e 73 2d 73 6b 69 70 3a 20  st ? "ins-skip: 
26880 22 20 3a 20 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22  " : "ins-noop: "
26890 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
268a0 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
268b0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
268c0 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
268d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
268e0 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65  K;  .}../*.** We
268f0 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
26900 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
26910 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
26920 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
26930 64 65 78 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54  dex pIndex..** T
26940 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20  ry to match one 
26950 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  more..**.** If p
26960 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20  Probe->tnum==0, 
26970 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65  that means pInde
26980 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65  x is a fake inde
26990 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a  x used for the.*
269a0 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
269b0 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  Y KEY..*/.static
269c0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
269d0 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57  dBtreeIndex(.  W
269e0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
269f0 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f  *pBuilder,     /
26a00 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
26a10 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72  factory */.  str
26a20 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
26a30 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20   *pSrc,      /* 
26a40 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
26a50 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
26a60 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
26a70 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  be,             
26a80 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
26a90 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 57 68   on pSrc */.  Wh
26aa0 65 72 65 43 6f 73 74 20 6e 49 6e 4d 75 6c 20 20  ereCost nInMul  
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26ac0 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69   log(Number of i
26ad0 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f  terations due to
26ae0 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   IN) */.){.  Whe
26af0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
26b00 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
26b10 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61  o;  /* WHERE ana
26b20 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lyse context */.
26b30 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
26b40 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
26b50 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ;        /* Pars
26b60 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
26b70 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
26b80 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
26b90 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
26ba0 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63  nection malloc c
26bb0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
26bc0 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26be0 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
26bf0 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  p under construc
26c00 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
26c10 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
26c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
26c30 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63  hereTerm under c
26c40 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
26c50 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20    int opMask;   
26c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c70 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61    /* Valid opera
26c80 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61  tors for constra
26c90 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53  ints */.  WhereS
26ca0 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20  can scan;       
26cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
26cc0 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20  rator for WHERE 
26cd0 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
26ce0 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b  sk saved_prereq;
26cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
26d00 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
26d10 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a  pNew->prereq */.
26d20 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65    u16 saved_nLTe
26d30 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
26d40 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
26d50 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54  lue of pNew->nLT
26d60 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  erm */.  int sav
26d70 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20  ed_nEq;         
26d80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
26d90 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
26da0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
26db0 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77  */.  u32 saved_w
26dc0 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
26dd0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
26de0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
26df0 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 57 68 65  wsFlags */.  Whe
26e00 72 65 43 6f 73 74 20 73 61 76 65 64 5f 6e 4f 75  reCost saved_nOu
26e10 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
26e20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
26e30 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a  f pNew->nOut */.
26e40 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e60 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
26e70 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
26e80 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
26e90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
26ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26eb0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57  turn code */.  W
26ec0 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 45 73 74  hereCost nRowEst
26ed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
26ee0 2a 20 45 73 74 69 6d 61 74 65 64 20 69 6e 64 65  * Estimated inde
26ef0 78 20 73 65 6c 65 63 74 69 76 69 74 79 20 2a 2f  x selectivity */
26f00 0a 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f  .  WhereCost rLo
26f10 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
26f20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
26f30 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f  of table size */
26f40 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
26f50 6f 70 2c 20 2a 70 42 74 6d 3b 20 20 20 20 20 20  op, *pBtm;      
26f60 20 20 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f     /* Top and bo
26f70 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74  ttom range const
26f80 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65  raints */..  pNe
26f90 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
26fa0 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ew;.  if( db->ma
26fb0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
26fc0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
26fd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e  ;..  assert( (pN
26fe0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
26ff0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
27000 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
27010 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ( pNew->u.btree.
27020 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f  nEq<=pProbe->nCo
27030 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
27040 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
27050 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
27060 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  IT)==0 );.  if( 
27070 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
27080 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
27090 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  ){.    opMask = 
270a0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d  WO_LT|WO_LE;.  }
270b0 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d  else if( pProbe-
270c0 3e 74 6e 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72  >tnum<=0 || (pSr
270d0 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  c->jointype & JT
270e0 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
270f0 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
27100 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_IN|WO_GT|WO_G
27110 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  E|WO_LT|WO_LE;. 
27120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61   }else{.    opMa
27130 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
27140 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54  |WO_ISNULL|WO_GT
27150 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
27160 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  LE;.  }.  if( pP
27170 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
27180 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57   ) opMask &= ~(W
27190 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
271a0 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 69 66 28 20  |WO_LE);..  if( 
271b0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
271c0 71 20 3c 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  q < pProbe->nCol
271d0 75 6d 6e 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  umn ){.    iCol 
271e0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
271f0 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  mn[pNew->u.btree
27200 2e 6e 45 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45  .nEq];.    nRowE
27210 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70  st = whereCost(p
27220 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b  Probe->aiRowEst[
27230 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
27240 71 2b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  q+1]);.  }else{.
27250 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20      iCol = -1;. 
27260 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 0a     nRowEst = 0;.
27270 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 77 68    }.  pTerm = wh
27280 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
27290 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  n, pBuilder->pWC
272a0 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  , pSrc->iCursor,
272b0 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20   iCol,.         
272c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
272d0 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a  pMask, pProbe);.
272e0 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e    saved_nEq = pN
272f0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
27300 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20  .  saved_nLTerm 
27310 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a  = pNew->nLTerm;.
27320 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20    saved_wsFlags 
27330 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b  = pNew->wsFlags;
27340 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20  .  saved_prereq 
27350 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a  = pNew->prereq;.
27360 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70    saved_nOut = p
27370 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65  New->nOut;.  pNe
27380 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
27390 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
273a0 6f 67 28 77 68 65 72 65 43 6f 73 74 28 70 50 72  og(whereCost(pPr
273b0 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  obe->aiRowEst[0]
273c0 29 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d  ));.  for(; rc==
273d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
273e0 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77  rm!=0; pTerm = w
273f0 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
27400 61 6e 29 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49  an)){.    int nI
27410 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  n = 0;.    if( p
27420 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
27430 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
27440 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  lf ) continue;. 
27450 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
27460 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
27470 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
27480 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
27490 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nEq;.    pNew->n
274a0 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
274b0 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77 68  Term;.    if( wh
274c0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
274d0 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
274e0 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b  Term+1) ) break;
274f0 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70   /* OOM */.    p
27500 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
27510 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54  ->nLTerm++] = pT
27520 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  erm;.    pNew->p
27530 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f 70  rereq = (saved_p
27540 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70  rereq | pTerm->p
27550 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e 70  rereqRight) & ~p
27560 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
27570 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
27580 72 4c 6f 67 53 69 7a 65 3b 20 2f 2a 20 42 61 73  rLogSize; /* Bas
27590 65 6c 69 6e 65 20 63 6f 73 74 20 69 73 20 6c 6f  eline cost is lo
275a0 67 32 28 4e 29 2e 20 20 41 64 6a 75 73 74 6d 65  g2(N).  Adjustme
275b0 6e 74 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  nts below */.   
275c0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
275d0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b  rator & WO_IN ){
275e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
275f0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
27600 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  r;.      pNew->w
27610 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
27620 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20  COLUMN_IN;.     
27630 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
27640 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
27650 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
27660 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
27670 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55  ELECT ...)":  TU
27680 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54  NING: the SELECT
27690 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
276a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
276b0 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
276c0 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29  6==whereCost(25)
276d0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   );.      }else 
276e0 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
276f0 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78  ->x.pList && pEx
27700 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
27710 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
27720 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20  * "x IN (value, 
27730 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a  value, ...)" */.
27740 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 77 68          nIn = wh
27750 65 72 65 43 6f 73 74 28 70 45 78 70 72 2d 3e 78  ereCost(pExpr->x
27760 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  .pList->nExpr);.
27770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
27780 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 3b  ew->rRun += nIn;
27790 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
277a0 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
277b0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
277c0 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20  RowEst + nInMul 
277d0 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  + nIn;.    }else
277e0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
277f0 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 29 20  rator & (WO_EQ) 
27800 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
27810 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
27820 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
27830 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  NULL|WHERE_COLUM
27840 4e 5f 49 4e 29 29 21 3d 30 0a 20 20 20 20 20 20  N_IN))!=0.      
27850 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e              || n
27860 49 6e 4d 75 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  InMul==0 );.    
27870 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
27880 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
27890 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  EQ;.      if( iC
278a0 6f 6c 3c 30 20 20 0a 20 20 20 20 20 20 20 7c 7c  ol<0  .       ||
278b0 20 28 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f   (pProbe->onErro
278c0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 6e 49  r!=OE_None && nI
278d0 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  nMul==0.        
278e0 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
278f0 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d  ree.nEq==pProbe-
27900 3e 6e 43 6f 6c 75 6d 6e 2d 31 29 0a 20 20 20 20  >nColumn-1).    
27910 20 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73    ){.        tes
27920 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 77 73 46  tcase( pNew->wsF
27930 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
27940 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20  UMN_IN );.      
27950 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
27960 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  |= WHERE_ONEROW;
27970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
27980 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27990 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ++;.      pNew->
279a0 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b  nOut = nRowEst +
279b0 20 6e 49 6e 4d 75 6c 3b 0a 20 20 20 20 7d 65 6c   nInMul;.    }el
279c0 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f  se if( pTerm->eO
279d0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53  perator & (WO_IS
279e0 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 70  NULL) ){.      p
279f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
27a00 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
27a10 4c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  L;.      pNew->u
27a20 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20  .btree.nEq++;.  
27a30 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49      /* TUNING: I
27a40 53 20 4e 55 4c 4c 20 73 65 6c 65 63 74 73 20 32  S NULL selects 2
27a50 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 6e   rows */.      n
27a60 49 6e 20 3d 20 31 30 3b 20 20 61 73 73 65 72 74  In = 10;  assert
27a70 28 20 31 30 3d 3d 77 68 65 72 65 43 6f 73 74 28  ( 10==whereCost(
27a80 32 29 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  2) );.      pNew
27a90 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74  ->nOut = nRowEst
27aa0 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b   + nInMul + nIn;
27ab0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
27ac0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27ad0 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20  & (WO_GT|WO_GE) 
27ae0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
27af0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
27b00 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
27b10 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
27b20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d      pBtm = pTerm
27b30 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30  ;.      pTop = 0
27b40 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
27b50 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
27b60 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
27b70 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
27b80 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
27b90 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
27ba0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
27bb0 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72       pTop = pTer
27bc0 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  m;.      pBtm = 
27bd0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
27be0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
27bf0 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
27c00 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
27c10 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
27c20 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20  LTerm-2] : 0;.  
27c30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4e 65 77    }.    if( pNew
27c40 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
27c50 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
27c60 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
27c70 74 20 6e 4f 75 74 20 61 6e 64 20 72 52 75 6e 20  t nOut and rRun 
27c80 66 6f 72 20 53 54 41 54 33 20 72 61 6e 67 65 20  for STAT3 range 
27c90 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20  values */.      
27ca0 57 68 65 72 65 43 6f 73 74 20 72 44 69 76 3b 0a  WhereCost rDiv;.
27cb0 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65        whereRange
27cc0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
27cd0 70 50 72 6f 62 65 2c 20 70 4e 65 77 2d 3e 75 2e  pProbe, pNew->u.
27ce0 62 74 72 65 65 2e 6e 45 71 2c 0a 20 20 20 20 20  btree.nEq,.     
27cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d00 20 20 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26     pBtm, pTop, &
27d10 72 44 69 76 29 3b 0a 20 20 20 20 20 20 70 4e 65  rDiv);.      pNe
27d20 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
27d30 6e 4f 75 74 3e 72 44 69 76 2b 31 30 20 3f 20 73  nOut>rDiv+10 ? s
27d40 61 76 65 64 5f 6e 4f 75 74 20 2d 20 72 44 69 76  aved_nOut - rDiv
27d50 20 3a 20 31 30 3b 0a 20 20 20 20 7d 0a 23 69 66   : 10;.    }.#if
27d60 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
27d70 45 5f 53 54 41 54 33 0a 20 20 20 20 69 66 28 20  E_STAT3.    if( 
27d80 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
27d90 71 3d 3d 31 20 26 26 20 70 50 72 6f 62 65 2d 3e  q==1 && pProbe->
27da0 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20  nSample ){.     
27db0 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20   tRowcnt nOut = 
27dc0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  0;.      if( (pT
27dd0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
27de0 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
27df0 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  L))!=0 ){.      
27e00 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
27e10 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
27e20 20 70 50 72 6f 62 65 2c 20 70 54 65 72 6d 2d 3e   pProbe, pTerm->
27e30 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
27e40 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  nOut);.      }el
27e50 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
27e60 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
27e70 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
27e80 26 20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  &  !ExprHasPrope
27e90 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
27ea0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
27eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27ec0 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
27ed0 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20  pParse, pProbe, 
27ee0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e  pTerm->pExpr->x.
27ef0 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  pList, &nOut);. 
27f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
27f10 77 2d 3e 6e 4f 75 74 20 3d 20 77 68 65 72 65 43  w->nOut = whereC
27f20 6f 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20 7d  ost(nOut);.    }
27f30 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
27f40 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
27f50 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
27f60 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20  |WHERE_IPK))==0 
27f70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 61 63 68  ){.      /* Each
27f80 20 72 6f 77 20 69 6e 76 6f 6c 76 65 73 20 61 20   row involves a 
27f90 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e 64 65  step of the inde
27fa0 78 2c 20 74 68 65 6e 20 61 20 62 69 6e 61 72 79  x, then a binary
27fb0 20 73 65 61 72 63 68 20 6f 66 0a 20 20 20 20 20   search of.     
27fc0 20 2a 2a 20 74 68 65 20 6d 61 69 6e 20 74 61 62   ** the main tab
27fd0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  le */.      pNew
27fe0 2d 3e 72 52 75 6e 20 3d 20 20 77 68 65 72 65 43  ->rRun =  whereC
27ff0 6f 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  ostAdd(pNew->rRu
28000 6e 2c 20 72 4c 6f 67 53 69 7a 65 3e 32 37 20 3f  n, rLogSize>27 ?
28010 20 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20 31   rLogSize-17 : 1
28020 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
28030 20 53 74 65 70 20 63 6f 73 74 20 66 6f 72 20 65   Step cost for e
28040 61 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20 2a  ach output row *
28050 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  /.    pNew->rRun
28060 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
28070 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77  pNew->rRun, pNew
28080 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20  ->nOut);.    /* 
28090 54 42 44 3a 20 41 64 6a 75 73 74 20 6e 4f 75 74  TBD: Adjust nOut
280a0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
280b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
280c0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
280d0 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
280e0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28  , pNew);.    if(
280f0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
28100 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
28110 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e  T)==0.     && pN
28120 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
28130 28 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  (pProbe->nColumn
28140 20 2b 20 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d   + (pProbe->zNam
28150 65 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a 20 20  e!=0)).    ){.  
28160 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
28170 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
28180 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
28190 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a  e, nInMul+nIn);.
281a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
281b0 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64  ->prereq = saved
281c0 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d  _prereq;.  pNew-
281d0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
281e0 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77  aved_nEq;.  pNew
281f0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
28200 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65  d_wsFlags;.  pNe
28210 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
28220 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  nOut;.  pNew->nL
28230 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
28240 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  erm;.  return rc
28250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
28260 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20  n True if it is 
28270 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49  possible that pI
28280 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73  ndex might be us
28290 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65  eful in.** imple
282a0 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45  menting the ORDE
282b0 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70  R BY clause in p
282c0 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52  Builder..**.** R
282d0 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70  eturn False if p
282e0 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74  Builder does not
282f0 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45   contain an ORDE
28300 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a  R BY clause or.*
28310 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * if there is no
28320 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20   way for pIndex 
28330 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20  to be useful in 
28340 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61  implementing tha
28350 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  t.** ORDER BY cl
28360 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
28370 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65  int indexMightHe
28380 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20  lpWithOrderBy(. 
28390 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
283a0 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49  r *pBuilder,.  I
283b0 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20  ndex *pIndex,.  
283c0 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20  int iCursor.){. 
283d0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a   ExprList *pOB;.
283e0 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e    int iCol;.  in
283f0 74 20 69 69 3b 0a 0a 20 20 69 66 28 20 70 49 6e  t ii;..  if( pIn
28400 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  dex->bUnordered 
28410 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
28420 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65  ( (pOB = pBuilde
28430 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  r->pWInfo->pOrde
28440 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  rBy)==0 ) return
28450 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 49 6e   0;.  iCol = pIn
28460 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  dex->aiColumn[0]
28470 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
28480 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  <pOB->nExpr; ii+
28490 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
284a0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
284b0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42  rSkipCollate(pOB
284c0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a  ->a[ii].pExpr);.
284d0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
284e0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
284f0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
28500 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
28510 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
28520 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
28530 75 6d 6e 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75  umn==iCol ) retu
28540 72 6e 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75  rn 1;.      retu
28550 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
28560 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
28570 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69  *.** Return a bi
28580 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69  tmask where 1s i
28590 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
285a0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
285b0 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
285c0 74 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79  table is used by
285d0 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79   an index.  Only
285e0 20 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f   the first 63 co
285f0 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64  lumns are consid
28600 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
28610 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49  Bitmask columnsI
28620 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49  nIndex(Index *pI
28630 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  dx){.  Bitmask m
28640 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
28650 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f   for(j=pIdx->nCo
28660 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  lumn-1; j>=0; j-
28670 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  -){.    int x = 
28680 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
28690 5d 3b 0a 20 20 20 20 69 66 28 20 78 3c 42 4d 53  ];.    if( x<BMS
286a0 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49  -1 ) m |= MASKBI
286b0 54 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  T(x);.  }.  retu
286c0 72 6e 20 6d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn m;.}.../*.** 
286d0 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
286e0 70 20 6f 62 6a 65 63 74 73 20 61 20 73 69 6e 67  p objects a sing
286f0 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
28700 6a 6f 69 6e 20 77 65 72 65 20 74 68 65 20 74 61  join were the ta
28710 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69  ble.** is idenfi
28720 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
28730 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
28740 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
28750 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
28760 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
28770 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
28780 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
28790 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
287a0 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ree(.  WhereLoop
287b0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
287c0 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  r, /* WHERE clau
287d0 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  se information *
287e0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  /.  Bitmask mExt
287f0 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
28800 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75  /* Extra prerequ
28810 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67  esites for using
28820 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29   this table */.)
28830 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
28840 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
28850 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69  /* WHERE analysi
28860 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  s context */.  I
28870 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
28880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
28890 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
288a0 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e  aluating */.  In
288b0 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20  dex sPk;        
288c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66            /* A f
288d0 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ake index object
288e0 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
288f0 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e   key */.  tRowcn
28900 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b  t aiRowEstPk[2];
28910 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52        /* The aiR
28920 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f  owEst[] value fo
28930 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
28940 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d  */.  int aiColum
28950 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  nPk = -1;       
28960 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b   /* The aColumn[
28970 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
28980 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53  sPk index */.  S
28990 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
289a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
289b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
289c0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
289d0 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f  t_item *pSrc;  /
289e0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
289f0 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20  e btree term to 
28a00 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  add */.  WhereLo
28a10 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
28a20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
28a30 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
28a40 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
28a50 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
28a60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
28a70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  e */.  int iSort
28a80 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20  Idx = 1;        
28a90 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62     /* Index numb
28aa0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20  er */.  int b;  
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e      /* A boolean
28ad0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 57 68 65 72   value */.  Wher
28ae0 65 43 6f 73 74 20 72 53 69 7a 65 3b 20 20 20 20  eCost rSize;    
28af0 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65          /* numbe
28b00 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
28b10 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
28b20 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20  eCost rLogSize; 
28b30 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72          /* Logar
28b40 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62  ithm of the numb
28b50 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
28b60 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 0a 20 20  e table */.  .  
28b70 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
28b80 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20  >pNew;.  pWInfo 
28b90 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
28ba0 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  fo;.  pTabList =
28bb0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
28bc0 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62  t;.  pSrc = pTab
28bd0 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
28be0 69 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  iTab;.  assert( 
28bf0 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d  !IsVirtual(pSrc-
28c00 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28  >pTab) );..  if(
28c10 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b   pSrc->pIndex ){
28c20 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58  .    /* An INDEX
28c30 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70 65  ED BY clause spe
28c40 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63 75  cifies a particu
28c50 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65  lar index to use
28c60 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   */.    pProbe =
28c70 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20   pSrc->pIndex;. 
28c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
28c90 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
28ca0 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
28cb0 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
28cc0 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
28cd0 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
28ce0 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
28cf0 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
28d00 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
28d10 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
28d20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
28d30 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
28d40 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
28d50 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
28d60 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
28d70 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
28d80 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
28d90 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
28da0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
28db0 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
28dc0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
28dd0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
28de0 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
28df0 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43  ex));.    sPk.nC
28e00 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73  olumn = 1;.    s
28e10 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61  Pk.aiColumn = &a
28e20 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73  iColumnPk;.    s
28e30 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69  Pk.aiRowEst = ai
28e40 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50  RowEstPk;.    sP
28e50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52  k.onError = OE_R
28e60 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e  eplace;.    sPk.
28e70 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
28e80 54 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Tab;.    aiRowEs
28e90 74 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70  tPk[0] = pSrc->p
28ea0 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  Tab->nRowEst;.  
28eb0 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
28ec0 3d 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20  = 1;.    pFirst 
28ed0 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
28ee0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53  ndex;.    if( pS
28ef0 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  rc->notIndexed==
28f00 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
28f10 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  e real indices o
28f20 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  f the table are 
28f30 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20  only considered 
28f40 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  if the.      ** 
28f50 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c  NOT INDEXED qual
28f60 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64  ifier is omitted
28f70 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63   from the FROM c
28f80 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73  lause */.      s
28f90 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73  Pk.pNext = pFirs
28fa0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72  t;.    }.    pPr
28fb0 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a  obe = &sPk;.  }.
28fc0 20 20 72 53 69 7a 65 20 3d 20 77 68 65 72 65 43    rSize = whereC
28fd0 6f 73 74 28 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ost(pSrc->pTab->
28fe0 6e 52 6f 77 45 73 74 29 3b 0a 20 20 72 4c 6f 67  nRowEst);.  rLog
28ff0 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53  Size = estLog(rS
29000 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 6f  ize);..  /* Auto
29010 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f  matic indexes */
29020 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72  .  if( !pBuilder
29030 2d 3e 70 42 65 73 74 0a 20 20 20 26 26 20 28 70  ->pBest.   && (p
29040 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
29050 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
29060 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a  E_AutoIndex)!=0.
29070 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64     && pSrc->pInd
29080 65 78 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72  ex==0.   && !pSr
29090 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 0a  c->viaCoroutine.
290a0 20 20 20 26 26 20 21 70 53 72 63 2d 3e 6e 6f 74     && !pSrc->not
290b0 49 6e 64 65 78 65 64 0a 20 20 20 26 26 20 21 70  Indexed.   && !p
290c0 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65  Src->isCorrelate
290d0 64 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65  d.  ){.    /* Ge
290e0 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65  nerate auto-inde
290f0 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a  x WhereLoops */.
29100 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
29110 2a 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d  *pWC = pBuilder-
29120 3e 70 57 43 3b 0a 20 20 20 20 57 68 65 72 65 54  >pWC;.    WhereT
29130 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20  erm *pTerm;.    
29140 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e  WhereTerm *pWCEn
29150 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
29160 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72  ->nTerm;.    for
29170 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72  (pTerm=pWC->a; r
29180 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29190 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
291a0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  erm++){.      if
291b0 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
291c0 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73  ight & pNew->mas
291d0 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65  kSelf ) continue
291e0 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d  ;.      if( term
291f0 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54  CanDriveIndex(pT
29200 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b  erm, pSrc, 0) ){
29210 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
29220 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a  .btree.nEq = 1;.
29230 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
29240 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
29250 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
29260 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
29270 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
29280 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
29290 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
292a0 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f  One-time cost fo
292b0 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20  r computing the 
292c0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
292d0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70  is.        ** ap
292e0 70 72 6f 78 69 6d 61 74 65 6c 79 20 36 2a 4e 2a  proximately 6*N*
292f0 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20  log2(N) where N 
29300 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
29310 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20   rows in.       
29320 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
29330 69 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a  ing indexed. */.
29340 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
29350 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20  etup = rLogSize 
29360 2b 20 72 53 69 7a 65 20 2b 20 32 36 3b 20 20 61  + rSize + 26;  a
29370 73 73 65 72 74 28 20 32 36 3d 3d 77 68 65 72 65  ssert( 26==where
29380 43 6f 73 74 28 36 29 20 29 3b 0a 20 20 20 20 20  Cost(6) );.     
29390 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61     /* TUNING: Ea
293a0 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ch index lookup 
293b0 79 69 65 6c 64 73 20 31 30 20 72 6f 77 73 20 69  yields 10 rows i
293c0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
293d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
293e0 74 20 3d 20 33 33 3b 20 20 61 73 73 65 72 74 28  t = 33;  assert(
293f0 20 33 33 3d 3d 77 68 65 72 65 43 6f 73 74 28 31   33==whereCost(1
29400 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  0) );.        pN
29410 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65 72 65  ew->rRun = where
29420 43 6f 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65  CostAdd(rLogSize
29430 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20  ,pNew->nOut);.  
29440 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
29450 61 67 73 20 3d 20 57 48 45 52 45 5f 54 45 4d 50  ags = WHERE_TEMP
29460 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20  _INDEX;.        
29470 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
29480 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70  Extra | pTerm->p
29490 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
294a0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
294b0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
294c0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
294d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
294e0 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  * Loop over all 
294f0 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66  indices.  */.  f
29500 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
29510 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50  OK && pProbe; pP
29520 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65  robe=pProbe->pNe
29530 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b  xt, iSortIdx++){
29540 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
29550 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20  ee.nEq = 0;.    
29560 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30  pNew->nLTerm = 0
29570 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72  ;.    pNew->iSor
29580 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e  tIdx = 0;.    pN
29590 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
295a0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
295b0 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70   = mExtra;.    p
295c0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
295d0 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20  dex = pProbe;.  
295e0 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74    b = indexMight
295f0 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28  HelpWithOrderBy(
29600 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65  pBuilder, pProbe
29610 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29  , pSrc->iCursor)
29620 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45  ;.    /* The ONE
29630 50 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61  PASS_DESIRED fla
29640 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20  gs never occurs 
29650 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52  together with OR
29660 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73  DER BY */.    as
29670 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77  sert( (pWInfo->w
29680 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
29690 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
296a0 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b  D)==0 || b==0 );
296b0 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
296c0 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20  >tnum<=0 ){.    
296d0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69    /* Integer pri
296e0 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a  mary key index *
296f0 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  /.      pNew->ws
29700 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50  Flags = WHERE_IP
29710 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c  K;..      /* Ful
29720 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
29730 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
29740 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
29750 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 70  Idx : 0;.      p
29760 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
29770 65 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  e;.      /* TUNI
29780 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c  NG: Cost of full
29790 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33   table scan is 3
297a0 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a  *(N + log2(N))..
297b0 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65        **  +  The
297c0 20 65 78 74 72 61 20 33 20 66 61 63 74 6f 72 20   extra 3 factor 
297d0 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20  is to encourage 
297e0 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78  the use of index
297f0 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20  ed lookups.     
29800 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c   **     over ful
29810 6c 20 73 63 61 6e 73 2e 20 20 41 20 73 6d 61 6c  l scans.  A smal
29820 6c 65 72 20 63 6f 6e 73 74 61 6e 74 20 32 20 69  ler constant 2 i
29830 73 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72  s used for cover
29840 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ing.      **    
29850 20 69 6e 64 65 78 20 73 63 61 6e 73 20 73 6f 20   index scans so 
29860 74 68 61 74 20 61 20 63 6f 76 65 72 69 6e 67 20  that a covering 
29870 69 6e 64 65 78 20 73 63 61 6e 20 77 69 6c 6c 20  index scan will 
29880 62 65 20 66 61 76 6f 72 65 64 20 6f 76 65 72 0a  be favored over.
29890 20 20 20 20 20 20 2a 2a 20 20 20 20 20 61 20 74        **     a t
298a0 61 62 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  able scan. */.  
298b0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
298c0 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 53   whereCostAdd(rS
298d0 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20  ize,rLogSize) + 
298e0 31 36 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  16;.      rc = w
298f0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
29900 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
29910 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
29920 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
29930 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
29940 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
29950 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
29960 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  ex(pProbe);.    
29970 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
29980 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52  = (m==0) ? (WHER
29990 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
299a0 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52  _INDEXED) : WHER
299b0 45 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20 20  E_INDEXED;..    
299c0 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76    /* Full scan v
299d0 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ia index */.    
299e0 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c    if( b.       |
299f0 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20  | ( m==0.       
29a00 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e    && pProbe->bUn
29a10 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
29a20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
29a30 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
29a40 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
29a50 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)==0.         
29a60 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
29a70 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20  Config.bUseCis. 
29a80 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
29a90 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
29aa0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
29ab0 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49  b, SQLITE_CoverI
29ac0 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20  dxScan).        
29ad0 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20    ).      ){.   
29ae0 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
29af0 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
29b00 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  dx : 0;.        
29b10 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
29b20 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
29b30 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
29b40 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
29b50 74 20 6f 66 20 61 20 63 6f 76 65 72 69 6e 67 20  t of a covering 
29b60 69 6e 64 65 78 20 73 63 61 6e 20 69 73 20 32 2a  index scan is 2*
29b70 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a 20  (N + log2(N)).. 
29b80 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 20           **  +  
29b90 54 68 65 20 65 78 74 72 61 20 32 20 66 61 63 74  The extra 2 fact
29ba0 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f 75 72 61  or is to encoura
29bb0 67 65 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e  ge the use of in
29bc0 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20  dexed lookups.  
29bd0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f          **     o
29be0 76 65 72 20 69 6e 64 65 78 20 73 63 61 6e 73 2e  ver index scans.
29bf0 20 20 41 20 74 61 62 6c 65 20 73 63 61 6e 20 75    A table scan u
29c00 73 65 73 20 61 20 66 61 63 74 6f 72 20 6f 66 20  ses a factor of 
29c10 33 20 73 6f 20 74 68 61 74 0a 20 20 20 20 20 20  3 so that.      
29c20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
29c30 20 73 63 61 6e 73 20 61 72 65 20 66 61 76 6f 72   scans are favor
29c40 65 64 20 6f 76 65 72 20 74 61 62 6c 65 20 73 63  ed over table sc
29c50 61 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ans..          *
29c60 2a 20 20 2b 20 20 49 66 20 74 68 69 73 20 63 6f  *  +  If this co
29c70 76 65 72 69 6e 67 20 69 6e 64 65 78 20 6d 69 67  vering index mig
29c80 68 74 20 61 6c 73 6f 20 68 65 6c 70 20 73 61 74  ht also help sat
29c90 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
29ca0 59 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  Y.          **  
29cb0 20 20 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20     clause, then 
29cc0 74 68 65 20 63 6f 73 74 20 69 73 20 66 75 64 67  the cost is fudg
29cd0 65 64 20 64 6f 77 6e 20 73 6c 69 67 68 74 6c 79  ed down slightly
29ce0 20 73 6f 20 74 68 61 74 20 74 68 69 73 0a 20 20   so that this.  
29cf0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
29d00 6e 64 65 78 20 69 73 20 66 61 76 6f 72 65 64 20  ndex is favored 
29d10 61 62 6f 76 65 20 6f 74 68 65 72 20 69 6e 64 69  above other indi
29d20 63 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  ces that have no
29d30 20 68 6f 70 65 20 6f 66 0a 20 20 20 20 20 20 20   hope of.       
29d40 20 20 20 2a 2a 20 20 20 20 20 68 65 6c 70 69 6e     **     helpin
29d50 67 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  g with the ORDER
29d60 20 42 59 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   BY. */.        
29d70 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 31    pNew->rRun = 1
29d80 30 20 2b 20 77 68 65 72 65 43 6f 73 74 41 64 64  0 + whereCostAdd
29d90 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29  (rSize,rLogSize)
29da0 20 2d 20 62 3b 0a 20 20 20 20 20 20 20 20 7d 65   - b;.        }e
29db0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
29dc0 73 73 65 72 74 28 20 62 21 3d 30 20 29 3b 20 0a  ssert( b!=0 ); .
29dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
29de0 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 73 63 61  ING: Cost of sca
29df0 6e 6e 69 6e 67 20 61 20 6e 6f 6e 2d 63 6f 76 65  nning a non-cove
29e00 72 69 6e 67 20 69 6e 64 65 78 20 69 73 20 28 4e  ring index is (N
29e10 2b 31 29 2a 6c 6f 67 32 28 4e 29 0a 20 20 20 20  +1)*log2(N).    
29e20 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77        ** which w
29e30 65 20 77 69 6c 6c 20 73 69 6d 70 6c 69 66 79 20  e will simplify 
29e40 74 6f 20 6a 75 73 74 20 4e 2a 6c 6f 67 32 28 4e  to just N*log2(N
29e50 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  ) */.          p
29e60 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a  New->rRun = rSiz
29e70 65 20 2b 20 72 4c 6f 67 53 69 7a 65 3b 0a 20 20  e + rLogSize;.  
29e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29e90 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
29ea0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
29eb0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  New);.        if
29ec0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
29ed0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
29ee0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
29ef0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
29f00 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
29f10 62 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  be, 0);..    /* 
29f20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  If there was an 
29f30 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
29f40 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61  e, then only tha
29f50 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20  t one index is. 
29f60 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64     ** considered
29f70 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72  . */.    if( pSr
29f80 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61  c->pIndex ) brea
29f90 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
29fa0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
29fb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
29fc0 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64  ALTABLE./*.** Ad
29fd0 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
29fe0 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61  objects for a ta
29ff0 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
2a000 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a  identified by.**
2a010 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
2a020 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
2a030 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
2a040 20 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c   to be a virtual
2a050 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
2a060 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
2a070 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65  ddVirtual(.  Whe
2a080 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
2a090 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45  Builder,  /* WHE
2a0a0 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d  RE clause inform
2a0b0 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ation */.  Bitma
2a0c0 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20  sk mExtra       
2a0d0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
2a0e0 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20 66   prerequesites f
2a0f0 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74 61  or using this ta
2a100 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ble */.){.  Wher
2a110 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2a120 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
2a130 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65  E analysis conte
2a140 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
2a150 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
2a160 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2a170 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
2a180 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2a190 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  C;            /*
2a1a0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2a1b0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
2a1c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
2a1d0 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
2a1e0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
2a1f0 65 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65  earch */.  Table
2a200 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
2a210 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  3 *db;.  sqlite3
2a220 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
2a230 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  xInfo;.  struct 
2a240 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
2a250 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
2a260 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
2a270 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
2a280 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
2a290 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
2a2a0 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
2a2b0 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d  , j;.  int iTerm
2a2c0 2c 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20  , mxTerm;.  int 
2a2d0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
2a2e0 6e 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20  nt seenIn = 0;  
2a2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a300 72 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65  rue if an IN ope
2a310 72 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f  rator is seen */
2a320 0a 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d  .  int seenVar =
2a330 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2a340 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e  /* True if a non
2a350 2d 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72  -constant constr
2a360 61 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a  aint is seen */.
2a370 20 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20    int iPhase;   
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a390 2a 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49  * 0: const w/o I
2a3a0 4e 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20  N, 1: const, 2: 
2a3b0 6e 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f  no IN,  2: IN */
2a3c0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
2a3d0 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
2a3e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49  QLITE_OK;..  pWI
2a3f0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
2a400 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65  pWInfo;.  pParse
2a410 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
2a420 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
2a430 2d 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42  ->db;.  pWC = pB
2a440 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
2a450 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
2a460 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26  pNew;.  pSrc = &
2a470 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2a480 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b  ->a[pNew->iTab];
2a490 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
2a4a0 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  pTab;.  assert( 
2a4b0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
2a4c0 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20  );.  pIdxInfo = 
2a4d0 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66  allocateIndexInf
2a4e0 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  o(pParse, pWC, p
2a4f0 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  Src, pBuilder->p
2a500 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
2a510 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65  pIdxInfo==0 ) re
2a520 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2a530 4d 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  M;.  pNew->prere
2a540 71 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72  q = 0;.  pNew->r
2a550 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
2a560 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
2a570 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
2a580 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
2a590 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
2a5a0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
2a5b0 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64  ;.  pUsage = pId
2a5c0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
2a5d0 6e 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73  ntUsage;.  nCons
2a5e0 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66  traint = pIdxInf
2a5f0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->nConstraint;.
2a600 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
2a610 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
2a620 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 20 72  nConstraint) ) r
2a630 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a640 45 4d 3b 0a 0a 20 20 66 6f 72 28 69 50 68 61 73  EM;..  for(iPhas
2a650 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20  e=0; iPhase<=3; 
2a660 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69  iPhase++){.    i
2a670 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69  f( !seenIn && (i
2a680 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20  Phase&1)!=0 ){. 
2a690 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20       iPhase++;. 
2a6a0 20 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e       if( iPhase>
2a6b0 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  3 ) break;.    }
2a6c0 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61  .    if( !seenVa
2a6d0 72 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20  r && iPhase>1 ) 
2a6e0 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43  break;.    pIdxC
2a6f0 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
2a700 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
2a710 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
2a720 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
2a730 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2a740 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
2a750 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
2a760 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20  xCons++){.      
2a770 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
2a780 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
2a790 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
2a7a0 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63  [j];.      switc
2a7b0 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20  h( iPhase ){.   
2a7c0 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20       case 0:    
2a7d0 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
2a7e0 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72  hout IN operator
2a7f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49   */.          pI
2a800 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2a810 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
2a820 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2a830 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
2a840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2a850 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eenIn = 1;.     
2a860 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
2a870 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
2a880 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t!=0 ){.        
2a890 20 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b      seenVar = 1;
2a8a0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2a8b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
2a8c0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2a8d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
2a8e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2a8f0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a  .        case 1:
2a900 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73      /* Constants
2a910 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f   with IN operato
2a920 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  rs */.          
2a930 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29  assert( seenIn )
2a940 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
2a950 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
2a960 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2a970 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ht==0);.        
2a980 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2a990 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56   case 2:    /* V
2a9a0 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74  ariables without
2a9b0 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   IN */.         
2a9c0 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72   assert( seenVar
2a9d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
2a9e0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2a9f0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2aa00 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a  or & WO_IN)==0;.
2aa10 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2aa20 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
2aa30 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  :   /* Variables
2aa40 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20   with IN */.    
2aa50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
2aa60 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20  enVar && seenIn 
2aa70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
2aa80 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2aa90 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
2aaa0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2aab0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73  }.    memset(pUs
2aac0 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
2aad0 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e  Usage[0])*pIdxIn
2aae0 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29  fo->nConstraint)
2aaf0 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e  ;.    if( pIdxIn
2ab00 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2ab10 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
2ab20 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
2ab30 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49  xStr);.    pIdxI
2ab40 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b  nfo->idxStr = 0;
2ab50 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
2ab60 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70  dxNum = 0;.    p
2ab70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2ab80 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
2ab90 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
2aba0 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
2abb0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
2abc0 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
2abd0 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
2abe0 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20   (double)2;.    
2abf0 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64  rc = vtabBestInd
2ac00 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ex(pParse, pTab,
2ac10 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20   pIdxInfo);.    
2ac20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
2ac30 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65  ereLoopAddVtab_e
2ac40 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  xit;.    pIdxCon
2ac50 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
2ac60 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
2ac70 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
2ac80 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
2ac90 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2aca0 20 3d 20 30 3b 0a 20 20 20 20 6d 78 54 65 72 6d   = 0;.    mxTerm
2acb0 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
2acc0 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
2acd0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a  =nConstraint );.
2ace0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2acf0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
2ad00 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
2ad10 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
2ad20 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
2ad30 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
2ad40 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
2ad50 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
2ad60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54  ){.      if( (iT
2ad70 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
2ad80 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
2ad90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
2ada0 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
2adb0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
2adc0 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
2add0 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20  traint.         
2ade0 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20  || j<0.         
2adf0 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
2ae00 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  .         || pNe
2ae10 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
2ae20 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
2ae30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2ae40 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2ae50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2ae60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
2ae70 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  s.xBestIndex() m
2ae80 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61  alfunction", pTa
2ae90 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
2aea0 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c       goto whereL
2aeb0 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
2aec0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2aed0 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
2aee0 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  >a[j];.        p
2aef0 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70  New->prereq |= p
2af00 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
2af10 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
2af20 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e  t( iTerm<pNew->n
2af30 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20  LSlot );.       
2af40 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54   pNew->aLTerm[iT
2af50 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  erm] = pTerm;.  
2af60 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
2af70 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20  mxTerm ) mxTerm 
2af80 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = iTerm;.       
2af90 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26   if( iTerm<16 &&
2afa0 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20   pUsage[i].omit 
2afb0 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f  ) pNew->u.vtab.o
2afc0 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54  mitMask |= 1<<iT
2afd0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
2afe0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2aff0 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
2b000 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2b010 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d  pUsage[i].omit==
2b020 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2b030 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   /* Do not attem
2b040 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20  pt to use an IN 
2b050 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68  constraint if th
2b060 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a  e virtual table.
2b070 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
2b080 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75  ays that the equ
2b090 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74  ivalent EQ const
2b0a0 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
2b0b0 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a  safely omitted..
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49              ** I
2b0d0 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20  f we do attempt 
2b0e0 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f  to use such a co
2b0f0 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72  nstraint, some r
2b100 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20  ows might be.   
2b110 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65           ** repe
2b120 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70  ated in the outp
2b130 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ut. */.         
2b140 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b150 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b160 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  /* A virtual tab
2b170 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  le that is const
2b180 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20  rained by an IN 
2b190 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20  clause may not. 
2b1a0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
2b1b0 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ume the ORDER BY
2b1c0 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20   clause because 
2b1d0 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66  (1) the order of
2b1e0 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20   IN terms.      
2b1f0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65      ** is not ne
2b200 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65  cessarily relate
2b210 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f  d to the order o
2b220 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61  f output terms a
2b230 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
2b240 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74  (2) Multiple out
2b250 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67  puts from a sing
2b260 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c  le IN value will
2b270 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20   not merge.     
2b280 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72       ** together
2b290 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2b2a0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
2b2b0 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
2b2c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2b2d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2b2e0 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b  >=nConstraint ){
2b2f0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
2b300 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a  erm = mxTerm+1;.
2b310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
2b320 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77  ew->nLTerm<=pNew
2b330 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
2b340 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
2b350 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f  dxNum = pIdxInfo
2b360 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20  ->idxNum;.      
2b370 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2b380 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
2b390 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2b3a0 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e  tr;.      pIdxIn
2b3b0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2b3c0 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  xStr = 0;.      
2b3d0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
2b3e0 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Str = pIdxInfo->
2b3f0 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e  idxStr;.      pN
2b400 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  ew->u.vtab.isOrd
2b410 65 72 65 64 20 3d 20 28 75 38 29 28 28 70 49 64  ered = (u8)((pId
2b420 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21  xInfo->nOrderBy!
2b430 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
2b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b450 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
2b460 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
2b470 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70 4e  sumed);.      pN
2b480 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2b490 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
2b4a0 20 3d 20 77 68 65 72 65 43 6f 73 74 46 72 6f 6d   = whereCostFrom
2b4b0 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d  Double(pIdxInfo-
2b4c0 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
2b4d0 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
2b4e0 3a 20 45 76 65 72 79 20 76 69 72 74 75 61 6c 20  : Every virtual 
2b4f0 74 61 62 6c 65 20 71 75 65 72 79 20 72 65 74 75  table query retu
2b500 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
2b510 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2b520 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
2b530 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35 29  6==whereCost(25)
2b540 20 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c   );.      whereL
2b550 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2b560 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2b570 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61   if( pNew->u.vta
2b580 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
2b590 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2b5a0 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  ee(pNew->u.vtab.
2b5b0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20  idxStr);.       
2b5c0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
2b5d0 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  edFree = 0;.    
2b5e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a    }.    }.  }  .
2b5f0 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61  .whereLoopAddVta
2b600 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70 49  b_exit:.  if( pI
2b610 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
2b620 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74  eeIdxStr ) sqlit
2b630 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f  e3_free(pIdxInfo
2b640 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
2b650 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2b660 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75  IdxInfo);.  retu
2b670 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
2b680 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
2b690 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
2b6a0 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c  /*.** Add WhereL
2b6b0 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68  oop entries to h
2b6c0 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20  andle OR terms. 
2b6d0 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20   This works for 
2b6e0 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73  either.** btrees
2b6f0 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c   or virtual tabl
2b700 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2b710 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  t whereLoopAddOr
2b720 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
2b730 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69 74  r *pBuilder, Bit
2b740 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20 20  mask mExtra){.  
2b750 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2b760 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2b770 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61  Info;.  WhereCla
2b780 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72  use *pWC;.  Wher
2b790 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57  eLoop *pNew;.  W
2b7a0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
2b7b0 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20   *pWCEnd;.  int 
2b7c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b7d0 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57 68    int iCur;.  Wh
2b7e0 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43  ereClause tempWC
2b7f0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  ;.  WhereLoopBui
2b800 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b 0a  lder sSubBuild;.
2b810 20 20 57 68 65 72 65 4c 6f 6f 70 20 73 42 65 73    WhereLoop sBes
2b820 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
2b830 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2b840 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
2b850 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28  lder->pWC;.  if(
2b860 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
2b870 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f  ags & WHERE_AND_
2b880 4f 4e 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51  ONLY ) return SQ
2b890 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e  LITE_OK;.  pWCEn
2b8a0 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
2b8b0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
2b8c0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2b8d0 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ;..  for(pTerm=p
2b8e0 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
2b8f0 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  End && rc==SQLIT
2b900 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  E_OK; pTerm++){.
2b910 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2b920 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
2b930 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  R)!=0.     && (p
2b940 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
2b950 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65  >indexable & pNe
2b960 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  w->maskSelf)!=0 
2b970 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68  .    ){.      Wh
2b980 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73  ereClause * cons
2b990 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d  t pOrWC = &pTerm
2b9a0 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
2b9b0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
2b9c0 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e   * const pOrWCEn
2b9d0 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f  d = &pOrWC->a[pO
2b9e0 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20  rWC->nTerm];.   
2b9f0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
2ba00 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 57 68 65  rTerm;.      Whe
2ba10 72 65 43 6f 73 74 20 72 54 6f 74 61 6c 20 3d 20  reCost rTotal = 
2ba20 30 3b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6f  0;.      WhereCo
2ba30 73 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20  st nRow = 0;.   
2ba40 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65     Bitmask prere
2ba50 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20  q = mExtra;.    
2ba60 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
2ba70 49 6e 69 74 28 26 73 42 65 73 74 29 3b 0a 20 20  Init(&sBest);.  
2ba80 20 20 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e      pItem = pWIn
2ba90 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20  fo->pTabList->a 
2baa0 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
2bab0 20 20 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d      iCur = pItem
2bac0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2bad0 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42   sSubBuild = *pB
2bae0 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53  uilder;.      sS
2baf0 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79  ubBuild.pOrderBy
2bb00 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62   = 0;.      sSub
2bb10 42 75 69 6c 64 2e 70 42 65 73 74 20 3d 20 26 73  Build.pBest = &s
2bb20 42 65 73 74 3b 0a 0a 20 20 20 20 20 20 66 6f 72  Best;..      for
2bb30 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e  (pOrTerm=pOrWC->
2bb40 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  a; rc==SQLITE_OK
2bb50 20 26 26 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57   && pOrTerm<pOrW
2bb60 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
2bb70 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
2bb80 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
2bb90 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
2bba0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
2bbb0 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
2bbc0 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
2bbd0 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
2bbe0 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
2bbf0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
2bc00 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
2bc10 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
2bc20 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
2bc30 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
2bc40 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
2bc50 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
2bc60 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
2bc70 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
2bc80 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
2bc90 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
2bca0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
2bcb0 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
2bcc0 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
2bcd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2bce0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2bcf0 20 7d 0a 20 20 20 20 20 20 20 20 73 42 65 73 74   }.        sBest
2bd00 2e 6d 61 73 6b 53 65 6c 66 20 3d 20 30 3b 0a 20  .maskSelf = 0;. 
2bd10 20 20 20 20 20 20 20 73 42 65 73 74 2e 72 53 65         sBest.rSe
2bd20 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tup = 0;.       
2bd30 20 73 42 65 73 74 2e 72 52 75 6e 20 3d 20 30 3b   sBest.rRun = 0;
2bd40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2bd50 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2bd60 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  E.        if( Is
2bd70 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
2bd80 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2bd90 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2bda0 41 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62  AddVirtual(&sSub
2bdb0 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a  Build, mExtra);.
2bdc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
2bdd0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
2bde0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
2bdf0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
2be00 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74  &sSubBuild, mExt
2be10 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ra);.        }. 
2be20 20 20 20 20 20 20 20 69 66 28 20 73 42 65 73 74         if( sBest
2be30 2e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 29 20 62  .maskSelf==0 ) b
2be40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73  reak;.        as
2be50 73 65 72 74 28 20 73 42 65 73 74 2e 72 53 65 74  sert( sBest.rSet
2be60 75 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  up==0 );.       
2be70 20 72 54 6f 74 61 6c 20 3d 20 77 68 65 72 65 43   rTotal = whereC
2be80 6f 73 74 41 64 64 28 72 54 6f 74 61 6c 2c 20 73  ostAdd(rTotal, s
2be90 42 65 73 74 2e 72 52 75 6e 29 3b 0a 20 20 20 20  Best.rRun);.    
2bea0 20 20 20 20 6e 52 6f 77 20 3d 20 77 68 65 72 65      nRow = where
2beb0 43 6f 73 74 41 64 64 28 6e 52 6f 77 2c 20 73 42  CostAdd(nRow, sB
2bec0 65 73 74 2e 6e 4f 75 74 29 3b 0a 20 20 20 20 20  est.nOut);.     
2bed0 20 20 20 70 72 65 72 65 71 20 7c 3d 20 73 42 65     prereq |= sBe
2bee0 73 74 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20  st.prereq;.     
2bef0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2bf00 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 31   pNew->nLSlot>=1
2bf10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 42   );.      if( sB
2bf20 65 73 74 2e 6d 61 73 6b 53 65 6c 66 20 29 7b 0a  est.maskSelf ){.
2bf30 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c          pNew->nL
2bf40 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
2bf50 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30    pNew->aLTerm[0
2bf60 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
2bf70 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2bf80 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
2bf90 52 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  R;.        pNew-
2bfa0 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
2bfb0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2bfc0 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20  = rTotal;.      
2bfd0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
2bfe0 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Row;.        pNe
2bff0 77 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72  w->prereq = prer
2c000 65 71 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  eq;.        mems
2c010 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20  et(&pNew->u, 0, 
2c020 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29  sizeof(pNew->u))
2c030 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
2c040 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2c050 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2c060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
2c070 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 70 57 49  ereLoopClear(pWI
2c080 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nfo->pParse->db,
2c090 20 26 73 42 65 73 74 29 3b 0a 20 20 20 20 7d 0a   &sBest);.    }.
2c0a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2c0b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  .}../*.** Add al
2c0c0 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
2c0d0 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  cts for all tabl
2c0e0 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es .*/.static in
2c0f0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  t whereLoopAddAl
2c100 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  l(WhereLoopBuild
2c110 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20  er *pBuilder){. 
2c120 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2c130 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2c140 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b  WInfo;.  Bitmask
2c150 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42   mExtra = 0;.  B
2c160 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20  itmask mPrior = 
2c170 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
2c180 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2c190 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
2c1a0 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
2c1b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2c1c0 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
2c1d0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
2c1e0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
2c1f0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
2c200 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20  ->nLevel;.  int 
2c210 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c220 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79    u8 priorJoinTy
2c230 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c  pe = 0;.  WhereL
2c240 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a  oop *pNew;..  /*
2c250 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
2c260 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
2c270 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
2c280 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
2c290 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2c2a0 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
2c2b0 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
2c2c0 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
2c2d0 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e  bList->a; iTab<n
2c2e0 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c  TabList; iTab++,
2c2f0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70   pItem++){.    p
2c300 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62  New->iTab = iTab
2c310 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b  ;.    pNew->mask
2c320 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26  Self = getMask(&
2c330 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
2c340 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2c350 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74  );.    if( ((pIt
2c360 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69  em->jointype|pri
2c370 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28 4a  orJoinType) & (J
2c380 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
2c390 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45  )!=0 ){.      mE
2c3a0 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20  xtra = mPrior;. 
2c3b0 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f     }.    priorJo
2c3c0 69 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e  inType = pItem->
2c3d0 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66  jointype;.    if
2c3e0 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
2c3f0 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
2c400 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2c410 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c  AddVirtual(pBuil
2c420 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
2c430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2c440 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2c450 42 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20  Btree(pBuilder, 
2c460 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  mExtra);.    }. 
2c470 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c480 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2c490 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f   = whereLoopAddO
2c4a0 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  r(pBuilder, mExt
2c4b0 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  ra);.    }.    m
2c4c0 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d  Prior |= pNew->m
2c4d0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28  askSelf;.    if(
2c4e0 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f   rc || db->mallo
2c4f0 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
2c500 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70  .  }.  whereLoop
2c510 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b  Clear(db, pNew);
2c520 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c530 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61  ./*.** Examine a
2c540 20 57 68 65 72 65 50 61 74 68 20 28 77 69 74 68   WherePath (with
2c550 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66   the addition of
2c560 20 74 68 65 20 65 78 74 72 61 20 57 68 65 72 65   the extra Where
2c570 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a  Loop of the 5th.
2c580 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20 74  ** parameters) t
2c590 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75 74 70  o see if it outp
2c5a0 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20  uts rows in the 
2c5b0 72 65 71 75 65 73 74 65 64 20 4f 52 44 45 52 20  requested ORDER 
2c5c0 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20  BY.** (or GROUP 
2c5d0 42 59 29 20 77 69 74 68 6f 75 74 20 72 65 71 75  BY) without requ
2c5e0 69 72 69 6e 67 20 61 20 73 65 70 61 72 61 74 65  iring a separate
2c5f0 20 73 6f 75 72 63 65 20 6f 70 65 72 61 74 69 6f   source operatio
2c600 6e 2e 20 20 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a  n.  Return:.** .
2c610 2a 2a 20 20 20 20 30 3a 20 20 4f 52 44 45 52 20  **    0:  ORDER 
2c620 42 59 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66  BY is not satisf
2c630 69 65 64 2e 20 20 53 6f 72 74 69 6e 67 20 72 65  ied.  Sorting re
2c640 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 31 3a 20  quired.**    1: 
2c650 20 4f 52 44 45 52 20 42 59 20 69 73 20 73 61 74   ORDER BY is sat
2c660 69 73 66 69 65 64 2e 20 20 20 20 20 20 4f 6d 69  isfied.      Omi
2c670 74 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 20 20 2d  t sorting.**   -
2c680 31 3a 20 20 55 6e 6b 6e 6f 77 6e 20 61 74 20 74  1:  Unknown at t
2c690 68 69 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2f 0a 73  his time.**.*/.s
2c6a0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50  tatic int whereP
2c6b0 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
2c6c0 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  rBy(.  WhereInfo
2c6d0 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20   *pWInfo,    /* 
2c6e0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2c6f0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2c700 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f  pOrderBy,   /* O
2c710 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
2c720 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20   BY or DISTINCT 
2c730 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20  clause to check 
2c740 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
2c750 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68  pPath,     /* Th
2c760 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63  e WherePath to c
2c770 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63  heck */.  u16 wc
2c780 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
2c790 2f 2a 20 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e  /* Might contain
2c7a0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f   WHERE_GROUPBY o
2c7b0 72 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  r WHERE_DISTINCT
2c7c0 42 59 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f  BY */.  u16 nLoo
2c7d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
2c7e0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
2c7f0 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f  es in pPath->aLo
2c800 6f 70 5b 5d 20 2a 2f 0a 20 20 75 38 20 69 73 4c  op[] */.  u8 isL
2c810 61 73 74 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  astLoop,        
2c820 2f 2a 20 54 72 75 65 20 69 66 20 70 4c 61 73 74  /* True if pLast
2c830 20 69 73 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f   is the inner-mo
2c840 73 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65  st loop */.  Whe
2c850 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20  reLoop *pLast,  
2c860 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57     /* Add this W
2c870 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20  hereLoop to the 
2c880 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c  end of pPath->aL
2c890 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61  oop[] */.  Bitma
2c8a0 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20  sk *pRevMask    
2c8b0 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66   /* OUT: Mask of
2c8c0 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72   WhereLoops to r
2c8d0 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  un in reverse or
2c8e0 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72  der */.){.  u8 r
2c8f0 65 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20  evSet;          
2c900 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76    /* True if rev
2c910 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75   is known */.  u
2c920 38 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  8 rev;          
2c930 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74       /* Composit
2c940 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a  e sort order */.
2c950 20 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20    u8 revIdx;    
2c960 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2c970 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
2c980 20 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69   u8 isOrderDisti
2c990 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72  nct;   /* All pr
2c9a0 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61  ior WhereLoops a
2c9b0 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  re order-distinc
2c9c0 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e  t */.  u8 distin
2c9d0 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20  ctColumns;   /* 
2c9e0 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70  True if the loop
2c9f0 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20   has UNIQUE NOT 
2ca00 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
2ca10 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20    u8 isMatch;   
2ca20 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75          /* iColu
2ca30 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72  mn matches a ter
2ca40 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
2ca50 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31  Y clause */.  u1
2ca60 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  6 nColumn;      
2ca70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ca80 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64   columns in pInd
2ca90 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64  ex */.  u16 nOrd
2caa0 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
2cab0 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e   Number terms in
2cac0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2cad0 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
2cae0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
2caf0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72  /* Index of Wher
2cb00 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62  eLoop in pPath b
2cb10 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a  eing processed *
2cb20 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
2cb30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2cb40 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
2cb50 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
2cb60 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2cb70 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65  number for curre
2cb80 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  nt WhereLoop */.
2cb90 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20    int iColumn;  
2cba0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c          /* A col
2cbb0 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69  umn number withi
2cbc0 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a  n table iCur */.
2cbd0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
2cbe0 6f 70 3b 20 20 20 20 20 2f 2a 20 43 75 72 72 65  op;     /* Curre
2cbf0 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69  nt WhereLoop bei
2cc00 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f  ng processed. */
2cc10 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
2cc20 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69  erm;     /* A si
2cc30 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
2cc40 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
2cc50 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72  .  Expr *pOBExpr
2cc60 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ;        /* An e
2cc70 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  xpression from t
2cc80 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2cc90 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  se */.  CollSeq 
2cca0 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a  *pColl;       /*
2ccb0 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f   COLLATE functio
2ccc0 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20  n from an ORDER 
2ccd0 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  BY clause term *
2cce0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
2ccf0 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  x;        /* The
2cd00 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
2cd10 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a  d with pLoop */.
2cd20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2cd30 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
2cd40 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
2cd50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
2cd60 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d   Bitmask obSat =
2cd70 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f   0;    /* Mask o
2cd80 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
2cd90 20 73 61 74 69 73 66 69 65 64 20 73 6f 20 66 61   satisfied so fa
2cda0 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  r */.  Bitmask o
2cdb0 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20  bDone;       /* 
2cdc0 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45  Mask of all ORDE
2cdd0 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
2cde0 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73  Bitmask orderDis
2cdf0 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d  tinctMask;  /* M
2ce00 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d  ask of all well-
2ce10 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f  ordered loops */
2ce20 0a 20 20 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57  .  ..  /*.  ** W
2ce30 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c  e say the WhereL
2ce40 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22  oop is "one-row"
2ce50 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73   if it generates
2ce60 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
2ce70 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75  e.  ** row of ou
2ce80 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f  tput.  A WhereLo
2ce90 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66  op is one-row if
2cea0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
2ceb0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
2cec0 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e    **  (a) All in
2ced0 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63  dex columns matc
2cee0 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c  h with WHERE_COL
2cef0 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62  UMN_EQ..  **  (b
2cf00 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75  ) The index is u
2cf10 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57  nique.  ** Any W
2cf20 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e  hereLoop with an
2cf30 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
2cf40 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
2cf50 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d  he rowid is one-
2cf60 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20  row..  ** Every 
2cf70 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
2cf80 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20  p will have the 
2cf90 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74  WHERE_ONEROW bit
2cfa0 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e   set in wsFlags.
2cfb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  **.  ** We sa
2cfc0 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
2cfd0 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e  is "order-distin
2cfe0 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f  ct" if the set o
2cff0 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20  f columns from. 
2d000 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f   ** that WhereLo
2d010 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  op that are in t
2d020 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2d030 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  se are different
2d040 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20   for every.  ** 
2d050 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65  row of the Where
2d060 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65  Loop.  Every one
2d070 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69  -row WhereLoop i
2d080 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
2d090 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69    ** order-disti
2d0a0 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f  nct.   A WhereLo
2d0b0 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63  op that has no c
2d0c0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52  olumns in the OR
2d0d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
2d0e0 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d  ** is not order-
2d0f0 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20  distinct. To be 
2d100 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69  order-distinct i
2d110 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
2d120 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20  same as being.  
2d130 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20  ** UNIQUE since 
2d140 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20  a UNIQUE column 
2d150 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76  or index can hav
2d160 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
2d170 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e  that .  ** are N
2d180 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c  ULL and NULL val
2d190 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65  ues are equivale
2d1a0 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nt for the purpo
2d1b0 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74  se of order-dist
2d1c0 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65  inct..  ** To be
2d1d0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c   order-distinct,
2d1e0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73   the columns mus
2d1f0 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20  t be UNIQUE and 
2d200 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  NOT NULL..  **. 
2d210 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
2d220 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77  r a table is alw
2d230 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e  ays UNIQUE and N
2d240 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65  OT NULL so whene
2d250 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77  ver the.  ** row
2d260 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  id appears in th
2d270 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2d280 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
2d290 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ding WhereLoop i
2d2a0 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  s.  ** automatic
2d2b0 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69  ally order-disti
2d2c0 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73  nct..  */..  ass
2d2d0 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
2d2e0 20 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62   );..  /* Sortab
2d2f0 69 6c 69 74 79 20 6f 66 20 76 69 72 74 75 61 6c  ility of virtual
2d300 20 74 61 62 6c 65 73 20 69 73 20 64 65 74 65 72   tables is deter
2d310 6d 69 6e 65 64 20 62 79 20 74 68 65 20 78 42 65  mined by the xBe
2d320 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20  stIndex method. 
2d330 20 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75   ** of the virtu
2d340 61 6c 20 74 61 62 6c 65 20 69 74 73 65 6c 66 20  al table itself 
2d350 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 2d 3e  */.  if( pLast->
2d360 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2d370 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a  VIRTUALTABLE ){.
2d380 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4c      testcase( nL
2d390 6f 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75  oop>0 );  /* Tru
2d3a0 65 20 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f  e when outer loo
2d3b0 70 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61  ps are one-row a
2d3c0 6e 64 20 6d 61 74 63 68 20 0a 20 20 20 20 20 20  nd match .      
2d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3e0 20 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20      ** no ORDER 
2d3f0 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  BY terms */.    
2d400 72 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e  return pLast->u.
2d410 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a  vtab.isOrdered;.
2d420 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20    }.  if( nLoop 
2d430 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
2d440 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
2d450 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
2d460 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  n) ) return 0;..
2d470 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
2d480 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
2d490 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53  if( nOrderBy>BMS
2d4a0 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  -1 ) return 0;  
2d4b0 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69  /* Cannot optimi
2d4c0 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20  ze overly large 
2d4d0 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69  ORDER BYs */.  i
2d4e0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
2d4f0 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d   1;.  obDone = M
2d500 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29  ASKBIT(nOrderBy)
2d510 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69  -1;.  orderDisti
2d520 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 66  nctMask = 0;.  f
2d530 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72  or(iLoop=0; isOr
2d540 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f  derDistinct && o
2d550 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69  bSat<obDone && i
2d560 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f  Loop<=nLoop; iLo
2d570 6f 70 2b 2b 29 7b 0a 20 20 20 20 70 4c 6f 6f 70  op++){.    pLoop
2d580 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f   = iLoop<nLoop ?
2d590 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c   pPath->aLoop[iL
2d5a0 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20  oop] : pLast;.  
2d5b0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
2d5c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2d5d0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
2d5e0 3d 30 20 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  =0 );.    iCur =
2d5f0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2d600 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62  t->a[pLoop->iTab
2d610 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69  ].iCursor;.    i
2d620 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
2d630 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
2d640 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  W)==0 ){.      i
2d650 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
2d660 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b  s & WHERE_IPK ){
2d670 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20  .        pIndex 
2d680 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  = 0;.        nCo
2d690 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  lumn = 0;.      
2d6a0 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65  }else if( (pInde
2d6b0 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
2d6c0 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c  ee.pIndex)==0 ||
2d6d0 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
2d6e0 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  red ){.        r
2d6f0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
2d700 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 43  else{.        nC
2d710 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
2d720 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  nColumn;.       
2d730 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2d740 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
2d750 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20  or!=OE_None;.   
2d760 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
2d770 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  or every term of
2d780 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
2d790 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
2d7a0 79 20 3d 3d 20 6f 72 20 49 53 20 4e 55 4c 4c 2c  y == or IS NULL,
2d7b0 0a 20 20 20 20 20 20 2a 2a 20 6d 61 72 6b 20 6f  .      ** mark o
2d7c0 66 66 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ff corresponding
2d7d0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
2d7e0 77 68 65 72 65 76 65 72 20 74 68 65 79 20 6f 63  wherever they oc
2d7f0 63 75 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  cur.      ** in 
2d800 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2d810 75 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  use..      */.  
2d820 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2d830 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
2d840 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  q; i++){.       
2d850 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e   pTerm = pLoop->
2d860 61 4c 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 20  aLTerm[i];.     
2d870 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
2d880 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
2d890 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 3d 3d 30  Q|WO_ISNULL))==0
2d8a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d8b0 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
2d8c0 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
2d8d0 6d 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  mn;.        for(
2d8e0 6a 3d 30 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b  j=0; j<nOrderBy;
2d8f0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
2d900 20 69 66 28 20 4d 41 53 4b 42 49 54 28 6a 29 20   if( MASKBIT(j) 
2d910 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
2d920 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ue;.          pO
2d930 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
2d940 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2d950 4f 72 64 65 72 42 79 2d 3e 61 5b 6a 5d 2e 70 45  OrderBy->a[j].pE
2d960 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
2d970 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
2d980 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
2d990 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2d9a0 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54   if( pOBExpr->iT
2d9b0 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e  able!=iCur ) con
2d9c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2d9d0 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43   if( pOBExpr->iC
2d9e0 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
2d9f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2da00 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
2da10 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2da20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2da30 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2da40 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
2da50 72 64 65 72 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78  rderBy->a[j].pEx
2da60 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
2da70 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
2da80 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
2da90 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
2daa0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
2dab0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
2dac0 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
2dad0 5b 69 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  [i])!=0 ) contin
2dae0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
2daf0 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
2db00 7c 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20  |= MASKBIT(j);. 
2db10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2db20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f   if( obSat==obDo
2db30 6e 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ne ) return 1;. 
2db40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2db50 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
2db60 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  l columns of the
2db70 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c 20   index and deal 
2db80 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20 20  with the ones.  
2db90 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20      ** that are 
2dba0 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  not constrained 
2dbb0 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20  by == or IN..   
2dbc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76 20     */.      rev 
2dbd0 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20 20  = revSet = 0;.  
2dbe0 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
2dbf0 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  mns = 0;.      f
2dc00 6f 72 28 6a 3d 30 3b 20 6a 3c 3d 6e 43 6f 6c 75  or(j=0; j<=nColu
2dc10 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
2dc20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a    u8 bOnce;   /*
2dc30 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74 68 65   True to run the
2dc40 20 4f 52 44 45 52 20 42 59 20 73 65 61 72 63 68   ORDER BY search
2dc50 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20   loop */..      
2dc60 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d    /* Skip over =
2dc70 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65  = and IS NULL te
2dc80 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  rms */.        i
2dc90 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74  f( j<pLoop->u.bt
2dca0 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
2dcb0 20 26 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d   && ((i = pLoop-
2dcc0 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65  >aLTerm[j]->eOpe
2dcd0 72 61 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c  rator) & (WO_EQ|
2dce0 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20  WO_ISNULL))!=0. 
2dcf0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2dd00 20 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49      if( i & WO_I
2dd10 53 4e 55 4c 4c 20 29 20 69 73 4f 72 64 65 72 44  SNULL ) isOrderD
2dd20 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
2dd30 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2dd40 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20    .        }..  
2dd50 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65        /* Get the
2dd60 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
2dd70 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f  n the table (iCo
2dd80 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f  lumn) and sort o
2dd90 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rder.        ** 
2dda0 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65  (revIdx) for the
2ddb0 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   j-th column of 
2ddc0 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
2ddd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2dde0 28 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ( j<nColumn ){. 
2ddf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d           /* Norm
2de00 61 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  al index columns
2de10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 43   */.          iC
2de20 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
2de30 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
2de40 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
2de50 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
2de60 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  er[j];.         
2de70 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
2de80 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  ndex->pTable->iP
2de90 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20  Key ) iColumn = 
2dea0 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
2deb0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2dec0 54 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  The ROWID column
2ded0 20 61 74 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20   at the end */. 
2dee0 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
2def0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
2df00 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20   revIdx = 0;.   
2df10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2df20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69  /* An unconstrai
2df30 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ned column that 
2df40 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65  might be NULL me
2df50 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20  ans that this.  
2df60 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f        ** WhereLo
2df70 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f  op is not well-o
2df80 72 64 65 72 65 64 20 0a 20 20 20 20 20 20 20 20  rdered .        
2df90 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
2dfa0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20  sOrderDistinct. 
2dfb0 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75          && iColu
2dfc0 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26  mn>=0.         &
2dfd0 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  & j>=pLoop->u.bt
2dfe0 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
2dff0 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62   && pIndex->pTab
2e000 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
2e010 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20  ].notNull==0.   
2e020 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2e030 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2e040 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
2e050 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e  ..        /* Fin
2e060 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  d the ORDER BY t
2e070 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70  erm that corresp
2e080 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68  onds to the j-th
2e090 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20   column.        
2e0a0 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
2e0b0 61 6e 64 20 61 6e 64 20 6d 61 72 6b 20 74 68 61  and and mark tha
2e0c0 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  t ORDER BY term 
2e0d0 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  off .        */.
2e0e0 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20          bOnce = 
2e0f0 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74  1;.        isMat
2e100 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
2e110 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26  for(i=0; bOnce &
2e120 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  & i<nOrderBy; i+
2e130 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2e140 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
2e150 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
2e160 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78  .          pOBEx
2e170 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2e180 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64  SkipCollate(pOrd
2e190 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
2e1a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2e1b0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28   (wctrlFlags & (
2e1c0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48  WHERE_GROUPBY|WH
2e1d0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29  ERE_DISTINCTBY))
2e1e0 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b  ==0 ) bOnce = 0;
2e1f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2e200 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
2e210 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
2e220 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e230 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
2e240 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
2e250 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e260 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
2e270 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  !=iColumn ) cont
2e280 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2e290 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  if( iColumn>=0 )
2e2a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
2e2b0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2e2c0 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
2e2d0 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  >pParse, pOrderB
2e2e0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
2e2f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e300 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
2e310 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
2e320 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e330 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
2e340 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e  Coll->zName, pIn
2e350 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21  dex->azColl[j])!
2e360 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2e370 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e380 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31       isMatch = 1
2e390 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2e3a0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2e3b0 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68       if( isMatch
2e3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2e3d0 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 64 69  ( iColumn<0 ) di
2e3e0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
2e3f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53  1;.          obS
2e400 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
2e410 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e420 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2e430 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
2e440 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PBY)==0 ){.     
2e450 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
2e460 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  ure the sort ord
2e470 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  er is compatible
2e480 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
2e490 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20  clause..        
2e4a0 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65      ** Sort orde
2e4b0 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20  r is irrelevant 
2e4c0 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63  for a GROUP BY c
2e4d0 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  lause. */.      
2e4e0 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
2e4f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e500 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76    if( (rev ^ rev
2e510 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e  Idx)!=pOrderBy->
2e520 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[i].sortOrder )
2e530 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
2e540 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e550 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
2e560 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
2e570 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
2e580 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
2e590 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52     if( rev ) *pR
2e5a0 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  evMask |= MASKBI
2e5b0 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  T(iLoop);.      
2e5c0 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
2e5d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2e5e0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2e5f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e600 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74         /* No mat
2e610 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  ch found */.    
2e620 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c        if( j==0 |
2e630 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 20 69 73  | j<nColumn ) is
2e640 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2e650 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
2e660 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2e670 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f      } /* end Loo
2e680 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78  p over all index
2e690 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
2e6a0 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f    if( distinctCo
2e6b0 6c 75 6d 6e 73 20 29 20 69 73 4f 72 64 65 72 44  lumns ) isOrderD
2e6c0 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20  istinct = 1;.   
2e6d0 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74   } /* end-if not
2e6e0 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20   one-row */..   
2e6f0 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
2e700 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20   other ORDER BY 
2e710 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72  terms that refer
2e720 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  ence pLoop */.  
2e730 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
2e740 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f  tinct ){.      o
2e750 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2e760 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
2e770 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  elf;.      for(i
2e780 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
2e790 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  i++){.        Ex
2e7a0 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69  pr *p;.        i
2e7b0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
2e7c0 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
2e7d0 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f  ;.        p = pO
2e7e0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2e7f0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
2e800 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28  (exprTableUsage(
2e810 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
2e820 74 2c 20 70 29 26 7e 6f 72 64 65 72 44 69 73 74  t, p)&~orderDist
2e830 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a  inctMask)==0 ){.
2e840 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
2e850 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
2e860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e870 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2e880 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29   obSat==obDone )
2e890 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
2e8a0 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63   !isOrderDistinc
2e8b0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  t ) return 0;.  
2e8c0 69 66 28 20 69 73 4c 61 73 74 4c 6f 6f 70 20 29  if( isLastLoop )
2e8d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
2e8e0 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65  urn -1;.}..#ifde
2e8f0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2e900 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75  BLED./* For debu
2e910 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20  gging use only: 
2e920 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2e930 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e  char *wherePathN
2e940 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70  ame(WherePath *p
2e950 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c  Path, int nLoop,
2e960 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
2e970 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  t){.  static cha
2e980 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69  r zName[65];.  i
2e990 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
2e9a0 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20   i<nLoop; i++){ 
2e9b0 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68  zName[i] = pPath
2e9c0 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b  ->aLoop[i]->cId;
2e9d0 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29   }.  if( pLast )
2e9e0 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c   zName[i++] = pL
2e9f0 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d  ast->cId;.  zNam
2ea00 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  e[i] = 0;.  retu
2ea10 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
2ea20 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  if.../*.** Given
2ea30 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
2ea40 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 6f  reLoop objects o
2ea50 6e 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  n pWInfo->pLoops
2ea60 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
2ea70 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  * attempts to fi
2ea80 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
2ea90 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73  st path that vis
2eaa0 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f  its each WhereLo
2eab0 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69  op.** once.  Thi
2eac0 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c  s path is then l
2ead0 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70  oaded into the p
2eae0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f  WInfo->a[].pWLoo
2eaf0 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  p fields..**.** 
2eb00 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2eb10 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
2eb20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
2eb30 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2eb40 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
2eb50 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
2eb60 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
2eb70 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
2eb80 6e 66 6f 2c 20 57 68 65 72 65 43 6f 73 74 20 6e  nfo, WhereCost n
2eb90 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d  RowEst){.  int m
2eba0 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20  xChoice;        
2ebb0 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2ebc0 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74  number of simult
2ebd0 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61  aneous paths tra
2ebe0 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  cked */.  int nL
2ebf0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
2ec00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ec10 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f   terms in the jo
2ec20 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  in */.  Parse *p
2ec30 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
2ec40 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
2ec50 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
2ec60 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2ec70 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2ec80 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2ec90 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
2eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ecb0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76   Loop counter ov
2ecc0 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
2ecd0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e  the join */.  in
2ece0 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20  t ii, jj;       
2ecf0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ed00 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
2ed10 65 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20  ereCost rCost;  
2ed20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2ed30 73 74 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a  st of a path */.
2ed40 20 20 57 68 65 72 65 43 6f 73 74 20 6d 78 43 6f    WhereCost mxCo
2ed50 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
2ed60 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f  * Maximum cost o
2ed70 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73  f a set of paths
2ed80 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
2ed90 72 53 6f 72 74 43 6f 73 74 3b 20 20 20 20 20 20  rSortCost;      
2eda0 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20 64 6f     /* Cost to do
2edb0 20 61 20 73 6f 72 74 20 2a 2f 0a 20 20 69 6e 74   a sort */.  int
2edc0 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20   nTo, nFrom;    
2edd0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ede0 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65   of valid entrie
2edf0 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61  s in aTo[] and a
2ee00 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  From[] */.  Wher
2ee10 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20  ePath *aFrom;   
2ee20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72        /* All nFr
2ee30 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20  om paths at the 
2ee40 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a  previous level *
2ee50 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
2ee60 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
2ee70 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61   The nTo best pa
2ee80 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65  ths at the curre
2ee90 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  nt level */.  Wh
2eea0 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20  erePath *pFrom; 
2eeb0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
2eec0 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d  ement of aFrom[]
2eed0 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
2eee0 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
2eef0 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20  rePath *pTo;    
2ef00 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
2ef10 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68  ment of aTo[] th
2ef20 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
2ef30 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  g on */.  WhereL
2ef40 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20  oop *pWLoop;    
2ef50 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
2ef60 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
2ef70 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  cts */.  WhereLo
2ef80 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20  op **pX;        
2ef90 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69     /* Used to di
2efa0 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65  vy up the pSpace
2efb0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61   memory */.  cha
2efc0 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  r *pSpace;      
2efd0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
2efe0 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ary memory used 
2eff0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
2f000 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
2f010 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
2f020 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2f030 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e  ;.  nLoop = pWIn
2f040 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a  fo->nLevel;.  /*
2f050 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d   TUNING: For sim
2f060 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c  ple queries, onl
2f070 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68 20  y the best path 
2f080 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a  is tracked..  **
2f090 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73   For 2-way joins
2f0a0 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61 74  , the 5 best pat
2f0b0 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e  hs are followed.
2f0c0 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20  .  ** For joins 
2f0d0 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62  of 3 or more tab
2f0e0 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31  les, track the 1
2f0f0 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a  0 best paths */.
2f100 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c    mxChoice = (nL
2f110 6f 6f 70 3d 3d 31 29 20 3f 20 31 20 3a 20 28 6e  oop==1) ? 1 : (n
2f120 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30  Loop==2 ? 5 : 10
2f130 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  );.  assert( nLo
2f140 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62  op<=pWInfo->pTab
2f150 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
2f160 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32  WHERETRACE(0x002
2f170 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73  , ("---- begin s
2f180 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f  olver\n"));..  /
2f190 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2f1a0 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20  nitialize space 
2f1b0 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46 72 6f  for aTo and aFro
2f1c0 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73 69 7a  m */.  ii = (siz
2f1d0 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b 73  eof(WherePath)+s
2f1e0 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a  izeof(WhereLoop*
2f1f0 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63  )*nLoop)*mxChoic
2f200 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20 3d 20  e*2;.  pSpace = 
2f210 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
2f220 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20 69 66  aw(db, ii);.  if
2f230 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  ( pSpace==0 ) re
2f240 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2f250 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72  M;.  aTo = (Wher
2f260 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20  ePath*)pSpace;. 
2f270 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43   aFrom = aTo+mxC
2f280 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28  hoice;.  memset(
2f290 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  aFrom, 0, sizeof
2f2a0 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70  (aFrom[0]));.  p
2f2b0 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a  X = (WhereLoop**
2f2c0 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65  )(aFrom+mxChoice
2f2d0 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68  );.  for(ii=mxCh
2f2e0 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54  oice*2, pFrom=aT
2f2f0 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70  o; ii>0; ii--, p
2f300 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c  From++, pX += nL
2f310 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  oop){.    pFrom-
2f320 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d  >aLoop = pX;.  }
2f330 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20  ..  /* Seed the 
2f340 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69  search with a si
2f350 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63  ngle WherePath c
2f360 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57  ontaining zero W
2f370 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a  hereLoops..  **.
2f380 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20    ** TUNING: Do 
2f390 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62  not let the numb
2f3a0 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
2f3b0 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20 20 49   go above 25.  I
2f3c0 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20  f the cost.  ** 
2f3d0 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20  of computing an 
2f3e0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
2f3f0 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b  is not paid back
2f400 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
2f410 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73 2c 20  t 25.  ** rows, 
2f420 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20  then do not use 
2f430 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
2f440 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b  dex. */.  aFrom[
2f450 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50  0].nRow = MIN(pP
2f460 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
2f470 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74 28 20  , 46);  assert( 
2f480 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35  46==whereCost(25
2f490 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31  ) );.  nFrom = 1
2f4a0 3b 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75  ;..  /* Precompu
2f4b0 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  te the cost of s
2f4c0 6f 72 74 69 6e 67 20 74 68 65 20 66 69 6e 61 6c  orting the final
2f4d0 20 72 65 73 75 6c 74 20 73 65 74 2c 20 69 66 20   result set, if 
2f4e0 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20  the caller.  ** 
2f4f0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
2f500 65 67 69 6e 28 29 20 77 61 73 20 63 6f 6e 63 65  egin() was conce
2f510 72 6e 65 64 20 61 62 6f 75 74 20 73 6f 72 74 69  rned about sorti
2f520 6e 67 20 2a 2f 0a 20 20 72 53 6f 72 74 43 6f 73  ng */.  rSortCos
2f530 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 49  t = 0;.  if( pWI
2f540 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
2f550 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29   || nRowEst==0 )
2f560 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69  {.    aFrom[0].i
2f570 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
2f580 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
2f590 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d  /* TUNING: Estim
2f5a0 61 74 65 64 20 63 6f 73 74 20 6f 66 20 73 6f 72  ated cost of sor
2f5b0 74 69 6e 67 20 69 73 20 4e 2a 6c 6f 67 32 28 4e  ting is N*log2(N
2f5c0 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  ) where N is the
2f5d0 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  .    ** number o
2f5e0 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 20 2a  f output rows. *
2f5f0 2f 0a 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20  /.    rSortCost 
2f600 3d 20 6e 52 6f 77 45 73 74 20 2b 20 65 73 74 4c  = nRowEst + estL
2f610 6f 67 28 6e 52 6f 77 45 73 74 29 3b 0a 20 20 20  og(nRowEst);.   
2f620 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30   WHERETRACE(0x00
2f630 32 2c 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f  2,("---- sort co
2f640 73 74 3d 25 2d 33 64 5c 6e 22 2c 20 72 53 6f 72  st=%-3d\n", rSor
2f650 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20  tCost));.  }..  
2f660 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65  /* Compute succe
2f670 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57  ssively longer W
2f680 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20  herePaths using 
2f690 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e  the previous gen
2f6a0 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20  eration.  ** of 
2f6b0 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68  WherePaths as th
2f6c0 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20  e basis for the 
2f6d0 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63  next.  Keep trac
2f6e0 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  k of the mxChoic
2f6f0 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68  e.  ** best path
2f700 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61  s at each genera
2f710 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  tion */.  for(iL
2f720 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
2f730 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
2f740 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66    nTo = 0;.    f
2f750 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61  or(ii=0, pFrom=a
2f760 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  From; ii<nFrom; 
2f770 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a  ii++, pFrom++){.
2f780 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70        for(pWLoop
2f790 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b  =pWInfo->pLoops;
2f7a0 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d   pWLoop; pWLoop=
2f7b0 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f  pWLoop->pNextLoo
2f7c0 70 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  p){.        Bitm
2f7d0 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20 20 20  ask maskNew;.   
2f7e0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
2f7f0 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mask = 0;.      
2f800 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 56 61    u8 isOrderedVa
2f810 6c 69 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  lid = pFrom->isO
2f820 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20 20 20  rderedValid;.   
2f830 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72 65       u8 isOrdere
2f840 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  d = pFrom->isOrd
2f850 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  ered;.        if
2f860 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65  ( (pWLoop->prere
2f870 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b  q & ~pFrom->mask
2f880 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69  Loop)!=0 ) conti
2f890 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
2f8a0 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   (pWLoop->maskSe
2f8b0 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  lf & pFrom->mask
2f8c0 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69  Loop)!=0 ) conti
2f8d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  nue;.        /* 
2f8e0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70  At this point, p
2f8f0 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69  WLoop is a candi
2f900 64 61 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e  date to be the n
2f910 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20  ext loop. .     
2f920 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74     ** Compute it
2f930 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20  s cost */.      
2f940 20 20 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43    rCost = whereC
2f950 6f 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72  ostAdd(pWLoop->r
2f960 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52  Setup,pWLoop->rR
2f970 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  un + pFrom->nRow
2f980 29 3b 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74  );.        rCost
2f990 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
2f9a0 72 43 6f 73 74 2c 20 70 46 72 6f 6d 2d 3e 72 43  rCost, pFrom->rC
2f9b0 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 61  ost);.        ma
2f9c0 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d  skNew = pFrom->m
2f9d0 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
2f9e0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2f9f0 20 20 20 20 69 66 28 20 21 69 73 4f 72 64 65 72      if( !isOrder
2fa00 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  edValid ){.     
2fa10 20 20 20 20 20 73 77 69 74 63 68 28 20 77 68 65       switch( whe
2fa20 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
2fa30 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20  rderBy(pWInfo,. 
2fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa50 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
2fa60 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70  rderBy, pFrom, p
2fa70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2fa80 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2fa90 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c            iLoop,
2faa0 20 69 4c 6f 6f 70 3d 3d 6e 4c 6f 6f 70 2d 31 2c   iLoop==nLoop-1,
2fab0 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73   pWLoop, &revMas
2fac0 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
2fad0 20 20 63 61 73 65 20 31 3a 20 20 2f 2a 20 59 65    case 1:  /* Ye
2fae0 73 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  s.  pFrom+pWLoop
2faf0 20 64 6f 65 73 20 73 61 74 69 73 66 79 20 74 68   does satisfy th
2fb00 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2fb10 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
2fb20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 31     isOrdered = 1
2fb30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2fb40 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
2fb50 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2fb60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2fb70 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 2f 2a       case 0:  /*
2fb80 20 4e 6f 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f   No.  pFrom+pWLo
2fb90 6f 70 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  op will require 
2fba0 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20  a separate sort 
2fbb0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2fbc0 20 69 73 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a   isOrdered = 0;.
2fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2fbe0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31  OrderedValid = 1
2fbf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2fc00 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73  rCost = whereCos
2fc10 74 41 64 64 28 72 43 6f 73 74 2c 20 72 53 6f 72  tAdd(rCost, rSor
2fc20 74 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  tCost);.        
2fc30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2fc40 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
2fc50 3a 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c  : /* Cannot tell
2fc60 20 79 65 74 2e 20 20 54 72 79 20 61 67 61 69 6e   yet.  Try again
2fc70 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 74 65   on the next ite
2fc80 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
2fc90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2fca0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fcb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fcc0 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46      revMask = pF
2fcd0 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
2fce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fcf0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
2fd00 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64  if pWLoop should
2fd10 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
2fd20 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 20 73   mxChoice best s
2fd30 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
2fd40 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61   for(jj=0, pTo=a
2fd50 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b  To; jj<nTo; jj++
2fd60 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
2fd70 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73      if( pTo->mas
2fd80 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 20 26  kLoop==maskNew &
2fd90 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  & pTo->isOrdered
2fda0 56 61 6c 69 64 3d 3d 69 73 4f 72 64 65 72 65 64  Valid==isOrdered
2fdb0 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Valid ){.       
2fdc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2fdd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fde0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a  }.        if( jj
2fdf0 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20  >=nTo ){.       
2fe00 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
2fe10 6f 69 63 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d  oice && rCost>=m
2fe20 78 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20  xCost ){.#ifdef 
2fe30 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2fe40 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ED.            i
2fe50 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2fe60 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
2fe70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2fe80 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b  3DebugPrintf("Sk
2fe90 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 33 64  ip   %s cost=%3d
2fea0 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
2feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fec0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
2fed0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
2fee0 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20  op), rCost,.    
2fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2ff00 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28  OrderedValid ? (
2ff10 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
2ff20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
2ff30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
2ff40 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
2ff50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2ff60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ff70 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 50 61 74  /* Add a new Pat
2ff80 68 20 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73  h to the aTo[] s
2ff90 65 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  et */.          
2ffa0 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65  if( nTo<mxChoice
2ffb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ffc0 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  /* Increase the 
2ffd0 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20  size of the aTo 
2ffe0 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20  set by one */.  
2fff0 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e            jj = n
30000 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  To++;.          
30010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
30020 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72     /* New path r
30030 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f  eplaces the prio
30040 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20  r worst to keep 
30050 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68  count below mxCh
30060 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  oice */.        
30070 20 20 20 20 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31      for(jj=nTo-1
30080 3b 20 61 54 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c  ; aTo[jj].rCost<
30090 6d 78 43 6f 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61  mxCost; jj--){ a
300a0 73 73 65 72 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20  ssert(jj>0); }. 
300b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
300c0 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b       pTo = &aTo[
300d0 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52  jj];.#ifdef WHER
300e0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
300f0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
30100 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
30110 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
30120 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
30130 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20  intf("New    %s 
30140 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d  cost=%-3d order=
30150 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
30160 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
30170 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
30180 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
30190 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
301a0 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
301b0 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f  d ? (isOrdered ?
301c0 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
301d0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
301e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
301f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
30200 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d  if( pTo->rCost<=
30210 72 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20  rCost ){.#ifdef 
30220 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
30230 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ED.            i
30240 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
30250 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
30260 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30270 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
30280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30290 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
302a0 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  %-3d order=%c",.
302b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302c0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
302d0 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
302e0 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20  Loop), rCost,.  
302f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30300 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
30310 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59   (isOrdered ? 'Y
30320 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
30330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
30340 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
30350 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74  f("   vs %s cost
30360 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  =%-3d order=%c\n
30370 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
30380 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
30390 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
303a0 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
303b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
303c0 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
303d0 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69  dValid ? (pTo->i
303e0 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
303f0 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
30400 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
30410 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  if.            c
30420 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
30430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
30440 2a 20 41 20 6e 65 77 20 61 6e 64 20 62 65 74 74  * A new and bett
30450 65 72 20 73 63 6f 72 65 20 66 6f 72 20 61 20 70  er score for a p
30460 72 65 76 69 6f 75 73 6c 79 20 63 72 65 61 74 65  reviously create
30470 64 20 65 71 75 69 76 61 6c 65 6e 74 20 70 61 74  d equivalent pat
30480 68 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  h */.#ifdef WHER
30490 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
304a0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
304b0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
304c0 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
304d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
304e0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
304f0 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73        "Update %s
30500 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72   cost=%-3d order
30510 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
30520 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
30530 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
30540 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
30550 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30560 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
30570 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
30580 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
30590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
305a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
305b0 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74  f("  was %s cost
305c0 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  =%-3d order=%c\n
305d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
305e0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
305f0 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
30600 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20  ), pTo->rCost,. 
30610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
30620 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
30630 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  id ? (pTo->isOrd
30640 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
30650 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
30660 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
30670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
30680 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69  * pWLoop is a wi
30690 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f  nner.  Add it to
306a0 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
306b0 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
306c0 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70     pTo->maskLoop
306d0 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
306e0 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
306f0 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70  kSelf;.        p
30700 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65  To->revLoop = re
30710 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  vMask;.        p
30720 54 6f 2d 3e 6e 52 6f 77 20 3d 20 70 46 72 6f 6d  To->nRow = pFrom
30730 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d  ->nRow + pWLoop-
30740 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70  >nOut;.        p
30750 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  To->rCost = rCos
30760 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
30770 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
30780 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b   isOrderedValid;
30790 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73  .        pTo->is
307a0 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65  Ordered = isOrde
307b0 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  red;.        mem
307c0 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20  cpy(pTo->aLoop, 
307d0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69  pFrom->aLoop, si
307e0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
307f0 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  *iLoop);.       
30800 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f   pTo->aLoop[iLoo
30810 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20  p] = pWLoop;.   
30820 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
30830 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
30840 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f      mxCost = aTo
30850 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20  [0].rCost;.     
30860 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70       for(jj=1, p
30870 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d  To=&aTo[1]; jj<m
30880 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70  xChoice; jj++, p
30890 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
308a0 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73     if( pTo->rCos
308b0 74 3e 6d 78 43 6f 73 74 20 29 20 6d 78 43 6f 73  t>mxCost ) mxCos
308c0 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a  t = pTo->rCost;.
308d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
308e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
308f0 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52    }..#ifdef WHER
30900 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
30910 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
30920 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20  ereTrace>=2 ){. 
30930 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
30940 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66  gPrintf("---- af
30950 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d  ter round %d ---
30960 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20  -\n", iLoop);.  
30970 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54      for(ii=0, pT
30980 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69  o=aTo; ii<nTo; i
30990 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  i++, pTo++){.   
309a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
309b0 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73  gPrintf(" %s cos
309c0 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64  t=%-3d nrow=%-3d
309d0 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
309e0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
309f0 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
30a00 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
30a10 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
30a20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
30a30 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28  OrderedValid ? (
30a40 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f  pTo->isOrdered ?
30a50 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
30a60 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ');.        if( 
30a70 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
30a80 6c 69 64 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72  lid && pTo->isOr
30a90 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
30aa0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
30ab0 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c  rintf(" rev=0x%l
30ac0 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c  lx\n", pTo->revL
30ad0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oop);.        }e
30ae0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
30af0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
30b00 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  f("\n");.       
30b10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
30b20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
30b30 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f  Swap the roles o
30b40 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20  f aFrom and aTo 
30b50 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e  for the next gen
30b60 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70  eration */.    p
30b70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20  From = aTo;.    
30b80 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20  aTo = aFrom;.   
30b90 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a   aFrom = pFrom;.
30ba0 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b      nFrom = nTo;
30bb0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f  .  }..  if( nFro
30bc0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
30bd0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
30be0 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f  se, "no query so
30bf0 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71  lution");.    sq
30c00 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
30c10 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74  pSpace);.    ret
30c20 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
30c30 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
30c40 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
30c50 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20  st path.  pFrom 
30c60 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
30c70 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61  nting to that pa
30c80 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20  th */.  pFrom = 
30c90 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d  aFrom;.  for(ii=
30ca0 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  1; ii<nFrom; ii+
30cb0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  +){.    if( pFro
30cc0 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69  m->rCost>aFrom[i
30cd0 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d  i].rCost ) pFrom
30ce0 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20   = &aFrom[ii];. 
30cf0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49   }.  assert( pWI
30d00 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f  nfo->nLevel==nLo
30d10 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20  op );.  /* Load 
30d20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
30d30 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f  path into pWInfo
30d40 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
30d50 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
30d60 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68  iLoop++){.    Wh
30d70 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
30d80 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69   = pWInfo->a + i
30d90 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Loop;.    pLevel
30da0 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f  ->pWLoop = pWLoo
30db0 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  p = pFrom->aLoop
30dc0 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65  [iLoop];.    pLe
30dd0 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c  vel->iFrom = pWL
30de0 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70  oop->iTab;.    p
30df0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
30e00 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
30e10 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
30e20 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d  om].iCursor;.  }
30e30 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e  .  if( (pWInfo->
30e40 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
30e50 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d  RE_DISTINCTBY)==
30e60 30 20 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  0 .   && pWInfo-
30e70 3e 70 44 69 73 74 69 6e 63 74 0a 20 20 20 26 26  >pDistinct.   &&
30e80 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20   nRowEst.  ){.  
30e90 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65    Bitmask notUse
30ea0 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  d;.    int rc = 
30eb0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
30ec0 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
30ed0 2c 20 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69  , pWInfo->pDisti
30ee0 6e 63 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20  nct, pFrom,.    
30ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
30f00 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e  RE_DISTINCTBY, n
30f10 4c 6f 6f 70 2d 31 2c 20 31 2c 20 70 46 72 6f 6d  Loop-1, 1, pFrom
30f20 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
30f30 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
30f40 20 69 66 28 20 72 63 3d 3d 31 20 29 20 70 57 49   if( rc==1 ) pWI
30f50 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
30f60 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
30f70 4f 52 44 45 52 45 44 3b 0a 20 20 7d 0a 20 20 69  ORDERED;.  }.  i
30f80 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65  f( pFrom->isOrde
30f90 72 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70  red ){.    if( p
30fa0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
30fb0 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
30fc0 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 70 57  CTBY ){.      pW
30fd0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
30fe0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
30ff0 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 65  _ORDERED;.    }e
31000 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  lse{.      pWInf
31010 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20  o->bOBSat = 1;. 
31020 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
31030 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
31040 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  vLoop;.    }.  }
31050 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
31060 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
31070 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d  ;..  /* Free tem
31080 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e  porary memory an
31090 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  d return success
310a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
310b0 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b  ree(db, pSpace);
310c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
310d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  _OK;.}../*.** Mo
310e0 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f  st queries use o
310f0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
31100 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74  le (they are not
31110 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65   joins) and have
31120 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f  .** simple == co
31130 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73  nstraints agains
31140 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73  t indexed fields
31150 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
31160 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70  attempts.** to p
31170 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65  lan those simple
31180 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63   cases using muc
31190 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20  h less ceremony 
311a0 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65  than the.** gene
311b0 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
311c0 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74  y planner, and t
311d0 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73  hereby yield fas
311e0 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ter sqlite3_prep
311f0 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66  are().** times f
31200 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
31210 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  se..**.** Return
31220 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63   non-zero on suc
31230 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75  cess, if this qu
31240 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c  ery can be handl
31250 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f  ed by this.** no
31260 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c  -frills query pl
31270 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a  anner.  Return z
31280 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72  ero if this quer
31290 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20  y needs the .** 
312a0 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
312b0 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a  query planner..*
312c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
312d0 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65  reShortCut(Where
312e0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
312f0 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49  ilder){.  WhereI
31300 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73  nfo *pWInfo;.  s
31310 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
31320 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65  em *pItem;.  Whe
31330 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
31340 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
31350 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  m;.  WhereLoop *
31360 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75  pLoop;.  int iCu
31370 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61  r;.  int j;.  Ta
31380 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
31390 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70  ex *pIdx;.  .  p
313a0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
313b0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20  ->pWInfo;.  if( 
313c0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
313d0 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45  gs & WHERE_FORCE
313e0 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20  _TABLE ) return 
313f0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  0;.  assert( pWI
31400 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
31410 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65  Src>=1 );.  pIte
31420 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
31430 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20  List->a;.  pTab 
31440 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
31450 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
31460 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
31470 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 49  .  if( pItem->zI
31480 6e 64 65 78 20 29 20 72 65 74 75 72 6e 20 30 3b  ndex ) return 0;
31490 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d  .  iCur = pItem-
314a0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20  >iCursor;.  pWC 
314b0 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
314c0 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64    pLoop = pBuild
314d0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f  er->pNew;.  pLoo
314e0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a  p->wsFlags = 0;.
314f0 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
31500 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
31510 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a  , 0, WO_EQ, 0);.
31520 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
31530 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
31540 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
31550 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48  _EQ|WHERE_IPK|WH
31560 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20  ERE_ONEROW;.    
31570 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
31580 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c   = pTerm;.    pL
31590 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  oop->nLTerm = 1;
315a0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  .    pLoop->u.bt
315b0 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
315c0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
315d0 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b   of a rowid look
315e0 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20  up is 10 */.    
315f0 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33  pLoop->rRun = 33
31600 3b 20 20 2f 2a 20 33 33 3d 3d 77 68 65 72 65 43  ;  /* 33==whereC
31610 6f 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c  ost(10) */.  }el
31620 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  se{.    for(pIdx
31630 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
31640 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
31650 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
31660 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
31670 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69  =OE_None ) conti
31680 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nue;.      for(j
31690 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
316a0 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
316b0 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
316c0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70  erm(pWC, iCur, p
316d0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
316e0 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78  , 0, WO_EQ, pIdx
316f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
31700 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
31710 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
31720 6f 70 52 65 73 69 7a 65 28 70 57 49 6e 66 6f 2d  opResize(pWInfo-
31730 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  >pParse->db, pLo
31740 6f 70 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20  op, j);.        
31750 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
31760 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
31770 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70  }.      if( j!=p
31780 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63  Idx->nColumn ) c
31790 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
317a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
317b0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
317c0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45  WHERE_ONEROW|WHE
317d0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
317e0 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 63 6f    if( (pItem->co
317f0 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
31800 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d  InIndex(pIdx))==
31810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  0 ){.        pLo
31820 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
31830 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
31840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f       }.      pLo
31850 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a  op->nLTerm = j;.
31860 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
31870 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20  tree.nEq = j;.  
31880 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
31890 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
318a0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
318b0 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69  G: Cost of a uni
318c0 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  que index lookup
318d0 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20   is 15 */.      
318e0 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39  pLoop->rRun = 39
318f0 3b 20 20 2f 2a 20 33 39 3d 3d 77 68 65 72 65 43  ;  /* 39==whereC
31900 6f 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20  ost(15) */.     
31910 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
31920 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
31930 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c  sFlags ){.    pL
31940 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 57 68 65  oop->nOut = (Whe
31950 72 65 43 6f 73 74 29 31 3b 0a 20 20 20 20 70 57  reCost)1;.    pW
31960 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
31970 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70  p = pLoop;.    p
31980 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  Loop->maskSelf =
31990 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
319a0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
319b0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  );.    pWInfo->a
319c0 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43  [0].iTabCur = iC
319d0 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ur;.    pWInfo->
319e0 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20  nRowOut = 1;.   
319f0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
31a00 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
31a10 62 4f 42 53 61 74 20 3d 20 20 31 3b 0a 20 20 20  bOBSat =  1;.   
31a20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 44 69   if( pWInfo->pDi
31a30 73 74 69 6e 63 74 20 29 20 70 57 49 6e 66 6f 2d  stinct ) pWInfo-
31a40 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
31a50 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
31a60 55 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  UE;.#ifdef SQLIT
31a70 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f  E_DEBUG.    pLoo
31a80 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65  p->cId = '0';.#e
31a90 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
31aa0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
31ab0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
31ac0 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
31ad0 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
31ae0 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
31af0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
31b00 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
31b10 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
31b20 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
31b30 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
31b40 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
31b50 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
31b60 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
31b70 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
31b80 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
31b90 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
31ba0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
31bb0 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
31bc0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
31bd0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
31be0 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
31bf0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
31c00 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
31c10 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
31c20 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
31c30 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
31c40 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
31c50 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
31c60 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
31c70 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
31c80 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
31c90 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
31ca0 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
31cb0 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
31cc0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
31cd0 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
31ce0 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
31cf0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
31d00 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
31d10 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
31d20 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
31d30 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
31d40 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
31d50 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
31d60 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
31d70 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
31d80 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
31d90 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
31da0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
31db0 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
31dc0 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
31dd0 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
31de0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
31df0 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
31e00 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
31e10 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
31e20 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
31e30 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
31e40 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
31e50 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
31e60 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
31e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e80 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
31e90 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
31ea0 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
31eb0 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
31ec0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
31ed0 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
31ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ef0 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
31f00 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
31f10 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
31f20 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
31f30 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
31f40 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
31f50 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
31f60 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
31f70 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
31f80 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
31f90 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
31fa0 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
31fb0 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
31fc0 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
31fd0 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
31fe0 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
31ff0 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
32000 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
32010 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
32020 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
32030 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
32040 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
32050 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
32060 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
32070 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
32080 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
32090 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
320a0 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
320b0 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
320c0 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
320d0 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
320e0 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
320f0 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
32100 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
32110 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
32120 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
32130 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
32140 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
32150 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
32160 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
32170 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
32180 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
32190 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
321a0 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
321b0 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
321c0 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
321d0 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
321e0 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
321f0 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
32200 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
32210 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
32220 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
32230 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
32240 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
32250 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
32260 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
32270 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
32280 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
32290 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
322a0 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
322b0 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
322c0 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
322d0 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
322e0 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
322f0 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
32300 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
32310 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
32320 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
32330 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
32340 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
32350 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
32360 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
32370 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
32380 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
32390 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
323a0 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
323b0 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
323c0 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
323d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
323e0 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
323f0 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
32400 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
32410 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
32420 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
32430 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
32440 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
32450 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
32460 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
32470 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
32480 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
32490 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
324a0 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
324b0 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
324c0 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
324d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
324e0 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
324f0 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
32500 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
32510 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
32520 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
32530 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
32540 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
32550 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
32560 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
32570 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
32580 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
32590 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
325a0 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
325b0 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
325c0 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
325d0 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
325e0 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
325f0 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
32600 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
32610 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
32620 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
32630 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
32640 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
32650 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
32660 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
32670 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
32680 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
32690 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
326a0 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
326b0 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
326c0 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
326d0 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
326e0 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
326f0 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
32700 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
32710 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
32720 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  NG.**.** pOrderB
32730 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
32740 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
32750 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
32760 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
32770 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
32780 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
32790 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
327a0 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
327b0 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
327c0 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
327d0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
327e0 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72  ent, then pOrder
327f0 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 57  By is NULL..*/.W
32800 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
32810 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
32820 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
32830 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
32840 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
32850 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
32860 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  t,    /* A list 
32870 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  of all tables to
32880 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
32890 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
328a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
328b0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
328c0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
328d0 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45  By,   /* An ORDE
328e0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20  R BY clause, or 
328f0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
32900 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 20  st *pDistinct,  
32910 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 2d 6c 69  /* The select-li
32920 73 74 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  st for DISTINCT 
32930 71 75 65 72 69 65 73 20 2d 20 6f 72 20 4e 55 4c  queries - or NUL
32940 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  L */.  u16 wctrl
32950 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
32960 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
32970 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64  _* flags defined
32980 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
32990 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72  */.  int iIdxCur
329a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
329b0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
329c0 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e 64  ONLY is set, ind
329d0 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ex cursor number
329e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
329f0 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  teWInfo;        
32a00 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65      /* Num. byte
32a10 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
32a20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
32a30 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69   */.  int nTabLi
32a40 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
32a50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
32a60 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69  ements in pTabLi
32a70 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  st */.  WhereInf
32a80 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
32a90 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d     /* Will becom
32aa0 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
32ab0 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
32ac0 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
32ad0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
32ae0 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75  ;   /* The virtu
32af0 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  al database engi
32b00 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ne */.  Bitmask 
32b10 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
32b20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68     /* Cursors th
32b30 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70  at are not yet p
32b40 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57  ositioned */.  W
32b50 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
32b60 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65  sWLB;     /* The
32b70 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64   WhereLoop build
32b80 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  er */.  WhereMas
32b90 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
32ba0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
32bb0 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f  sion mask set */
32bc0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
32bd0 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a  Level;        /*
32be0 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
32bf0 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a  in pWInfo->a[] *
32c00 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
32c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32c20 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
32c30 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
32c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32c50 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
32c60 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
32c70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
32c80 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
32c90 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56  code */...  /* V
32ca0 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69  ariable initiali
32cb0 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 6d 65 6d 73  zation */.  mems
32cc0 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a  et(&sWLB, 0, siz
32cd0 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20 73 57  eof(sWLB));.  sW
32ce0 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  LB.pOrderBy = pO
32cf0 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 68  rderBy;..  /* Th
32d00 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  e number of tabl
32d10 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
32d20 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
32d30 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
32d40 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61  f.  ** bits in a
32d50 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20   Bitmask .  */. 
32d60 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c   testcase( pTabL
32d70 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29  ist->nSrc==BMS )
32d80 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  ;.  if( pTabList
32d90 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
32da0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
32db0 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
32dc0 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
32dd0 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
32de0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
32df0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
32e00 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65  tion normally ge
32e10 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64  nerates a nested
32e20 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61   loop for all ta
32e30 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54  bles in .  ** pT
32e40 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20  abList.  But if 
32e50 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  the WHERE_ONETAB
32e60 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
32e70 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f  set, then we sho
32e80 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65  uld.  ** only ge
32e90 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
32ea0 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
32eb0 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  in pTabList and 
32ec0 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a  assume that.  **
32ed0 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73   any cursors ass
32ee0 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62  ociated with sub
32ef0 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61  sequent tables a
32f00 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  re uninitialized
32f10 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73  ..  */.  nTabLis
32f20 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20  t = (wctrlFlags 
32f30 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
32f40 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61  _ONLY) ? 1 : pTa
32f50 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20  bList->nSrc;..  
32f60 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
32f70 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
32f80 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
32f90 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
32fa0 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
32fb0 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e  urn value. A sin
32fc0 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  gle allocation i
32fd0 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
32fe0 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20  the WhereInfo.  
32ff0 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63  ** struct, the c
33000 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65  ontents of Where
33010 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68  Info.a[], the Wh
33020 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
33030 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ure.  ** and the
33040 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
33050 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57  ructure. Since W
33060 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61  hereClause conta
33070 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20  ins an 8-byte.  
33080 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42  ** field (type B
33090 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20  itmask) it must 
330a0 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e  be aligned on an
330b0 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
330c0 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72   on.  ** some ar
330d0 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e  chitectures. Hen
330e0 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20  ce the ROUND8() 
330f0 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 64 62  below..  */.  db
33100 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
33110 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f   nByteWInfo = RO
33120 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72  UND8(sizeof(Wher
33130 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74  eInfo)+(nTabList
33140 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65  -1)*sizeof(Where
33150 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66  Level));.  pWInf
33160 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
33170 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
33180 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28  eWInfo + sizeof(
33190 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69  WhereLoop));.  i
331a0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
331b0 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
331c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
331d0 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  nfo);.    pWInfo
331e0 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77   = 0;.    goto w
331f0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
33200 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c    }.  pWInfo->nL
33210 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b  evel = nTabList;
33220 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  .  pWInfo->pPars
33230 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
33240 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d  Info->pTabList =
33250 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   pTabList;.  pWI
33260 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  nfo->pOrderBy = 
33270 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e  pOrderBy;.  pWIn
33280 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74 20 3d 20  fo->pDistinct = 
33290 70 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 57 49  pDistinct;.  pWI
332a0 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71  nfo->iBreak = sq
332b0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
332c0 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d  el(v);.  pWInfo-
332d0 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63  >wctrlFlags = wc
332e0 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e  trlFlags;.  pWIn
332f0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
33300 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
33310 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73  ueryLoop;.  pMas
33320 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  kSet = &pWInfo->
33330 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42  sMaskSet;.  sWLB
33340 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  .pWInfo = pWInfo
33350 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26  ;.  sWLB.pWC = &
33360 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73  pWInfo->sWC;.  s
33370 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72  WLB.pNew = (Wher
33380 65 4c 6f 6f 70 2a 29 26 70 57 49 6e 66 6f 2d 3e  eLoop*)&pWInfo->
33390 61 5b 6e 54 61 62 4c 69 73 74 5d 3b 0a 20 20 77  a[nTabList];.  w
333a0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c  hereLoopInit(sWL
333b0 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20  B.pNew);.#ifdef 
333c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
333d0 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20  WLB.pNew->cId = 
333e0 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  '*';.#endif..  /
333f0 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
33400 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
33410 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
33420 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
33430 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
33440 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
33450 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
33460 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
33470 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
33480 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
33490 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
334a0 4f 70 74 29 20 29 20 70 44 69 73 74 69 6e 63 74  Opt) ) pDistinct
334b0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69   = 0;..  /* Spli
334c0 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
334d0 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
334e0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
334f0 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
33500 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
33510 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
33520 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
33530 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
33540 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77  t(pMaskSet);.  w
33550 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
33560 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49  pWInfo->sWC, pWI
33570 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  nfo);.  sqlite3E
33580 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73  xprCodeConstants
33590 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 29  (pParse, pWhere)
335a0 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26  ;.  whereSplit(&
335b0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68  pWInfo->sWC, pWh
335c0 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20  ere, TK_AND);   
335d0 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d  /* IMP: R-15842-
335e0 35 33 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20  53296 */.    .  
335f0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
33600 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
33610 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  that is constant
33620 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a  .  Evaluate the.
33630 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
33640 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20  and either jump 
33650 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
33660 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  code or fall thr
33670 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  u..  */.  if( pW
33680 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73  here && (nTabLis
33690 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  t==0 || sqlite3E
336a0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
336b0 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b  Join(pWhere)) ){
336c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
336d0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
336e0 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e  pWhere, pWInfo->
336f0 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a  iBreak, SQLITE_J
33700 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
33710 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
33720 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
33730 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75  se: No FROM clau
33740 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54  se.  */.  if( nT
33750 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  abList==0 ){.   
33760 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
33770 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d  pWInfo->bOBSat =
33780 20 31 3b 0a 20 20 20 20 69 66 28 20 70 44 69 73   1;.    if( pDis
33790 74 69 6e 63 74 20 29 20 70 57 49 6e 66 6f 2d 3e  tinct ) pWInfo->
337a0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
337b0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
337c0 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73  E;.  }..  /* Ass
337d0 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
337e0 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
337f0 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
33800 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
33810 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69  *.  ** When assi
33820 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61  gning bitmask va
33830 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61  lues to FROM cla
33840 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  use cursors, it 
33850 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65  must be.  ** the
33860 20 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20   case that if X 
33870 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
33880 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d  or the N-th FROM
33890 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65   clause term the
338a0 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61  n.  ** the bitma
338b0 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20  sk for all FROM 
338c0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20  clause terms to 
338d0 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
338e0 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69  N-th term.  ** i
338f0 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78  s (X-1).   An ex
33900 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
33910 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
33920 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75   LEFT JOIN can u
33930 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72  se.  ** its Expr
33940 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
33950 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74   value to find t
33960 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68  he bitmask of th
33970 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20  e right table.  
33980 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
33990 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65   Subtracting one
339a0 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20   from the right 
339b0 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69  table bitmask gi
339c0 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61  ves a.  ** bitma
339d0 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  sk for all table
339e0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
339f0 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77   the join.  Know
33a00 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a  ing the bitmask.
33a10 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62    ** for all tab
33a20 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
33a30 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
33a40 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  s important.  Ti
33a50 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a  cket #3015..  **
33a60 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
33a70 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65  bitmasks are cre
33a80 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61  ated for all pTa
33a90 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c  bList->nSrc tabl
33aa0 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c  es in.  ** pTabL
33ab0 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ist, not just th
33ac0 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74  e first nTabList
33ad0 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69   tables.  nTabLi
33ae0 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20  st is normally. 
33af0 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61   ** equal to pTa
33b00 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20  bList->nSrc but 
33b10 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e  might be shorten
33b20 65 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20  ed to 1 if the. 
33b30 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   ** WHERE_ONETAB
33b40 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
33b50 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  set..  */.  for(
33b60 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
33b70 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
33b80 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
33b90 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
33ba0 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
33bb0 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  );.  }.#ifndef N
33bc0 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69  DEBUG.  {.    Bi
33bd0 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20  tmask toTheLeft 
33be0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
33bf0 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
33c00 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
33c10 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67     Bitmask m = g
33c20 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
33c30 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
33c40 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
33c50 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d   assert( (m-1)==
33c60 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20  toTheLeft );.   
33c70 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20     toTheLeft |= 
33c80 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  m;.    }.  }.#en
33c90 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
33ca0 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
33cb0 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f  expressions.  No
33cc0 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c  te that exprAnal
33cd0 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a  yze() might.  **
33ce0 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c   add new virtual
33cf0 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
33d00 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
33d10 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20   clause.  We do 
33d20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f  not.  ** want to
33d30 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76   analyze these v
33d40 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f  irtual terms, so
33d50 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67   start analyzing
33d60 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a   at the end.  **
33d70 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72   and work forwar
33d80 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64  d so that the ad
33d90 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ded virtual term
33da0 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63  s are never proc
33db0 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78  essed..  */.  ex
33dc0 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61  prAnalyzeAll(pTa
33dd0 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
33de0 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  sWC);.  if( db->
33df0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
33e00 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
33e10 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  ginError;.  }.. 
33e20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
33e30 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
33e40 29 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  ) clause contain
33e50 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  s references to 
33e60 67 65 6e 65 72 61 6c 0a 20 20 2a 2a 20 65 78 70  general.  ** exp
33e70 72 65 73 73 69 6f 6e 73 2c 20 74 68 65 6e 20 77  ressions, then w
33e80 65 20 77 6f 6e 27 74 20 62 65 20 61 62 6c 65 20  e won't be able 
33e90 74 6f 20 73 61 74 69 73 66 79 20 69 74 20 75 73  to satisfy it us
33ea0 69 6e 67 20 69 6e 64 69 63 65 73 2c 20 73 6f 0a  ing indices, so.
33eb0 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e    ** go ahead an
33ec0 64 20 64 69 73 61 62 6c 65 20 69 74 20 6e 6f 77  d disable it now
33ed0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
33ee0 64 65 72 42 79 20 26 26 20 70 44 69 73 74 69 6e  derBy && pDistin
33ef0 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69  ct ){.    for(ii
33f00 3d 30 3b 20 69 69 3c 70 4f 72 64 65 72 42 79 2d  =0; ii<pOrderBy-
33f10 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
33f20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
33f30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
33f40 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
33f50 42 79 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  By->a[ii].pExpr)
33f60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
33f70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
33f80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
33f90 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
33fa0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
33fb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
33fc0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70    }else if( pExp
33fd0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
33fe0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
33ff0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
34000 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
34010 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
34020 6c 69 66 69 65 72 2c 20 69 66 20 74 68 65 72 65  lifier, if there
34030 20 69 73 20 6f 6e 65 2c 20 69 73 20 72 65 64 75   is one, is redu
34040 6e 64 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20  ndant. .  ** If 
34050 69 74 20 69 73 2c 20 74 68 65 6e 20 73 65 74 20  it is, then set 
34060 70 44 69 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c  pDistinct to NUL
34070 4c 20 61 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e  L and WhereInfo.
34080 65 44 69 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a  eDistinct to.  *
34090 2a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  * WHERE_DISTINCT
340a0 5f 55 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c 20  _UNIQUE to tell 
340b0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 67  the caller to ig
340c0 6e 6f 72 65 20 74 68 65 20 44 49 53 54 49 4e 43  nore the DISTINC
340d0 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  T..  */.  if( pD
340e0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 69  istinct ){.    i
340f0 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  f( isDistinctRed
34100 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 70 54  undant(pParse,pT
34110 61 62 4c 69 73 74 2c 26 70 57 49 6e 66 6f 2d 3e  abList,&pWInfo->
34120 73 57 43 2c 70 44 69 73 74 69 6e 63 74 29 20 29  sWC,pDistinct) )
34130 7b 0a 20 20 20 20 20 20 70 44 69 73 74 69 6e 63  {.      pDistinc
34140 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 57 49  t = 0;.      pWI
34150 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
34160 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
34170 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73  UNIQUE;.    }els
34180 65 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d  e if( pOrderBy==
34190 30 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  0 ){.      pWInf
341a0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d  o->wctrlFlags |=
341b0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
341c0 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  Y;.      pWInfo-
341d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 44 69 73  >pOrderBy = pDis
341e0 74 69 6e 63 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  tinct;.    }.  }
341f0 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74  ..  /* Construct
34200 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
34210 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45 52  bjects */.  WHER
34220 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22  ETRACE(0xffff,("
34230 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
34240 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
34250 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20  if( nTabList!=1 
34260 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  || whereShortCut
34270 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20  (&sWLB)==0 ){.  
34280 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
34290 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20  AddAll(&sWLB);. 
342a0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
342b0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
342c0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70  ;.  .    /* Disp
342d0 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57  lay all of the W
342e0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
342f0 20 69 66 20 77 68 65 72 65 74 72 61 63 65 20 69   if wheretrace i
34300 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66  s enabled */.#if
34310 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
34320 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
34330 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
34340 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
34350 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e  oop *p;.      in
34360 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  t i = 0;.      s
34370 74 61 74 69 63 20 63 68 61 72 20 7a 4c 61 62 65  tatic char zLabe
34380 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  l[] = "012345678
34390 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  9abcdefghijklmno
343a0 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20  pqrstuvwyxz".   
343b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343d0 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
343e0 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22  LMNOPQRSTUVWYXZ"
343f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57  ;.      for(p=pW
34400 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 3b  Info->pLoops; p;
34410 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29   p=p->pNextLoop)
34420 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64  {.        p->cId
34430 20 3d 20 7a 4c 61 62 65 6c 5b 28 69 2b 2b 29 25   = zLabel[(i++)%
34440 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b  sizeof(zLabel)];
34450 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
34460 6f 70 50 72 69 6e 74 28 70 2c 20 70 54 61 62 4c  opPrint(p, pTabL
34470 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
34480 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
34490 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65    wherePathSolve
344a0 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20  r(pWInfo, 0);.  
344b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
344c0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
344d0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
344e0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70     if( pWInfo->p
344f0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
34500 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65    wherePathSolve
34510 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  r(pWInfo, pWInfo
34520 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20  ->nRowOut);.    
34530 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
34540 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
34550 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
34560 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
34570 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
34580 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67  ==0 && (db->flag
34590 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72  s & SQLITE_Rever
345a0 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20  seOrder)!=0 ){. 
345b0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
345c0 61 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29 28  ask = (Bitmask)(
345d0 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  -1);.  }.  if( p
345e0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
345f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
34600 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
34610 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
34620 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
34630 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
34640 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
34650 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69  ce ){.    int ii
34660 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
34670 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53  ugPrintf("---- S
34680 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22  olution nRow=%d"
34690 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
346a0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  t);.    if( pWIn
346b0 66 6f 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20 20  fo->bOBSat ){.  
346c0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
346d0 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59  Printf(" ORDERBY
346e0 3d 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f  =0x%llx", pWInfo
346f0 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20  ->revMask);.    
34700 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57  }.    switch( pW
34710 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
34720 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  ){.      case WH
34730 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
34740 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
34750 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
34760 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
34770 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20  ique");.        
34780 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
34790 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
347a0 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
347b0 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
347c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
347d0 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72    DISTINCT=order
347e0 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed");.        br
347f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
34800 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
34810 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
34820 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
34830 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
34840 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64    DISTINCT=unord
34850 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  ered");.        
34860 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
34870 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
34880 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
34890 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  );.    for(ii=0;
348a0 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
348b0 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
348c0 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f  LoopPrint(pWInfo
348d0 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20  ->a[ii].pWLoop, 
348e0 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d  pTabList);.    }
348f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 57 48  .  }.#endif.  WH
34900 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
34910 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
34920 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
34930 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  );.  pWInfo->pPa
34940 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
34950 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  += pWInfo->nRowO
34960 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ut;..  /* If the
34970 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50   caller is an UP
34980 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
34990 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
349a0 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a   requesting.  **
349b0 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61   to use a one-pa
349c0 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65  ss algorithm, de
349d0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20  termine if this 
349e0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  is appropriate..
349f0 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73    ** The one-pas
34a00 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79  s algorithm only
34a10 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48   works if the WH
34a20 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
34a30 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20  raints.  ** the 
34a40 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64  statement to upd
34a50 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ate a single row
34a60 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
34a70 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
34a80 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
34a90 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
34aa0 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
34ab0 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
34ac0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
34ad0 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a  SS_DESIRED)!=0 .
34ae0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 61     && (pWInfo->a
34af0 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  [0].pWLoop->wsFl
34b00 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
34b10 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57  OW)!=0 ){.    pW
34b20 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
34b30 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  = 1;.    pWInfo-
34b40 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73  >a[0].pWLoop->ws
34b50 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
34b60 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20  IDX_ONLY;.  }.. 
34b70 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62   /* Open all tab
34b80 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c  les in the pTabL
34b90 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69  ist and any indi
34ba0 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72  ces selected for
34bb0 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20  .  ** searching 
34bc0 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
34bd0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  */.  sqlite3Code
34be0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
34bf0 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73  rse, -1); /* Ins
34c00 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ert the cookie v
34c10 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a  erifier Goto */.
34c20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
34c30 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 57 49 6e  itmask)0;.  pWIn
34c40 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 28 57  fo->nRowOut = (W
34c50 68 65 72 65 43 6f 73 74 29 31 3b 0a 20 20 66 6f  hereCost)1;.  fo
34c60 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  r(ii=0, pLevel=p
34c70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61  WInfo->a; ii<nTa
34c80 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65  bList; ii++, pLe
34c90 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
34ca0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
34cb0 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
34cc0 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
34cd0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
34ce0 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
34cf0 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
34d00 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  x */.    struct 
34d10 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
34d20 61 62 49 74 65 6d 3b 0a 20 20 20 20 57 68 65 72  abItem;.    Wher
34d30 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 0a 20  eLoop *pLoop;.. 
34d40 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
34d50 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
34d60 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
34d70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
34d80 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20  pTab;.    iDb = 
34d90 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
34da0 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
34db0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f  Schema);.    pLo
34dc0 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
34dd0 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54  oop;.    if( (pT
34de0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
34df0 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
34e00 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
34e10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20   ){.      /* Do 
34e20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  nothing */.    }
34e30 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
34e40 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
34e50 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
34e60 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
34e70 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
34e80 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
34e90 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61  const char *pVTa
34ea0 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  b = (const char 
34eb0 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
34ec0 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
34ed0 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
34ee0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
34ef0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
34f00 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
34f10 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20  VOpen, iCur, 0, 
34f20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41  0, pVTab, P4_VTA
34f30 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  B);.    }else if
34f40 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
34f50 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  ) ){.      /* no
34f60 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  op */.    }else.
34f70 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
34f80 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
34f90 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
34fa0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
34fb0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
34fc0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
34fd0 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  OSE)==0 ){.     
34fe0 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f   int op = pWInfo
34ff0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50  ->okOnePass ? OP
35000 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f  _OpenWrite : OP_
35010 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
35020 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
35030 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
35040 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c  m->iCursor, iDb,
35050 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20   pTab, op);.    
35060 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
35070 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
35080 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
35090 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
350a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
350b0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
350c0 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42   && pTab->nCol<B
350d0 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69  MS ){.        Bi
350e0 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74  tmask b = pTabIt
350f0 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  em->colUsed;.   
35100 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
35110 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b          for(; b;
35120 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a   b=b>>1, n++){}.
35130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
35140 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73  dbeChangeP4(v, s
35150 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
35160 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20  tAddr(v)-1, .   
35170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35180 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
35190 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50  INT_TO_PTR(n), P
351a0 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
351b0 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
351c0 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
351d0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
351e0 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
351f0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
35200 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
35210 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
35220 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
35230 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
35240 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28  IC_INDEX.    if(
35250 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
35260 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
35270 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
35280 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
35290 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
352a0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70   &pWInfo->sWC, p
352b0 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64  TabItem, notRead
352c0 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  y, pLevel);.    
352d0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
352e0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
352f0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
35300 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  XED ){.      Ind
35310 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d  ex *pIx = pLoop-
35320 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
35330 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
35340 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
35350 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
35360 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 2f  e, pIx);.      /
35370 2a 20 46 49 58 4d 45 3a 20 20 41 73 20 61 6e 20  * FIXME:  As an 
35380 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 65  optimization use
35390 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
353a0 6f 72 20 69 66 20 57 48 45 52 45 5f 49 44 58 5f  or if WHERE_IDX_
353b0 4f 4e 4c 59 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ONLY */.      in
353c0 74 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c  t iIndexCur = pL
353d0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
353e0 69 49 64 78 43 75 72 20 3f 20 69 49 64 78 43 75  iIdxCur ? iIdxCu
353f0 72 20 3a 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r : pParse->nTab
35400 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
35410 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
35420 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
35430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
35440 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
35450 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35460 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
35470 6e 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75 72  nRead, iIndexCur
35480 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  , pIx->tnum, iDb
35490 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
354a0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
354b0 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
354c0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
354d0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
354e0 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61  , "%s", pIx->zNa
354f0 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  me));.    }.    
35500 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
35510 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
35520 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  iDb);.    notRea
35530 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26  dy &= ~getMask(&
35540 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
35550 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
35560 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  sor);.  }.  pWIn
35570 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
35580 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
35590 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
355a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
355b0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
355c0 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
355d0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
355e0 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
355f0 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
35600 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
35610 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
35620 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
35630 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
35640 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
35650 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
35660 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
35670 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
35680 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
35690 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65  ; ii++){.    pLe
356a0 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
356b0 5b 69 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69  [ii];.    explai
356c0 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c  nOneScan(pParse,
356d0 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
356e0 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  l, ii, pLevel->i
356f0 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73  From, wctrlFlags
35700 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
35710 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  = codeOneLoopSta
35720 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e  rt(pWInfo, ii, n
35730 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
35740 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
35750 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
35760 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  nt;.  }..  /* Do
35770 6e 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ne. */.  return 
35780 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
35790 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
357a0 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
357b0 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
357c0 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
357d0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
357e0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
357f0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
35800 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
35810 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
35820 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
35830 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
35840 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
35850 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
35860 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
35870 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
35880 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
35890 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
358a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
358b0 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
358c0 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
358d0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
358e0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
358f0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
35900 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
35910 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
35920 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f  Level;.  WhereLo
35930 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63  op *pLoop;.  Src
35940 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
35950 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
35960 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
35970 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
35980 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
35990 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
359a0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ode..  */.  sqli
359b0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
359c0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
359d0 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  (i=pWInfo->nLeve
359e0 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
359f0 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
35a00 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
35a10 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
35a20 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c  >pWLoop;.    sql
35a30 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
35a40 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
35a50 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69  addrCont);.    i
35a60 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f  f( pLevel->op!=O
35a70 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
35a80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35a90 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  2(v, pLevel->op,
35aa0 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
35ab0 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20  vel->p2);.      
35ac0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
35ad0 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
35ae0 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  5);.    }.    if
35af0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
35b00 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
35b10 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   && pLevel->u.in
35b20 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  .nIn>0 ){.      
35b30 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
35b40 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  In;.      int j;
35b50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
35b60 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
35b70 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  , pLevel->addrNx
35b80 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
35b90 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
35ba0 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75  , pIn=&pLevel->u
35bb0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d  .in.aInLoop[j-1]
35bc0 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d  ; j>0; j--, pIn-
35bd0 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -){.        sqli
35be0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
35bf0 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
35c00 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  p+1);.        sq
35c10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
35c20 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
35c30 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  Op, pIn->iCur, p
35c40 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
35c50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
35c60 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
35c70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
35c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35c90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
35ca0 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
35cb0 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
35cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
35cd0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
35ce0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
35cf0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
35d00 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
35d10 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
35d20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
35d30 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
35d40 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d  P_IfPos, pLevel-
35d50 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
35d60 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
35d70 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
35d80 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
35d90 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
35da0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
35db0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
35dc0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
35dd0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
35de0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
35df0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
35e00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
35e10 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
35e20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
35e30 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
35e40 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
35e50 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
35e60 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
35e70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35e80 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
35e90 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
35ea0 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
35eb0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
35ec0 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20  ->op==OP_Return 
35ed0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
35ee0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
35ef0 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c  OP_Gosub, pLevel
35f00 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  ->p1, pLevel->ad
35f10 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
35f20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
35f30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
35f40 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
35f50 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
35f60 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
35f70 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
35f80 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
35f90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
35fa0 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e  The "break" poin
35fb0 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20  t is here, just 
35fc0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
35fd0 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
35fe0 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a    ** Set it..  *
35ff0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
36000 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
36010 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
36020 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
36030 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
36040 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20  hat were opened 
36050 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
36060 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  egin..  */.  ass
36070 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ert( pWInfo->nLe
36080 76 65 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f  vel==1 || pWInfo
36090 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69  ->nLevel==pTabLi
360a0 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f  st->nSrc );.  fo
360b0 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
360c0 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66  Info->a; i<pWInf
360d0 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20  o->nLevel; i++, 
360e0 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49  pLevel++){.    I
360f0 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a  ndex *pIdx = 0;.
36100 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
36110 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
36120 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
36130 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
36140 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
36150 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
36160 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
36170 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c  Tab!=0 );.    pL
36180 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
36190 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70  Loop;.    if( (p
361a0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
361b0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
361c0 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70  .     && pTab->p
361d0 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26  Select==0.     &
361e0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
361f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
36200 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
36210 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
36220 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  nt ws = pLoop->w
36230 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66  sFlags;.      if
36240 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
36250 50 61 73 73 20 26 26 20 28 77 73 20 26 20 57 48  Pass && (ws & WH
36260 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
36270 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
36280 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
36290 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49   OP_Close, pTabI
362a0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
362b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
362c0 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44   (ws & WHERE_IND
362d0 45 58 45 44 29 21 3d 30 20 26 26 20 28 77 73 20  EXED)!=0 && (ws 
362e0 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  & (WHERE_IPK|WHE
362f0 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 29 3d  RE_TEMP_INDEX))=
36300 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
36310 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
36320 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65  v, OP_Close, pLe
36330 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
36340 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
36350 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61    /* If this sca
36360 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c  n uses an index,
36370 20 6d 61 6b 65 20 63 6f 64 65 20 73 75 62 73 74   make code subst
36380 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64  itutions to read
36390 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f   data.    ** fro
363a0 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  m the index in p
363b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
363c0 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d 65   table. Sometime
363d0 73 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20  s, this means.  
363e0 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e    ** the table n
363f0 65 65 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  eed never be rea
36400 64 20 66 72 6f 6d 2e 20 54 68 69 73 20 69 73 20  d from. This is 
36410 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  a performance bo
36420 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20 74  ost,.    ** as t
36430 68 65 20 76 64 62 65 20 6c 65 76 65 6c 20 77 61  he vdbe level wa
36440 69 74 73 20 75 6e 74 69 6c 20 74 68 65 20 74 61  its until the ta
36450 62 6c 65 20 69 73 20 72 65 61 64 20 62 65 66 6f  ble is read befo
36460 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  re actually.    
36470 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68 65 20 74  ** seeking the t
36480 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74  able cursor to t
36490 68 65 20 72 65 63 6f 72 64 20 63 6f 72 72 65 73  he record corres
364a0 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63  ponding to the c
364b0 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 6f  urrent.    ** po
364c0 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 69 6e  sition in the in
364d0 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  dex..    ** .   
364e0 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65   ** Calls to the
364f0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
36500 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74  in between sqlit
36510 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64  e3WhereBegin and
36520 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57  .    ** sqlite3W
36530 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76  hereEnd will hav
36540 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74  e created code t
36550 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
36560 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
36570 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20  directly.  This 
36580 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74  loop scans all t
36590 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67  hat code looking
365a0 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20   for opcodes.   
365b0 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e   ** that referen
365c0 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  ce the table and
365d0 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69   converts them i
365e0 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74  nto opcodes that
365f0 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
36600 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  e the index..   
36610 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
36620 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
36630 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52  ERE_INDEXED|WHER
36640 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20  E_IDX_ONLY) ){. 
36650 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f       pIdx = pLoo
36660 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
36670 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  x;.    }else if(
36680 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
36690 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
366a0 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d   ){.      pIdx =
366b0 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69   pLevel->u.pCovi
366c0 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  dx;.    }.    if
366d0 28 20 70 49 64 78 20 26 26 20 21 64 62 2d 3e 6d  ( pIdx && !db->m
366e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
366f0 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c       int k, j, l
36700 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f  ast;.      VdbeO
36710 70 20 2a 70 4f 70 3b 0a 0a 20 20 20 20 20 20 70  p *pOp;..      p
36720 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
36730 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d  GetOp(v, pWInfo-
36740 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61  >iTop);.      la
36750 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
36760 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
36770 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e        for(k=pWIn
36780 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74  fo->iTop; k<last
36790 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; k++, pOp++){. 
367a0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
367b0 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62  p1!=pLevel->iTab
367c0 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
367d0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
367e0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
367f0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
36800 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
36810 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  >nColumn; j++){.
36820 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
36830 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61  pOp->p2==pIdx->a
36840 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20  iColumn[j] ){.  
36850 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
36860 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  >p2 = j;.       
36870 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
36880 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
36890 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
368a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
368b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
368c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
368d0 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
368e0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
368f0 4e 4c 59 29 3d 3d 30 20 7c 7c 20 6a 3c 70 49 64  NLY)==0 || j<pId
36900 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  x->nColumn );.  
36910 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
36920 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
36930 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
36940 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
36950 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
36960 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
36970 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69  ode = OP_IdxRowi
36980 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
36990 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
369a0 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e    /* Final clean
369b0 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65  up.  */.  pParse
369c0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
369d0 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
369e0 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49  ryLoop;.  whereI
369f0 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
36a00 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fo);.  return;.}
36a10 0a                                               .