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

Artifact df0d274ff134fab313f576f232e586756339e7a1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 4b 2c 58  e WHERETRACE(K,X
0430: 29 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65  )  if(sqlite3Whe
0440: 72 65 54 72 61 63 65 26 28 4b 29 29 20 73 71 6c  reTrace&(K)) sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0460: 58 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  X.# define WHERE
0470: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 31 0a  TRACE_ENABLED 1.
0480: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57  #else.# define W
0490: 48 45 52 45 54 52 41 43 45 28 4b 2c 58 29 0a 23  HERETRACE(K,X).#
04a0: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
04b0: 64 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 74  d reference.*/.t
04c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
04d0: 65 72 65 43 6c 61 75 73 65 20 57 68 65 72 65 43  ereClause WhereC
04e0: 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20 73  lause;.typedef s
04f0: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
0500: 65 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 3b  et WhereMaskSet;
0510: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0520: 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65 72  WhereOrInfo Wher
0530: 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66  eOrInfo;.typedef
0540: 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64   struct WhereAnd
0550: 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e 66  Info WhereAndInf
0560: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0570: 74 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68 65  t WhereLevel Whe
0580: 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65 66  reLevel;.typedef
0590: 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f   struct WhereLoo
05a0: 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74 79 70  p WhereLoop;.typ
05b0: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
05c0: 65 50 61 74 68 20 57 68 65 72 65 50 61 74 68 3b  ePath WherePath;
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65 54  WhereTerm WhereT
05f0: 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  erm;.typedef str
0600: 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  uct WhereLoopBui
0610: 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70 42 75  lder WhereLoopBu
0620: 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66 20 73  ilder;.typedef s
0630: 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e 20  truct WhereScan 
0640: 57 68 65 72 65 53 63 61 6e 3b 0a 0a 2f 2a 0a 2a  WhereScan;../*.*
0650: 2a 20 43 6f 73 74 20 58 20 69 73 20 74 72 61 63  * Cost X is trac
0660: 6b 65 64 20 61 73 20 31 30 2a 6c 6f 67 32 28 58  ked as 10*log2(X
0670: 29 20 73 74 6f 72 65 64 20 69 6e 20 61 20 31 36  ) stored in a 16
0680: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20 54  -bit integer.  T
0690: 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 63 6f  he.** maximum co
06a0: 73 74 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20  st for ordinary 
06b0: 74 61 62 6c 65 73 20 69 73 20 36 34 2a 28 32 2a  tables is 64*(2*
06c0: 2a 36 33 29 20 77 68 69 63 68 20 62 65 63 6f 6d  *63) which becom
06d0: 65 73 20 36 39 30 30 2e 0a 2a 2a 20 28 56 69 72  es 6900..** (Vir
06e0: 74 75 61 6c 20 74 61 62 6c 65 73 20 63 61 6e 20  tual tables can 
06f0: 72 65 74 75 72 6e 20 61 20 6c 61 72 67 65 72 20  return a larger 
0700: 63 6f 73 74 2c 20 62 75 74 20 6c 65 74 27 73 20  cost, but let's 
0710: 61 73 73 75 6d 65 20 74 68 65 79 20 64 6f 20 6e  assume they do n
0720: 6f 74 2e 29 0a 2a 2a 20 53 6f 20 61 6c 6c 20 63  ot.).** So all c
0730: 6f 73 74 73 20 63 61 6e 20 62 65 20 73 74 6f 72  osts can be stor
0740: 65 64 20 69 6e 20 61 20 31 36 2d 62 69 74 20 75  ed in a 16-bit u
0750: 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
0760: 77 69 74 68 6f 75 74 20 72 69 73 6b 0a 2a 2a 20  without risk.** 
0770: 6f 66 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2a 0a  of overflow..**.
0780: 2a 2a 20 43 6f 73 74 73 20 61 72 65 20 65 73 74  ** Costs are est
0790: 69 6d 61 74 65 73 2c 20 73 6f 20 64 6f 6e 27 74  imates, so don't
07a0: 20 67 6f 20 74 6f 20 74 68 65 20 63 6f 6d 70 75   go to the compu
07b0: 74 61 74 69 6f 6e 61 6c 20 74 72 6f 75 62 6c 65  tational trouble
07c0: 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 31   to compute.** 1
07d0: 30 2a 6c 6f 67 32 28 58 29 20 65 78 61 63 74 6c  0*log2(X) exactl
07e0: 79 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 20 63  y.  Instead, a c
07f0: 6c 6f 73 65 20 65 73 74 69 6d 61 74 65 20 69 73  lose estimate is
0800: 20 75 73 65 64 2e 20 20 41 6e 79 20 76 61 6c 75   used.  Any valu
0810: 65 20 6f 66 0a 2a 2a 20 58 3c 3d 31 20 69 73 20  e of.** X<=1 is 
0820: 73 74 6f 72 65 64 20 61 73 20 30 2e 20 20 58 3d  stored as 0.  X=
0830: 32 20 69 73 20 31 30 2e 20 20 58 3d 33 20 69 73  2 is 10.  X=3 is
0840: 20 31 36 2e 20 20 58 3d 31 30 30 30 20 69 73 20   16.  X=1000 is 
0850: 39 39 2e 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 54  99. etc..**.** T
0860: 68 65 20 74 6f 6f 6c 2f 77 68 65 72 65 63 6f 73  he tool/wherecos
0870: 74 74 65 73 74 2e 63 20 73 6f 75 72 63 65 20 66  ttest.c source f
0880: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ile implements a
0890: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 70 72   command-line pr
08a0: 6f 67 72 61 6d 0a 2a 2a 20 74 68 61 74 20 77 69  ogram.** that wi
08b0: 6c 6c 20 63 6f 6e 76 65 72 74 20 62 65 74 77 65  ll convert betwe
08c0: 65 6e 20 57 68 65 72 65 43 6f 73 74 20 74 6f 20  en WhereCost to 
08d0: 69 6e 74 65 67 65 72 73 20 61 6e 64 20 64 6f 20  integers and do 
08e0: 61 64 64 69 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  addition and.** 
08f0: 6d 75 6c 74 69 70 6c 69 63 61 74 69 6f 6e 20 6f  multiplication o
0900: 6e 20 57 68 65 72 65 43 6f 73 74 20 76 61 6c 75  n WhereCost valu
0910: 65 73 2e 20 20 54 68 61 74 20 63 6f 6d 6d 61 6e  es.  That comman
0920: 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61 6d 20 69  d-line program i
0930: 73 20 61 0a 2a 2a 20 75 73 65 66 75 6c 20 75 74  s a.** useful ut
0940: 69 6c 69 74 79 20 74 6f 20 68 61 76 65 20 61 72  ility to have ar
0950: 6f 75 6e 64 20 77 68 65 6e 20 77 6f 72 6b 69 6e  ound when workin
0960: 67 20 77 69 74 68 20 74 68 69 73 20 6d 6f 64 75  g with this modu
0970: 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75  le..*/.typedef u
0980: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e  nsigned short in
0990: 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f 2a  t WhereCost;../*
09a0: 0a 2a 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20  .** This object 
09b0: 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72 6d 61  contains informa
09c0: 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 69  tion needed to i
09d0: 6d 70 6c 65 6d 65 6e 74 20 61 20 73 69 6e 67 6c  mplement a singl
09e0: 65 20 6e 65 73 74 65 64 0a 2a 2a 20 6c 6f 6f 70  e nested.** loop
09f0: 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65   in WHERE clause
0a00: 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 74 72 61 73 74  ..**.** Contrast
0a10: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 77 69 74   this object wit
0a20: 68 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 54 68  h WhereLoop.  Th
0a30: 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  is object descri
0a40: 62 65 73 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65  bes the.** imple
0a50: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
0a60: 20 6c 6f 6f 70 2e 20 20 57 68 65 72 65 4c 6f 6f   loop.  WhereLoo
0a70: 70 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  p describes the 
0a80: 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 20 54 68  algorithm..** Th
0a90: 69 73 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69  is object contai
0aa0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
0ab0: 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 61 6c  the WhereLoop al
0ac0: 67 6f 72 69 74 68 6d 20 61 73 20 6f 6e 65 20 6f  gorithm as one o
0ad0: 66 0a 2a 2a 20 69 74 73 20 65 6c 65 6d 65 6e 74  f.** its element
0ae0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 57 68 65  s..**.** The Whe
0af0: 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f  reInfo object co
0b00: 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20  ntains a single 
0b10: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
0b20: 20 6f 62 6a 65 63 74 20 66 6f 72 0a 2a 2a 20 65   object for.** e
0b30: 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ach term in the 
0b40: 46 52 4f 4d 20 63 6c 61 75 73 65 20 28 77 68 69  FROM clause (whi
0b50: 63 68 20 69 73 20 74 6f 20 73 61 79 2c 20 66 6f  ch is to say, fo
0b60: 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  r each of the.**
0b70: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 61 73   nested loops as
0b80: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 29 2e 20 20   implemented).  
0b90: 54 68 65 20 6f 72 64 65 72 20 6f 66 20 57 68 65  The order of Whe
0ba0: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20  reLevel objects 
0bb0: 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 74 68  determines.** th
0bc0: 65 20 6c 6f 6f 70 20 6e 65 73 74 65 64 20 6f 72  e loop nested or
0bd0: 64 65 72 2c 20 77 69 74 68 20 57 68 65 72 65 49  der, with WhereI
0be0: 6e 66 6f 2e 61 5b 30 5d 20 62 65 69 6e 67 20 74  nfo.a[0] being t
0bf0: 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 61 6e  he outer loop an
0c00: 64 0a 2a 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61  d.** WhereInfo.a
0c10: 5b 57 68 65 72 65 49 6e 66 6f 2e 6e 4c 65 76 65  [WhereInfo.nLeve
0c20: 6c 2d 31 5d 20 62 65 69 6e 67 20 74 68 65 20 69  l-1] being the i
0c30: 6e 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74  nner loop..*/.st
0c40: 72 75 63 74 20 57 68 65 72 65 4c 65 76 65 6c 20  ruct WhereLevel 
0c50: 7b 0a 20 20 69 6e 74 20 69 4c 65 66 74 4a 6f 69  {.  int iLeftJoi
0c60: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  n;        /* Mem
0c70: 6f 72 79 20 63 65 6c 6c 20 75 73 65 64 20 74 6f  ory cell used to
0c80: 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 45 46 54 20   implement LEFT 
0c90: 4f 55 54 45 52 20 4a 4f 49 4e 20 2a 2f 0a 20 20  OUTER JOIN */.  
0ca0: 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20  int iTabCur;    
0cb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
0cc0: 45 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  E cursor used to
0cd0: 20 61 63 63 65 73 73 20 74 68 65 20 74 61 62 6c   access the tabl
0ce0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  e */.  int iIdxC
0cf0: 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur;          /* 
0d00: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0d10: 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 70  used to access p
0d20: 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  Idx */.  int add
0d30: 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  rBrk;          /
0d40: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
0d50: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
0d60: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
0d70: 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 20  drNxt;          
0d80: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
0d90: 73 74 61 72 74 20 74 68 65 20 6e 65 78 74 20 49  start the next I
0da0: 4e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 2a 2f  N combination */
0db0: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b  .  int addrCont;
0dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
0dd0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
0de0: 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
0df0: 6c 6f 6f 70 20 63 79 63 6c 65 20 2a 2f 0a 20 20  loop cycle */.  
0e00: 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20  int addrFirst;  
0e10: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69        /* First i
0e20: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 69 6e  nstruction of in
0e30: 74 65 72 69 6f 72 20 6f 66 20 74 68 65 20 6c 6f  terior of the lo
0e40: 6f 70 20 2a 2f 0a 20 20 75 38 20 69 46 72 6f 6d  op */.  u8 iFrom
0e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0e60: 20 57 68 69 63 68 20 65 6e 74 72 79 20 69 6e 20   Which entry in 
0e70: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
0e80: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 70 35 3b 20  */.  u8 op, p5; 
0e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
0ea0: 63 6f 64 65 20 61 6e 64 20 50 35 20 6f 66 20 74  code and P5 of t
0eb0: 68 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 65  he opcode that e
0ec0: 6e 64 73 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  nds the loop */.
0ed0: 20 20 69 6e 74 20 70 31 2c 20 70 32 3b 20 20 20    int p1, p2;   
0ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61          /* Opera
0ef0: 6e 64 73 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  nds of the opcod
0f00: 65 20 75 73 65 64 20 74 6f 20 65 6e 64 73 20 74  e used to ends t
0f10: 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 6e 69  he loop */.  uni
0f20: 6f 6e 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  on {            
0f30: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
0f40: 6e 20 74 68 61 74 20 64 65 70 65 6e 64 73 20 6f  n that depends o
0f50: 6e 20 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  n pWLoop->wsFlag
0f60: 73 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  s */.    struct 
0f70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 6e 3b  {.      int nIn;
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f90: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
0fa0: 65 73 20 69 6e 20 61 49 6e 4c 6f 6f 70 5b 5d 20  es in aInLoop[] 
0fb0: 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
0fc0: 49 6e 4c 6f 6f 70 20 7b 0a 20 20 20 20 20 20 20  InLoop {.       
0fd0: 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
0fe0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
0ff0: 44 42 45 20 63 75 72 73 6f 72 20 75 73 65 64 20  DBE cursor used 
1000: 62 79 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61  by this IN opera
1010: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tor */.        i
1020: 6e 74 20 61 64 64 72 49 6e 54 6f 70 3b 20 20 20  nt addrInTop;   
1030: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
1040: 74 68 65 20 49 4e 20 6c 6f 6f 70 20 2a 2f 0a 20  the IN loop */. 
1050: 20 20 20 20 20 20 20 75 38 20 65 45 6e 64 4c 6f         u8 eEndLo
1060: 6f 70 4f 70 3b 20 20 20 20 20 20 20 20 20 2f 2a  opOp;         /*
1070: 20 49 4e 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61   IN Loop termina
1080: 74 6f 72 2e 20 4f 50 5f 4e 65 78 74 20 6f 72 20  tor. OP_Next or 
1090: 4f 50 5f 50 72 65 76 20 2a 2f 0a 20 20 20 20 20  OP_Prev */.     
10a0: 20 7d 20 2a 61 49 6e 4c 6f 6f 70 3b 20 20 20 20   } *aInLoop;    
10b0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
10c0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68  ation about each
10d0: 20 6e 65 73 74 65 64 20 49 4e 20 6f 70 65 72 61   nested IN opera
10e0: 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 20 69 6e 3b  tor */.    } in;
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 2f 2a 20 55 73 65 64 20 77 68 65 6e 20 70 57   /* Used when pW
1110: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
1120: 45 52 45 5f 49 4e 5f 41 42 4c 45 20 2a 2f 0a 20  ERE_IN_ABLE */. 
1130: 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 69 64     Index *pCovid
1140: 78 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  x;       /* Poss
1150: 69 62 6c 65 20 63 6f 76 65 72 69 6e 67 20 69 6e  ible covering in
1160: 64 65 78 20 66 6f 72 20 57 48 45 52 45 5f 4d 55  dex for WHERE_MU
1170: 4c 54 49 5f 4f 52 20 2a 2f 0a 20 20 7d 20 75 3b  LTI_OR */.  } u;
1180: 0a 20 20 73 74 72 75 63 74 20 57 68 65 72 65 4c  .  struct WhereL
1190: 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 2f 2a  oop *pWLoop;  /*
11a0: 20 54 68 65 20 73 65 6c 65 63 74 65 64 20 57 68   The selected Wh
11b0: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
11c0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  /.};../*.** Each
11d0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
11e0: 73 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  s object represe
11f0: 6e 74 73 20 61 6e 20 61 6c 67 6f 72 69 74 68 6d  nts an algorithm
1200: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
1210: 6f 6e 65 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 61  one.** term of a
1220: 20 6a 6f 69 6e 2e 20 20 45 76 65 72 79 20 74 65   join.  Every te
1230: 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
1240: 6c 61 75 73 65 20 77 69 6c 6c 20 68 61 76 65 20  lause will have 
1250: 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20  at least.** one 
1260: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
1270: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 28  ereLoop object (
1280: 75 6e 6c 65 73 73 20 49 4e 44 45 58 45 44 20 42  unless INDEXED B
1290: 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  Y constraints.**
12a0: 20 70 72 65 76 65 6e 74 20 61 20 71 75 65 72 79   prevent a query
12b0: 20 73 6f 6c 75 74 69 6f 6e 20 2d 20 77 68 69 63   solution - whic
12c0: 68 20 69 73 20 61 6e 20 65 72 72 6f 72 29 20 61  h is an error) a
12d0: 6e 64 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66  nd many terms of
12e0: 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
12f0: 75 73 65 20 77 69 6c 6c 20 68 61 76 65 20 6d 75  use will have mu
1300: 6c 74 69 70 6c 65 20 57 68 65 72 65 4c 6f 6f 70  ltiple WhereLoop
1310: 20 6f 62 6a 65 63 74 73 2c 20 65 61 63 68 20 64   objects, each d
1320: 65 73 63 72 69 62 69 6e 67 20 61 0a 2a 2a 20 70  escribing a.** p
1330: 6f 74 65 6e 74 69 61 6c 20 77 61 79 20 6f 66 20  otential way of 
1340: 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61  implementing tha
1350: 74 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65  t FROM-clause te
1360: 72 6d 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74  rm, together wit
1370: 68 0a 2a 2a 20 64 65 70 65 6e 64 65 6e 63 69 65  h.** dependencie
1380: 73 20 61 6e 64 20 63 6f 73 74 20 65 73 74 69 6d  s and cost estim
1390: 61 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74  ates for using t
13a0: 68 65 20 63 68 6f 73 65 6e 20 61 6c 67 6f 72 69  he chosen algori
13b0: 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79  thm..**.** Query
13c0: 20 70 6c 61 6e 6e 69 6e 67 20 63 6f 6e 73 69 73   planning consis
13d0: 74 73 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 75  ts of building u
13e0: 70 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f  p a collection o
13f0: 66 20 74 68 65 73 65 20 57 68 65 72 65 4c 6f 6f  f these WhereLoo
1400: 70 0a 2a 2a 20 6f 62 6a 65 63 74 73 2c 20 74 68  p.** objects, th
1410: 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61 20 70  en computing a p
1420: 61 72 74 69 63 75 6c 61 72 20 73 65 71 75 65 6e  articular sequen
1430: 63 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ce of WhereLoop 
1440: 6f 62 6a 65 63 74 73 2c 20 77 69 74 68 0a 2a 2a  objects, with.**
1450: 20 6f 6e 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   one WhereLoop o
1460: 62 6a 65 63 74 20 70 65 72 20 46 52 4f 4d 20 63  bject per FROM c
1470: 6c 61 75 73 65 20 74 65 72 6d 2c 20 74 68 61 74  lause term, that
1480: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 64 65 70   satisfy all dep
1490: 65 6e 64 65 6e 63 69 65 73 0a 2a 2a 20 61 6e 64  endencies.** and
14a0: 20 74 68 61 74 20 6d 69 6e 69 6d 69 7a 65 20 74   that minimize t
14b0: 68 65 20 6f 76 65 72 61 6c 6c 20 63 6f 73 74 2e  he overall cost.
14c0: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
14d0: 4c 6f 6f 70 20 7b 0a 20 20 42 69 74 6d 61 73 6b  Loop {.  Bitmask
14e0: 20 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 2f   prereq;       /
14f0: 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 6f 74 68  * Bitmask of oth
1500: 65 72 20 6c 6f 6f 70 73 20 74 68 61 74 20 6d 75  er loops that mu
1510: 73 74 20 72 75 6e 20 66 69 72 73 74 20 2a 2f 0a  st run first */.
1520: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 65    Bitmask maskSe
1530: 6c 66 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d 61  lf;     /* Bitma
1540: 73 6b 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74  sk identifying t
1550: 61 62 6c 65 20 69 54 61 62 20 2a 2f 0a 23 69 66  able iTab */.#if
1560: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1570: 0a 20 20 63 68 61 72 20 63 49 64 3b 20 20 20 20  .  char cId;    
1580: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62           /* Symb
1590: 6f 6c 69 63 20 49 44 20 6f 66 20 74 68 69 73 20  olic ID of this 
15a0: 6c 6f 6f 70 20 66 6f 72 20 64 65 62 75 67 67 69  loop for debuggi
15b0: 6e 67 20 75 73 65 20 2a 2f 0a 23 65 6e 64 69 66  ng use */.#endif
15c0: 0a 20 20 75 38 20 69 54 61 62 3b 20 20 20 20 20  .  u8 iTab;     
15d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
15e0: 74 69 6f 6e 20 69 6e 20 46 52 4f 4d 20 63 6c 61  tion in FROM cla
15f0: 75 73 65 20 6f 66 20 74 61 62 6c 65 20 66 6f 72  use of table for
1600: 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
1610: 75 38 20 69 53 6f 72 74 49 64 78 3b 20 20 20 20  u8 iSortIdx;    
1620: 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67        /* Sorting
1630: 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 2e 20 20   index number.  
1640: 30 3d 3d 4e 6f 6e 65 20 2a 2f 0a 20 20 57 68 65  0==None */.  Whe
1650: 72 65 43 6f 73 74 20 72 53 65 74 75 70 3b 20 20  reCost rSetup;  
1660: 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 73     /* One-time s
1670: 65 74 75 70 20 63 6f 73 74 20 28 65 78 3a 20 63  etup cost (ex: c
1680: 72 65 61 74 65 20 74 72 61 6e 73 69 65 6e 74 20  reate transient 
1690: 69 6e 64 65 78 29 20 2a 2f 0a 20 20 57 68 65 72  index) */.  Wher
16a0: 65 43 6f 73 74 20 72 52 75 6e 3b 20 20 20 20 20  eCost rRun;     
16b0: 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 72 75 6e    /* Cost of run
16c0: 6e 69 6e 67 20 65 61 63 68 20 6c 6f 6f 70 20 2a  ning each loop *
16d0: 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e 4f  /.  WhereCost nO
16e0: 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74  ut;       /* Est
16f0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
1700: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
1710: 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74    union {.    st
1720: 72 75 63 74 20 7b 20 20 20 20 20 20 20 20 20 20  ruct {          
1730: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1740: 69 6f 6e 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ion for internal
1750: 20 62 74 72 65 65 20 74 61 62 6c 65 73 20 2a 2f   btree tables */
1760: 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 3b 20  .      int nEq; 
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1780: 20 4e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c   Number of equal
1790: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
17a0: 2a 2f 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  */.      Index *
17b0: 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
17c0: 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 2c 20 6f  /* Index used, o
17d0: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 7d 20  r NULL */.    } 
17e0: 62 74 72 65 65 3b 0a 20 20 20 20 73 74 72 75 63  btree;.    struc
17f0: 74 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  t {             
1800: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1810: 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   for virtual tab
1820: 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  les */.      int
1830: 20 69 64 78 4e 75 6d 3b 20 20 20 20 20 20 20 20   idxNum;        
1840: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
1850: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ber */.      u8 
1860: 6e 65 65 64 46 72 65 65 3b 20 20 20 20 20 20 20  needFree;       
1870: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
1880: 71 6c 69 74 65 33 5f 66 72 65 65 28 69 64 78 53  qlite3_free(idxS
1890: 74 72 29 20 69 73 20 6e 65 65 64 65 64 20 2a 2f  tr) is needed */
18a0: 0a 20 20 20 20 20 20 75 38 20 69 73 4f 72 64 65  .      u8 isOrde
18b0: 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  red;          /*
18c0: 20 54 72 75 65 20 69 66 20 73 61 74 69 73 66 69   True if satisfi
18d0: 65 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  es ORDER BY */. 
18e0: 20 20 20 20 20 75 31 36 20 6f 6d 69 74 4d 61 73       u16 omitMas
18f0: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  k;          /* T
1900: 65 72 6d 73 20 74 68 61 74 20 6d 61 79 20 62 65  erms that may be
1910: 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 20 20   omitted */.    
1920: 20 20 63 68 61 72 20 2a 69 64 78 53 74 72 3b 20    char *idxStr; 
1930: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1940: 78 20 69 64 65 6e 74 69 66 69 65 72 20 73 74 72  x identifier str
1950: 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 20 76 74 61  ing */.    } vta
1960: 62 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  b;.  } u;.  u32 
1970: 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  wsFlags;        
1980: 20 20 2f 2a 20 57 48 45 52 45 5f 2a 20 66 6c 61    /* WHERE_* fla
1990: 67 73 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  gs describing th
19a0: 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20  e plan */.  u16 
19b0: 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  nLTerm;         
19c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
19d0: 6e 74 72 69 65 73 20 69 6e 20 61 4c 54 65 72 6d  ntries in aLTerm
19e0: 5b 5d 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a 20 77 68  [] */.  /**** wh
19f0: 65 72 65 4c 6f 6f 70 58 66 65 72 28 29 20 63 6f  ereLoopXfer() co
1a00: 70 69 65 73 20 66 69 65 6c 64 73 20 61 62 6f 76  pies fields abov
1a10: 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e **************
1a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 20 64 65 66  *********/.# def
1a30: 69 6e 65 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58  ine WHERE_LOOP_X
1a40: 46 45 52 5f 53 5a 20 6f 66 66 73 65 74 6f 66 28  FER_SZ offsetof(
1a50: 57 68 65 72 65 4c 6f 6f 70 2c 6e 4c 53 6c 6f 74  WhereLoop,nLSlot
1a60: 29 0a 20 20 75 31 36 20 6e 4c 53 6c 6f 74 3b 20  ).  u16 nLSlot; 
1a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a80: 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 61 6c 6c  ber of slots all
1a90: 6f 63 61 74 65 64 20 66 6f 72 20 61 4c 54 65 72  ocated for aLTer
1aa0: 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  m[] */.  WhereTe
1ab0: 72 6d 20 2a 2a 61 4c 54 65 72 6d 3b 20 20 20 2f  rm **aLTerm;   /
1ac0: 2a 20 57 68 65 72 65 54 65 72 6d 73 20 75 73 65  * WhereTerms use
1ad0: 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
1ae0: 20 2a 70 4e 65 78 74 4c 6f 6f 70 3b 20 2f 2a 20   *pNextLoop; /* 
1af0: 4e 65 78 74 20 57 68 65 72 65 4c 6f 6f 70 20 6f  Next WhereLoop o
1b00: 62 6a 65 63 74 20 69 6e 20 74 68 65 20 57 68 65  bject in the Whe
1b10: 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  reClause */.  Wh
1b20: 65 72 65 54 65 72 6d 20 2a 61 4c 54 65 72 6d 53  ereTerm *aLTermS
1b30: 70 61 63 65 5b 34 5d 3b 20 20 2f 2a 20 49 6e 69  pace[4];  /* Ini
1b40: 74 69 61 6c 20 61 4c 54 65 72 6d 5b 5d 20 73 70  tial aLTerm[] sp
1b50: 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 46 6f  ace */.};../* Fo
1b60: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1b70: 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  n of methods */.
1b80: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1b90: 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74  LoopResize(sqlit
1ba0: 65 33 2a 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c  e3*, WhereLoop*,
1bb0: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61   int);../*.** Ea
1bc0: 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ch instance of t
1bd0: 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73  his object holds
1be0: 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 57   a sequence of W
1bf0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1c00: 0a 2a 2a 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  .** that impleme
1c10: 6e 74 20 73 6f 6d 65 20 6f 72 20 61 6c 6c 20 6f  nt some or all o
1c20: 66 20 61 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  f a query plan..
1c30: 2a 2a 0a 2a 2a 20 54 68 69 6e 6b 20 6f 66 20 65  **.** Think of e
1c40: 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ach WhereLoop ob
1c50: 6a 65 63 74 73 20 61 73 20 61 20 6e 6f 64 65 20  jects as a node 
1c60: 69 6e 20 61 20 67 72 61 70 68 2c 20 77 68 69 63  in a graph, whic
1c70: 68 20 61 72 63 73 0a 2a 2a 20 73 68 6f 77 69 6e  h arcs.** showin
1c80: 67 20 64 65 70 65 6e 64 65 6e 63 65 73 20 61 6e  g dependences an
1c90: 64 20 63 6f 73 74 73 20 66 6f 72 20 74 72 61 76  d costs for trav
1ca0: 65 6c 6c 69 6e 67 20 62 65 74 77 65 65 6e 20 6e  elling between n
1cb0: 6f 64 65 73 2e 20 20 28 54 68 61 74 20 69 73 0a  odes.  (That is.
1cc0: 2a 2a 20 6e 6f 74 20 61 20 63 6f 6d 70 6c 65 74  ** not a complet
1cd0: 65 6c 79 20 61 63 63 75 72 61 74 65 20 64 65 73  ely accurate des
1ce0: 63 72 69 70 74 69 6f 6e 20 62 65 63 61 75 73 65  cription because
1cf0: 20 57 68 65 72 65 4c 6f 6f 70 20 63 6f 73 74 73   WhereLoop costs
1d00: 20 61 72 65 20 61 0a 2a 2a 20 76 65 63 74 6f 72   are a.** vector
1d10: 2c 20 6e 6f 74 20 61 20 73 63 61 6c 61 72 2c 20  , not a scalar, 
1d20: 61 6e 64 20 62 65 63 61 75 73 65 20 64 65 70 65  and because depe
1d30: 6e 64 65 6e 63 65 73 20 61 72 65 20 6d 61 6e 79  ndences are many
1d40: 2d 74 6f 2d 6f 6e 65 2c 20 6e 6f 74 0a 2a 2a 20  -to-one, not.** 
1d50: 6f 6e 65 2d 74 6f 2d 6f 6e 65 20 61 73 20 61 72  one-to-one as ar
1d60: 65 20 67 72 61 70 68 20 6e 6f 64 65 73 2e 20 20  e graph nodes.  
1d70: 42 75 74 20 69 74 20 69 73 20 61 20 75 73 65 66  But it is a usef
1d80: 75 6c 20 76 69 73 75 61 6c 69 7a 61 74 69 6f 6e  ul visualization
1d90: 20 61 69 64 2e 29 0a 2a 2a 20 54 68 65 6e 20 61   aid.).** Then a
1da0: 20 57 68 65 72 65 50 61 74 68 20 6f 62 6a 65 63   WherePath objec
1db0: 74 20 69 73 20 61 20 70 61 74 68 20 74 68 72 6f  t is a path thro
1dc0: 75 67 68 20 74 68 65 20 67 72 61 70 68 20 74 68  ugh the graph th
1dd0: 61 74 20 76 69 73 69 74 73 20 73 6f 6d 65 0a 2a  at visits some.*
1de0: 2a 20 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  * or all of the 
1df0: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1e00: 73 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  s once..**.** Th
1e10: 65 20 22 73 6f 6c 76 65 72 22 20 77 6f 72 6b 73  e "solver" works
1e20: 20 62 79 20 63 72 65 61 74 69 6e 67 20 74 68 65   by creating the
1e30: 20 4e 20 62 65 73 74 20 57 68 65 72 65 50 61 74   N best WherePat
1e40: 68 20 6f 62 6a 65 63 74 73 20 6f 66 20 6c 65 6e  h objects of len
1e50: 67 74 68 0a 2a 2a 20 31 2e 20 20 54 68 65 6e 20  gth.** 1.  Then 
1e60: 75 73 69 6e 67 20 74 68 6f 73 65 20 61 73 20 61  using those as a
1e70: 20 62 61 73 69 73 20 74 6f 20 63 6f 6d 70 75 74   basis to comput
1e80: 65 20 74 68 65 20 4e 20 62 65 73 74 20 57 68 65  e the N best Whe
1e90: 72 65 50 61 74 68 20 6f 62 6a 65 63 74 73 0a 2a  rePath objects.*
1ea0: 2a 20 6f 66 20 6c 65 6e 67 74 68 20 32 2e 20 20  * of length 2.  
1eb0: 41 6e 64 20 73 6f 20 66 6f 72 74 68 20 75 6e 74  And so forth unt
1ec0: 69 6c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  il the length of
1ed0: 20 57 68 65 72 65 50 61 74 68 73 20 65 71 75 61   WherePaths equa
1ee0: 6c 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  ls the.** number
1ef0: 20 6f 66 20 6e 6f 64 65 73 20 69 6e 20 74 68 65   of nodes in the
1f00: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1f10: 68 65 20 62 65 73 74 20 28 6c 6f 77 65 73 74 20  he best (lowest 
1f20: 63 6f 73 74 29 20 57 68 65 72 65 50 61 74 68 0a  cost) WherePath.
1f30: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 69 73  ** at the end is
1f40: 20 74 68 65 20 63 68 6f 6f 73 65 6e 20 71 75 65   the choosen que
1f50: 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 73 74 72 75  ry plan..*/.stru
1f60: 63 74 20 57 68 65 72 65 50 61 74 68 20 7b 0a 20  ct WherePath {. 
1f70: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4c 6f 6f   Bitmask maskLoo
1f80: 70 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  p;     /* Bitmas
1f90: 6b 20 6f 66 20 61 6c 6c 20 57 68 65 72 65 4c 6f  k of all WhereLo
1fa0: 6f 70 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  op objects in th
1fb0: 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 42 69 74  is path */.  Bit
1fc0: 6d 61 73 6b 20 72 65 76 4c 6f 6f 70 3b 20 20 20  mask revLoop;   
1fd0: 20 20 20 2f 2a 20 61 4c 6f 6f 70 5b 5d 73 20 74     /* aLoop[]s t
1fe0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65  hat should be re
1ff0: 76 65 72 73 65 64 20 66 6f 72 20 4f 52 44 45 52  versed for ORDER
2000: 20 42 59 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f   BY */.  WhereCo
2010: 73 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 2f  st nRow;       /
2020: 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  * Estimated numb
2030: 65 72 20 6f 66 20 72 6f 77 73 20 67 65 6e 65 72  er of rows gener
2040: 61 74 65 64 20 62 79 20 74 68 69 73 20 70 61 74  ated by this pat
2050: 68 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  h */.  WhereCost
2060: 20 72 43 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20   rCost;      /* 
2070: 54 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 74 68  Total cost of th
2080: 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 75 38 20  is path */.  u8 
2090: 69 73 4f 72 64 65 72 65 64 3b 20 20 20 20 20 20  isOrdered;      
20a0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
20b0: 69 73 20 70 61 74 68 20 73 61 74 69 73 66 69 65  is path satisfie
20c0: 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  s ORDER BY */.  
20d0: 75 38 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69  u8 isOrderedVali
20e0: 64 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  d;    /* True if
20f0: 20 74 68 65 20 69 73 4f 72 64 65 72 65 64 20 66   the isOrdered f
2100: 69 65 6c 64 20 69 73 20 76 61 6c 69 64 20 2a 2f  ield is valid */
2110: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 61  .  WhereLoop **a
2120: 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 41 72 72 61  Loop;    /* Arra
2130: 79 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  y of WhereLoop o
2140: 62 6a 65 63 74 73 20 69 6d 70 6c 65 6d 65 6e 74  bjects implement
2150: 69 6e 67 20 74 68 69 73 20 70 61 74 68 20 2a 2f  ing this path */
2160: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71  .};../*.** The q
2170: 75 65 72 79 20 67 65 6e 65 72 61 74 6f 72 20 75  uery generator u
2180: 73 65 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ses an array of 
2190: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 69  instances of thi
21a0: 73 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a  s structure to.*
21b0: 2a 20 68 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a  * help it analyz
21c0: 65 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  e the subexpress
21d0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 57 48 45 52  ions of the WHER
21e0: 45 20 63 6c 61 75 73 65 2e 20 20 45 61 63 68 20  E clause.  Each 
21f0: 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20  WHERE.** clause 
2200: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
2210: 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20   separated from 
2220: 74 68 65 20 6f 74 68 65 72 73 20 62 79 20 41 4e  the others by AN
2230: 44 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  D operators,.** 
2240: 75 73 75 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65  usually, or some
2250: 74 69 6d 65 73 20 73 75 62 65 78 70 72 65 73 73  times subexpress
2260: 69 6f 6e 73 20 73 65 70 61 72 61 74 65 64 20 62  ions separated b
2270: 79 20 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  y OR..**.** All 
2280: 57 68 65 72 65 54 65 72 6d 73 20 61 72 65 20 63  WhereTerms are c
2290: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 61 20  ollected into a 
22a0: 73 69 6e 67 6c 65 20 57 68 65 72 65 43 6c 61 75  single WhereClau
22b0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 0a  se structure.  .
22c0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
22d0: 20 69 64 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a   identity holds:
22e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 68  .**.**        Wh
22f0: 65 72 65 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57  ereTerm.pWC->a[W
2300: 68 65 72 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d  hereTerm.idx] ==
2310: 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a   WhereTerm.**.**
2320: 20 57 68 65 6e 20 61 20 74 65 72 6d 20 69 73 20   When a term is 
2330: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
2340: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2350: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a  X <op> <expr>.**
2360: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
2370: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64   column name and
2380: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20   <op> is one of 
2390: 63 65 72 74 61 69 6e 20 6f 70 65 72 61 74 6f 72  certain operator
23a0: 73 2c 0a 2a 2a 20 74 68 65 6e 20 57 68 65 72 65  s,.** then Where
23b0: 54 65 72 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20  Term.leftCursor 
23c0: 61 6e 64 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  and WhereTerm.u.
23d0: 6c 65 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72  leftColumn recor
23e0: 64 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  d the.** cursor 
23f0: 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d  number and colum
2400: 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 20  n number for X. 
2410: 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72   WhereTerm.eOper
2420: 61 74 6f 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ator records.** 
2430: 74 68 65 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61  the <op> using a
2440: 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e   bitmask encodin
2450: 67 20 64 65 66 69 6e 65 64 20 62 79 20 57 4f 5f  g defined by WO_
2460: 78 78 78 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a  xxx below.  The.
2470: 2a 2a 20 75 73 65 20 6f 66 20 61 20 62 69 74 6d  ** use of a bitm
2480: 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  ask encoding for
2490: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 61 6c   the operator al
24a0: 6c 6f 77 73 20 75 73 20 74 6f 20 73 65 61 72 63  lows us to searc
24b0: 68 0a 2a 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72  h.** quickly for
24c0: 20 74 65 72 6d 73 20 74 68 61 74 20 6d 61 74 63   terms that matc
24d0: 68 20 61 6e 79 20 6f 66 20 73 65 76 65 72 61 6c  h any of several
24e0: 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61   different opera
24f0: 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68  tors..**.** A Wh
2500: 65 72 65 54 65 72 6d 20 6d 69 67 68 74 20 61 6c  ereTerm might al
2510: 73 6f 20 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72  so be two or mor
2520: 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65  e subterms conne
2530: 63 74 65 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a  cted by OR:.**.*
2540: 2a 20 20 20 20 20 20 20 20 20 28 74 31 2e 58 20  *         (t1.X 
2550: 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20  <op> <expr>) OR 
2560: 28 74 31 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72  (t1.Y <op> <expr
2570: 3e 29 20 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a  >) OR .....**.**
2580: 20 49 6e 20 74 68 69 73 20 73 65 63 6f 6e 64 20   In this second 
2590: 63 61 73 65 2c 20 77 74 46 6c 61 67 20 61 73 20  case, wtFlag as 
25a0: 74 68 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20  the TERM_ORINFO 
25b0: 73 65 74 20 61 6e 64 20 65 4f 70 65 72 61 74 6f  set and eOperato
25c0: 72 3d 3d 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20  r==WO_OR.** and 
25d0: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
25e0: 70 4f 72 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f  pOrInfo field po
25f0: 69 6e 74 73 20 74 6f 20 61 75 78 69 6c 69 61 72  ints to auxiliar
2600: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  y information th
2610: 61 74 0a 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74  at.** is collect
2620: 65 64 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a  ed about the.**.
2630: 2a 2a 20 49 66 20 61 20 74 65 72 6d 20 69 6e 20  ** If a term in 
2640: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2650: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
2660: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
2670: 6f 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61  o previous.** ca
2680: 74 65 67 6f 72 69 65 73 2c 20 74 68 65 6e 20 65  tegories, then e
2690: 4f 70 65 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68  Operator==0.  Th
26a0: 65 20 57 68 65 72 65 54 65 72 6d 2e 70 45 78 70  e WhereTerm.pExp
26b0: 72 20 66 69 65 6c 64 20 69 73 20 73 74 69 6c 6c  r field is still
26c0: 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f   set.** to the o
26d0: 72 69 67 69 6e 61 6c 20 73 75 62 65 78 70 72 65  riginal subexpre
26e0: 73 73 69 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e  ssion content an
26f0: 64 20 77 74 46 6c 61 67 73 20 69 73 20 73 65 74  d wtFlags is set
2700: 20 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 6c   up appropriatel
2710: 79 0a 2a 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65  y.** but no othe
2720: 72 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  r fields in the 
2730: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
2740: 20 61 72 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e   are meaningful.
2750: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65  .**.** When eOpe
2760: 72 61 74 6f 72 21 3d 30 2c 20 70 72 65 72 65 71  rator!=0, prereq
2770: 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71  Right and prereq
2780: 41 6c 6c 20 72 65 63 6f 72 64 20 73 65 74 73 20  All record sets 
2790: 6f 66 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  of cursor number
27a0: 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79 20 64  s,.** but they d
27b0: 6f 20 73 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e  o so indirectly.
27c0: 20 20 41 20 73 69 6e 67 6c 65 20 57 68 65 72 65    A single Where
27d0: 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
27e0: 65 20 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20  e translates.** 
27f0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e  cursor number in
2800: 74 6f 20 62 69 74 73 20 61 6e 64 20 74 68 65 20  to bits and the 
2810: 74 72 61 6e 73 6c 61 74 65 64 20 62 69 74 20 69  translated bit i
2820: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
2830: 70 72 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73  prereq.** fields
2840: 2e 20 20 54 68 65 20 74 72 61 6e 73 6c 61 74 69  .  The translati
2850: 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 6f 72  on is used in or
2860: 64 65 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20  der to maximize 
2870: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
2880: 20 62 69 74 73 20 74 68 61 74 20 77 69 6c 6c 20   bits that will 
2890: 66 69 74 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  fit in a Bitmask
28a0: 2e 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73  .  The VDBE curs
28b0: 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74  or numbers might
28c0: 20 62 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75   be.** spread ou
28d0: 74 20 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e  t over the non-n
28e0: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 73  egative integers
28f0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
2900: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  the cursor.** nu
2910: 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65 20 33  mbers might be 3
2920: 2c 20 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20  , 8, 9, 10, 20, 
2930: 32 33 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e 20  23, 41, and 45. 
2940: 20 54 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65   The WhereMaskSe
2950: 74 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 73 20  t.** translates 
2960: 74 68 65 73 65 20 73 70 61 72 73 65 20 63 75 72  these sparse cur
2970: 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f  sor numbers into
2980: 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74   consecutive int
2990: 65 67 65 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69  egers.** beginni
29a0: 6e 67 20 77 69 74 68 20 30 20 69 6e 20 6f 72 64  ng with 0 in ord
29b0: 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 62  er to make the b
29c0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 75 73 65  est possible use
29d0: 20 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c   of the availabl
29e0: 65 0a 2a 2a 20 62 69 74 73 20 69 6e 20 74 68 65  e.** bits in the
29f0: 20 42 69 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69   Bitmask.  So, i
2a00: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
2a10: 6f 76 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ove, the cursor 
2a20: 6e 75 6d 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64  numbers.** would
2a30: 20 62 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   be mapped into 
2a40: 69 6e 74 65 67 65 72 73 20 30 20 74 68 72 6f 75  integers 0 throu
2a50: 67 68 20 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  gh 7..**.** The 
2a60: 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  number of terms 
2a70: 69 6e 20 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d  in a join is lim
2a80: 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
2a90: 65 72 20 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e  er of bits.** in
2aa0: 20 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64   prereqRight and
2ab0: 20 70 72 65 72 65 71 41 6c 6c 2e 20 20 54 68 65   prereqAll.  The
2ac0: 20 64 65 66 61 75 6c 74 20 69 73 20 36 34 20 62   default is 64 b
2ad0: 69 74 73 2c 20 68 65 6e 63 65 20 53 51 4c 69 74  its, hence SQLit
2ae0: 65 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c  e.** is only abl
2af0: 65 20 74 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69  e to process joi
2b00: 6e 73 20 77 69 74 68 20 36 34 20 6f 72 20 66 65  ns with 64 or fe
2b10: 77 65 72 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  wer tables..*/.s
2b20: 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d 20  truct WhereTerm 
2b30: 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75  ointer to the su
2b60: 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74  bexpression that
2b70: 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f   is this term */
2b80: 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
2b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
2ba0: 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61  sable pWC->a[iPa
2bb0: 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20  rent] when this 
2bc0: 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f  term disabled */
2bd0: 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f  .  int leftCurso
2be0: 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  r;         /* Cu
2bf0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58  rsor number of X
2c00: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
2c10: 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b  r>" */.  union {
2c20: 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c  .    int leftCol
2c30: 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  umn;         /* 
2c40: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
2c50: 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65   X in "X <op> <e
2c60: 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65  xpr>" */.    Whe
2c70: 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66  reOrInfo *pOrInf
2c80: 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e  o;   /* Extra in
2c90: 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f  formation if (eO
2ca0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
2cb0: 21 3d 30 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  !=0 */.    Where
2cc0: 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66  AndInfo *pAndInf
2cd0: 6f 3b 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f  o; /* Extra info
2ce0: 72 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70 65  rmation if (eOpe
2cf0: 72 61 74 6f 72 26 20 57 4f 5f 41 4e 44 29 21 3d  rator& WO_AND)!=
2d00: 30 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 31  0 */.  } u;.  u1
2d10: 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 20  6 eOperator;    
2d20: 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78        /* A WO_xx
2d30: 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 69 6e   value describin
2d40: 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 77  g <op> */.  u8 w
2d50: 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  tFlags;         
2d60: 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78 20      /* TERM_xxx 
2d70: 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65 20  bit flags.  See 
2d80: 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e 43  below */.  u8 nC
2d90: 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
2da0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2db0: 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20 6d 75  children that mu
2dc0: 73 74 20 64 69 73 61 62 6c 65 20 75 73 20 2a 2f  st disable us */
2dd0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2de0: 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC;       /* Th
2df0: 65 20 63 6c 61 75 73 65 20 74 68 69 73 20 74 65  e clause this te
2e00: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a 2f  rm is part of */
2e10: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
2e20: 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42 69  qRight;    /* Bi
2e30: 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20  tmask of tables 
2e40: 75 73 65 64 20 62 79 20 70 45 78 70 72 2d 3e 70  used by pExpr->p
2e50: 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61  Right */.  Bitma
2e60: 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20  sk prereqAll;   
2e70: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
2e80: 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63   tables referenc
2e90: 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f 0a 7d  ed by pExpr */.}
2ea0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
2eb0: 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72 65   values of Where
2ec0: 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a 2f 0a  Term.wtFlags.*/.
2ed0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e  #define TERM_DYN
2ee0: 41 4d 49 43 20 20 20 20 30 78 30 31 20 20 20 2f  AMIC    0x01   /
2ef0: 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  * Need to call s
2f00: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
2f10: 28 64 62 2c 20 70 45 78 70 72 29 20 2a 2f 0a 23  (db, pExpr) */.#
2f20: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49 52 54  define TERM_VIRT
2f30: 55 41 4c 20 20 20 20 30 78 30 32 20 20 20 2f 2a  UAL    0x02   /*
2f40: 20 41 64 64 65 64 20 62 79 20 74 68 65 20 6f 70   Added by the op
2f50: 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f 74  timizer.  Do not
2f60: 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65   code */.#define
2f70: 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20 20 20   TERM_CODED     
2f80: 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69 73 20   0x04   /* This 
2f90: 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64 79 20  term is already 
2fa0: 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  coded */.#define
2fb0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20 20 20   TERM_COPIED    
2fc0: 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73 20 61   0x08   /* Has a
2fd0: 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69 6e   child */.#defin
2fe0: 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 20 20  e TERM_ORINFO   
2ff0: 20 20 30 78 31 30 20 20 20 2f 2a 20 4e 65 65 64    0x10   /* Need
3000: 20 74 6f 20 66 72 65 65 20 74 68 65 20 57 68 65   to free the Whe
3010: 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f  reTerm.u.pOrInfo
3020: 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65 66 69   object */.#defi
3030: 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20  ne TERM_ANDINFO 
3040: 20 20 20 30 78 32 30 20 20 20 2f 2a 20 4e 65 65     0x20   /* Nee
3050: 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57 68  d to free the Wh
3060: 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64 49 6e  ereTerm.u.pAndIn
3070: 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66 69 6e  fo obj */.#defin
3080: 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20 20  e TERM_OR_OK    
3090: 20 20 30 78 34 30 20 20 20 2f 2a 20 55 73 65 64    0x40   /* Used
30a0: 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75 73   during OR-claus
30b0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a  e processing */.
30c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
30d0: 41 42 4c 45 5f 53 54 41 54 33 0a 23 20 20 64 65  ABLE_STAT3.#  de
30e0: 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  fine TERM_VNULL 
30f0: 20 20 20 30 78 38 30 20 20 20 2f 2a 20 4d 61 6e     0x80   /* Man
3100: 75 66 61 63 74 75 72 65 64 20 78 3e 4e 55 4c 4c  ufactured x>NULL
3110: 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74 65 72 6d   or x<=NULL term
3120: 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20 64 65 66   */.#else.#  def
3130: 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20  ine TERM_VNULL  
3140: 20 20 30 78 30 30 20 20 20 2f 2a 20 44 69 73 61    0x00   /* Disa
3150: 62 6c 65 64 20 69 66 20 6e 6f 74 20 75 73 69 6e  bled if not usin
3160: 67 20 73 74 61 74 33 20 2a 2f 0a 23 65 6e 64 69  g stat3 */.#endi
3170: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  f../*.** An inst
3180: 61 6e 63 65 20 6f 66 20 74 68 65 20 57 68 65 72  ance of the Wher
3190: 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 69 73 20  eScan object is 
31a0: 75 73 65 64 20 61 73 20 61 6e 20 69 74 65 72 61  used as an itera
31b0: 74 6f 72 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67  tor for locating
31c0: 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65  .** terms in the
31d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
31e0: 61 74 20 61 72 65 20 75 73 65 66 75 6c 20 74 6f  at are useful to
31f0: 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   the query plann
3200: 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  er..*/.struct Wh
3210: 65 72 65 53 63 61 6e 20 7b 0a 20 20 57 68 65 72  ereScan {.  Wher
3220: 65 43 6c 61 75 73 65 20 2a 70 4f 72 69 67 57 43  eClause *pOrigWC
3230: 3b 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  ;      /* Origin
3240: 61 6c 2c 20 69 6e 6e 65 72 6d 6f 73 74 20 57 68  al, innermost Wh
3250: 65 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57  ereClause */.  W
3260: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
3270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
3280: 72 65 43 6c 61 75 73 65 20 63 75 72 72 65 6e 74  reClause current
3290: 6c 79 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  ly being scanned
32a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   */.  char *zCol
32b0: 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  lName;          
32c0: 20 2f 2a 20 52 65 71 75 69 72 65 64 20 63 6f 6c   /* Required col
32d0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c  lating sequence,
32e0: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
32f0: 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 20 20    char idxaff;  
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3310: 4d 75 73 74 20 6d 61 74 63 68 20 74 68 69 73 20  Must match this 
3320: 61 66 66 69 6e 69 74 79 2c 20 69 66 20 7a 43 6f  affinity, if zCo
3330: 6c 6c 4e 61 6d 65 21 3d 4e 55 4c 4c 20 2a 2f 0a  llName!=NULL */.
3340: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3350: 6e 45 71 75 69 76 3b 20 20 20 20 20 20 2f 2a 20  nEquiv;      /* 
3360: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
3370: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f  s in aEquiv[] */
3380: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
3390: 20 69 45 71 75 69 76 3b 20 20 20 20 20 20 2f 2a   iEquiv;      /*
33a0: 20 4e 65 78 74 20 75 6e 75 73 65 64 20 73 6c 6f   Next unused slo
33b0: 74 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f  t in aEquiv[] */
33c0: 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20 20  .  u32 opMask;  
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33e0: 20 41 63 63 65 70 74 61 62 6c 65 20 6f 70 65 72   Acceptable oper
33f0: 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6b  ators */.  int k
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20        /* Resume 
3420: 73 63 61 6e 6e 69 6e 67 20 61 74 20 74 68 69 73  scanning at this
3430: 2d 3e 70 57 43 2d 3e 61 5b 74 68 69 73 2d 3e 6b  ->pWC->a[this->k
3440: 5d 20 2a 2f 0a 20 20 69 6e 74 20 61 45 71 75 69  ] */.  int aEqui
3450: 76 5b 32 32 5d 3b 20 20 20 20 20 20 20 20 20 20  v[22];          
3460: 20 20 2f 2a 20 43 75 72 73 6f 72 2c 43 6f 6c 75    /* Cursor,Colu
3470: 6d 6e 20 70 61 69 72 73 20 66 6f 72 20 65 71 75  mn pairs for equ
3480: 69 76 61 6c 65 6e 63 65 20 63 6c 61 73 73 65 73  ivalence classes
3490: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
34a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
34b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
34c0: 74 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69  ture holds all i
34d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
34e0: 20 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75   a.** WHERE clau
34f0: 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73  se.  Mostly this
3500: 20 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20   is a container 
3510: 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  for one or more 
3520: 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a  WhereTerms..**.*
3530: 2a 20 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  * Explanation of
3540: 20 70 4f 75 74 65 72 3a 20 20 46 6f 72 20 61 20   pOuter:  For a 
3550: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
3560: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
3570: 20 20 20 20 20 20 20 20 20 61 20 41 4e 44 20 28           a AND (
3580: 28 62 20 41 4e 44 20 63 29 20 4f 52 20 28 64 20  (b AND c) OR (d 
3590: 41 4e 44 20 65 29 29 20 41 4e 44 20 66 0a 2a 2a  AND e)) AND f.**
35a0: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65  .** There are se
35b0: 70 61 72 61 74 65 20 57 68 65 72 65 43 6c 61 75  parate WhereClau
35c0: 73 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 74  se objects for t
35d0: 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 20  he whole clause 
35e0: 61 6e 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  and for.** the s
35f0: 75 62 63 6c 61 75 73 65 73 20 22 28 62 20 41 4e  ubclauses "(b AN
3600: 44 20 63 29 22 20 61 6e 64 20 22 28 64 20 41 4e  D c)" and "(d AN
3610: 44 20 65 29 22 2e 20 20 54 68 65 20 70 4f 75 74  D e)".  The pOut
3620: 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a  er field of the.
3630: 2a 2a 20 73 75 62 63 6c 61 75 73 65 73 20 70 6f  ** subclauses po
3640: 69 6e 74 73 20 74 6f 20 74 68 65 20 57 68 65 72  ints to the Wher
3650: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 66  eClause object f
3660: 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c 61  or the whole cla
3670: 75 73 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  use..*/.struct W
3680: 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 57  hereClause {.  W
3690: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
36a0: 3b 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45  ;       /* WHERE
36b0: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
36c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
36d0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 75  WhereClause *pOu
36e0: 74 65 72 3b 20 20 20 20 20 2f 2a 20 4f 75 74 65  ter;     /* Oute
36f0: 72 20 63 6f 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f  r conjunction */
3700: 0a 20 20 75 38 20 6f 70 3b 20 20 20 20 20 20 20  .  u8 op;       
3710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3720: 70 6c 69 74 20 6f 70 65 72 61 74 6f 72 2e 20 20  plit operator.  
3730: 54 4b 5f 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20  TK_AND or TK_OR 
3740: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3760: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
3770: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b   */.  int nSlot;
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3790: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
37a0: 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20  ies in a[] */.  
37b0: 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 20 20 20  WhereTerm *a;   
37c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68           /* Each
37d0: 20 61 5b 5d 20 64 65 73 63 72 69 62 65 73 20 61   a[] describes a
37e0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
37f0: 52 45 20 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66  RE cluase */.#if
3800: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3810: 53 4d 41 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57  SMALL_STACK).  W
3820: 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69 63  hereTerm aStatic
3830: 5b 31 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69  [1];    /* Initi
3840: 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20  al static space 
3850: 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65  for a[] */.#else
3860: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 61 53 74  .  WhereTerm aSt
3870: 61 74 69 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49  atic[8];    /* I
3880: 6e 69 74 69 61 6c 20 73 74 61 74 69 63 20 73 70  nitial static sp
3890: 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23  ace for a[] */.#
38a0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
38b0: 41 20 57 68 65 72 65 54 65 72 6d 20 77 69 74 68  A WhereTerm with
38c0: 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f   eOperator==WO_O
38d0: 52 20 68 61 73 20 69 74 73 20 75 2e 70 4f 72 49  R has its u.pOrI
38e0: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20  nfo pointer set 
38f0: 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61  to.** a dynamica
3900: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  lly allocated in
3910: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3920: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3930: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
3940: 72 65 4f 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65  reOrInfo {.  Whe
3950: 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20  reClause wc;    
3960: 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f        /* Decompo
3970: 73 69 74 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74  sition into subt
3980: 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
3990: 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20  k indexable;    
39a0: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
39b0: 20 61 6c 6c 20 69 6e 64 65 78 61 62 6c 65 20 74   all indexable t
39c0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 63 6c 61  ables in the cla
39d0: 75 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  use */.};../*.**
39e0: 20 41 20 57 68 65 72 65 54 65 72 6d 20 77 69 74   A WhereTerm wit
39f0: 68 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  h eOperator==WO_
3a00: 41 4e 44 20 68 61 73 20 69 74 73 20 75 2e 70 41  AND has its u.pA
3a10: 6e 64 49 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73  ndInfo pointer s
3a20: 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d  et to.** a dynam
3a30: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
3a40: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
3a60: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
3a70: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20  WhereAndInfo {. 
3a80: 20 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b   WhereClause wc;
3a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3aa0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 62   subexpression b
3ab0: 72 6f 6b 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a  roken out */.};.
3ac0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
3ad0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
3ae0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
3af0: 65 70 73 20 74 72 61 63 6b 20 6f 66 20 61 20 6d  eps track of a m
3b00: 61 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65  apping.** betwee
3b10: 6e 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  n VDBE cursor nu
3b20: 6d 62 65 72 73 20 61 6e 64 20 62 69 74 73 20 6f  mbers and bits o
3b30: 66 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 69  f the bitmasks i
3b40: 6e 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  n WhereTerm..**.
3b50: 2a 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  ** The VDBE curs
3b60: 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73  or numbers are s
3b70: 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 63 6f  mall integers co
3b80: 6e 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53  ntained in .** S
3b90: 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75 72  rcList_item.iCur
3ba0: 73 6f 72 20 61 6e 64 20 45 78 70 72 2e 69 54 61  sor and Expr.iTa
3bb0: 62 6c 65 20 66 69 65 6c 64 73 2e 20 20 46 6f 72  ble fields.  For
3bc0: 20 61 6e 79 20 67 69 76 65 6e 20 57 48 45 52 45   any given WHERE
3bd0: 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74 68 65   .** clause, the
3be0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
3bf0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 67 69 6e 20  might not begin 
3c00: 77 69 74 68 20 30 20 61 6e 64 20 74 68 65 79 20  with 0 and they 
3c10: 6d 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  might.** contain
3c20: 20 67 61 70 73 20 69 6e 20 74 68 65 20 6e 75 6d   gaps in the num
3c30: 62 65 72 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  bering sequence.
3c40: 20 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f    But we want to
3c50: 20 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a   make maximum.**
3c60: 20 75 73 65 20 6f 66 20 74 68 65 20 62 69 74 73   use of the bits
3c70: 20 69 6e 20 6f 75 72 20 62 69 74 6d 61 73 6b 73   in our bitmasks
3c80: 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72  .  This structur
3c90: 65 20 70 72 6f 76 69 64 65 73 20 61 20 6d 61 70  e provides a map
3ca0: 70 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  ping.** from the
3cb0: 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e   sparse cursor n
3cc0: 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73  umbers into cons
3cd0: 65 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73  ecutive integers
3ce0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
3cf0: 74 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57  th 0..**.** If W
3d00: 68 65 72 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41  hereMaskSet.ix[A
3d10: 5d 3d 3d 42 20 69 74 20 6d 65 61 6e 73 20 74 68  ]==B it means th
3d20: 61 74 20 54 68 65 20 41 2d 74 68 20 62 69 74 20  at The A-th bit 
3d30: 6f 66 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20  of a Bitmask.** 
3d40: 63 6f 72 72 65 73 70 6f 6e 64 73 20 56 44 42 45  corresponds VDBE
3d50: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 42   cursor number B
3d60: 2e 20 20 54 68 65 20 41 2d 74 68 20 62 69 74 20  .  The A-th bit 
3d70: 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 69 73 20  of a bitmask is 
3d80: 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  1<<A..**.** For 
3d90: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
3da0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
3db0: 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 68 65  ression used the
3dc0: 73 65 20 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f  se VDBE.** curso
3dd0: 72 73 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32 39  rs:  4, 5, 8, 29
3de0: 2c 20 35 37 2c 20 37 33 2e 20 20 54 68 65 6e 20  , 57, 73.  Then 
3df0: 74 68 65 20 20 57 68 65 72 65 4d 61 73 6b 53 65  the  WhereMaskSe
3e00: 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 77  t structure.** w
3e10: 6f 75 6c 64 20 6d 61 70 20 74 68 6f 73 65 20 63  ould map those c
3e20: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
3e30: 74 6f 20 62 69 74 73 20 30 20 74 68 72 6f 75 67  to bits 0 throug
3e40: 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  h 5..**.** Note 
3e50: 74 68 61 74 20 74 68 65 20 6d 61 70 70 69 6e 67  that the mapping
3e60: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
3e70: 69 6c 79 20 6f 72 64 65 72 65 64 2e 20 20 49 6e  ily ordered.  In
3e80: 20 74 68 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20   the example.** 
3e90: 61 62 6f 76 65 2c 20 74 68 65 20 6d 61 70 70 69  above, the mappi
3ea0: 6e 67 20 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65  ng might go like
3eb0: 20 74 68 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d   this:  4->3, 5-
3ec0: 3e 31 2c 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c  >1, 8->2, 29->0,
3ed0: 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34  .** 57->5, 73->4
3ee0: 2e 20 20 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39  .  Or one of 719
3ef0: 20 6f 74 68 65 72 20 63 6f 6d 62 69 6e 61 74 69   other combinati
3f00: 6f 6e 73 20 6d 69 67 68 74 20 62 65 20 75 73 65  ons might be use
3f10: 64 2e 20 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d. It.** does no
3f20: 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e  t really matter.
3f30: 20 20 57 68 61 74 20 69 73 20 69 6d 70 6f 72 74    What is import
3f40: 61 6e 74 20 69 73 20 74 68 61 74 20 73 70 61 72  ant is that spar
3f50: 73 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  se cursor.** num
3f60: 62 65 72 73 20 61 6c 6c 20 67 65 74 20 6d 61 70  bers all get map
3f70: 70 65 64 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d  ped into bit num
3f80: 62 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20  bers that begin 
3f90: 77 69 74 68 20 30 20 61 6e 64 20 63 6f 6e 74 61  with 0 and conta
3fa0: 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a  in.** no gaps..*
3fb0: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4d 61  /.struct WhereMa
3fc0: 73 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b  skSet {.  int n;
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fe0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3ff0: 72 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63 75  r of assigned cu
4000: 72 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20  rsor values */. 
4010: 20 69 6e 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20   int ix[BMS];   
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4030: 2a 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e 65  * Cursor assigne
4040: 64 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a 2f  d to each bit */
4050: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
4060: 6f 62 6a 65 63 74 20 69 73 20 61 20 63 6f 6e 76  object is a conv
4070: 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20  enience wrapper 
4080: 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 69 6e 66 6f  holding all info
4090: 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 0a 2a  rmation needed.*
40a0: 2a 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 57  * to construct W
40b0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
40c0: 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
40d0: 72 20 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 72 75  r query..*/.stru
40e0: 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ct WhereLoopBuil
40f0: 64 65 72 20 7b 0a 20 20 57 68 65 72 65 49 6e 66  der {.  WhereInf
4100: 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
4110: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
4120: 20 61 62 6f 75 74 20 74 68 69 73 20 57 48 45 52   about this WHER
4130: 45 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  E */.  WhereClau
4140: 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
4150: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
4160: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 45 78 70 72   terms */.  Expr
4170: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
4180: 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42        /* ORDER B
4190: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  Y clause */.  Wh
41a0: 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
41b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
41c0: 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  ate WhereLoop */
41d0: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 42  .  WhereLoop *pB
41e0: 65 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  est;         /* 
41f0: 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 73 74 6f  If non-NULL, sto
4200: 72 65 20 73 69 6e 67 6c 65 20 62 65 73 74 20 6c  re single best l
4210: 6f 6f 70 20 68 65 72 65 20 2a 2f 0a 7d 3b 0a 0a  oop here */.};..
4220: 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52 45 20  /*.** The WHERE 
4230: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
4240: 67 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 77  g routine has tw
4250: 6f 20 68 61 6c 76 65 73 2e 20 20 54 68 65 0a 2a  o halves.  The.*
4260: 2a 20 66 69 72 73 74 20 70 61 72 74 20 64 6f 65  * first part doe
4270: 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  s the start of t
4280: 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 20 61 6e  he WHERE loop an
4290: 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  d the second.** 
42a0: 68 61 6c 66 20 64 6f 65 73 20 74 68 65 20 74 61  half does the ta
42b0: 69 6c 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  il of the WHERE 
42c0: 6c 6f 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61 6e  loop.  An instan
42d0: 63 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73 74  ce of.** this st
42e0: 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72  ructure is retur
42f0: 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
4300: 20 68 61 6c 66 20 61 6e 64 20 70 61 73 73 65 64   half and passed
4310: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 63  .** into the sec
4320: 6f 6e 64 20 68 61 6c 66 20 74 6f 20 67 69 76 65  ond half to give
4330: 20 73 6f 6d 65 20 63 6f 6e 74 69 6e 75 69 74 79   some continuity
4340: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ..**.** An insta
4350: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
4360: 63 74 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6d  ct holds the com
4370: 70 6c 65 74 65 20 73 74 61 74 65 20 6f 66 20 74  plete state of t
4380: 68 65 20 71 75 65 72 79 0a 2a 2a 20 70 6c 61 6e  he query.** plan
4390: 6e 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  ner..*/.struct W
43a0: 68 65 72 65 49 6e 66 6f 20 7b 0a 20 20 50 61 72  hereInfo {.  Par
43b0: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
43c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
43d0: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
43e0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
43f0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
4400: 4c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  List;        /* 
4410: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  List of tables i
4420: 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  n the join */.  
4430: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
4440: 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  By;       /* The
4450: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
4460: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
4470: 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
4480: 74 3b 20 20 20 20 20 20 2f 2a 20 44 49 53 54 49  t;      /* DISTI
4490: 4e 43 54 20 4f 4e 20 76 61 6c 75 65 73 2c 20 6f  NCT ON values, o
44a0: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  r NULL */.  Wher
44b0: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 73 3b 20 20  eLoop *pLoops;  
44c0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
44d0: 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
44e0: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 42 69 74 6d  bjects */.  Bitm
44f0: 61 73 6b 20 72 65 76 4d 61 73 6b 3b 20 20 20 20  ask revMask;    
4500: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
4510: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
4520: 74 68 61 74 20 6e 65 65 64 20 72 65 76 65 72 73  that need revers
4530: 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ing */.  WhereCo
4540: 73 74 20 6e 52 6f 77 4f 75 74 3b 20 20 20 20 20  st nRowOut;     
4550: 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
4560: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
4570: 20 72 6f 77 73 20 2a 2f 0a 20 20 75 31 36 20 77   rows */.  u16 w
4580: 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20  ctrlFlags;      
4590: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 6f 72       /* Flags or
45a0: 69 67 69 6e 61 6c 6c 79 20 70 61 73 73 65 64 20  iginally passed 
45b0: 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
45c0: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 75 38 20 62  egin() */.  u8 b
45d0: 4f 42 53 61 74 3b 20 20 20 20 20 20 20 20 20 20  OBSat;          
45e0: 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42        /* ORDER B
45f0: 59 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  Y satisfied by i
4600: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 75 38 20 6f  ndices */.  u8 o
4610: 6b 4f 6e 65 50 61 73 73 3b 20 20 20 20 20 20 20  kOnePass;       
4620: 20 20 20 20 20 20 2f 2a 20 4f 6b 20 74 6f 20 75        /* Ok to u
4630: 73 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f  se one-pass algo
4640: 72 69 74 68 6d 20 66 6f 72 20 55 50 44 41 54 45  rithm for UPDATE
4650: 2f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 75 38 20  /DELETE */.  u8 
4660: 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3b 20 20  untestedTerms;  
4670: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c         /* Not al
4680: 6c 20 57 48 45 52 45 20 74 65 72 6d 73 20 72 65  l WHERE terms re
4690: 73 6f 6c 76 65 64 20 62 79 20 6f 75 74 65 72 20  solved by outer 
46a0: 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38 20 65 44 69  loop */.  u8 eDi
46b0: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
46c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
46d0: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
46e0: 5f 2a 20 76 61 6c 75 65 73 20 62 65 6c 6f 77 20  _* values below 
46f0: 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 70 3b 20 20  */.  int iTop;  
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4710: 2a 20 54 68 65 20 76 65 72 79 20 62 65 67 69 6e  * The very begin
4720: 6e 69 6e 67 20 6f 66 20 74 68 65 20 57 48 45 52  ning of the WHER
4730: 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  E loop */.  int 
4740: 69 43 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20  iContinue;      
4750: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4760: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
4770: 69 74 68 20 6e 65 78 74 20 72 65 63 6f 72 64 20  ith next record 
4780: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 3b  */.  int iBreak;
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
47a0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
47b0: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
47c0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  loop */.  int nL
47d0: 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  evel;           
47e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
47f0: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 2a 2f 0a   nested loop */.
4800: 20 20 69 6e 74 20 73 61 76 65 64 4e 51 75 65 72    int savedNQuer
4810: 79 4c 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20 70  yLoop;      /* p
4820: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
4830: 70 20 6f 75 74 73 69 64 65 20 74 68 65 20 57 48  p outside the WH
4840: 45 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68  ERE loop */.  Wh
4850: 65 72 65 4d 61 73 6b 53 65 74 20 73 4d 61 73 6b  ereMaskSet sMask
4860: 53 65 74 3b 20 20 20 20 2f 2a 20 4d 61 70 20 63  Set;    /* Map c
4870: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f  ursor numbers to
4880: 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 57   bitmasks */.  W
4890: 68 65 72 65 43 6c 61 75 73 65 20 73 57 43 3b 20  hereClause sWC; 
48a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f           /* Deco
48b0: 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65  mposition of the
48c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
48d0: 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 61 5b  .  WhereLevel a[
48e0: 31 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1];          /* 
48f0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
4900: 74 20 65 61 63 68 20 6e 65 73 74 20 6c 6f 6f 70  t each nest loop
4910: 20 69 6e 20 57 48 45 52 45 20 2a 2f 0a 7d 3b 0a   in WHERE */.};.
4920: 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73 20  ./*.** Bitmasks 
4930: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
4940: 73 20 6f 6e 20 57 68 65 72 65 54 65 72 6d 20 6f  s on WhereTerm o
4950: 62 6a 65 63 74 73 2e 20 20 54 68 65 73 65 20 61  bjects.  These a
4960: 72 65 20 61 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  re all.** operat
4970: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 66 20  ors that are of 
4980: 69 6e 74 65 72 65 73 74 20 74 6f 20 74 68 65 20  interest to the 
4990: 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20  query planner.  
49a0: 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62  An.** OR-ed comb
49b0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65  ination of these
49c0: 20 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75   values can be u
49d0: 73 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69  sed when searchi
49e0: 6e 67 20 66 6f 72 0a 2a 2a 20 70 61 72 74 69 63  ng for.** partic
49f0: 75 6c 61 72 20 57 68 65 72 65 54 65 72 6d 73 20  ular WhereTerms 
4a00: 77 69 74 68 69 6e 20 61 20 57 68 65 72 65 43 6c  within a WhereCl
4a10: 61 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ause..*/.#define
4a20: 20 57 4f 5f 49 4e 20 20 20 20 20 30 78 30 30 31   WO_IN     0x001
4a30: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20  .#define WO_EQ  
4a40: 20 20 20 30 78 30 30 32 0a 23 64 65 66 69 6e 65     0x002.#define
4a50: 20 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45   WO_LT     (WO_E
4a60: 51 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29  Q<<(TK_LT-TK_EQ)
4a70: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20  ).#define WO_LE 
4a80: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
4a90: 4c 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  LE-TK_EQ)).#defi
4aa0: 6e 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f  ne WO_GT     (WO
4ab0: 5f 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45  _EQ<<(TK_GT-TK_E
4ac0: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47  Q)).#define WO_G
4ad0: 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  E     (WO_EQ<<(T
4ae0: 4b 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_GE-TK_EQ)).#de
4af0: 66 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20 30  fine WO_MATCH  0
4b00: 78 30 34 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x040.#define WO_
4b10: 49 53 4e 55 4c 4c 20 30 78 30 38 30 0a 23 64 65  ISNULL 0x080.#de
4b20: 66 69 6e 65 20 57 4f 5f 4f 52 20 20 20 20 20 30  fine WO_OR     0
4b30: 78 31 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77  x100       /* Tw
4b40: 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e  o or more OR-con
4b50: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
4b60: 23 64 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20  #define WO_AND  
4b70: 20 20 30 78 32 30 30 20 20 20 20 20 20 20 2f 2a    0x200       /*
4b80: 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44   Two or more AND
4b90: 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
4ba0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45   */.#define WO_E
4bb0: 51 55 49 56 20 20 30 78 34 30 30 20 20 20 20 20  QUIV  0x400     
4bc0: 20 20 2f 2a 20 4f 66 20 74 68 65 20 66 6f 72 6d    /* Of the form
4bd0: 20 41 3d 3d 42 2c 20 62 6f 74 68 20 63 6f 6c 75   A==B, both colu
4be0: 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  mns */.#define W
4bf0: 4f 5f 4e 4f 4f 50 20 20 20 30 78 38 30 30 20 20  O_NOOP   0x800  
4c00: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72       /* This ter
4c10: 6d 20 64 6f 65 73 20 6e 6f 74 20 72 65 73 74 72  m does not restr
4c20: 69 63 74 20 73 65 61 72 63 68 20 73 70 61 63 65  ict search space
4c30: 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 57 4f 5f   */..#define WO_
4c40: 41 4c 4c 20 20 20 20 30 78 66 66 66 20 20 20 20  ALL    0xfff    
4c50: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c     /* Mask of al
4c60: 6c 20 70 6f 73 73 69 62 6c 65 20 57 4f 5f 2a 20  l possible WO_* 
4c70: 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e  values */.#defin
4c80: 65 20 57 4f 5f 53 49 4e 47 4c 45 20 30 78 30 66  e WO_SINGLE 0x0f
4c90: 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  f       /* Mask 
4ca0: 6f 66 20 61 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f  of all non-compo
4cb0: 75 6e 64 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20  und WO_* values 
4cc0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  */../*.** These 
4cd0: 61 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  are definitions 
4ce0: 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 57  of bits in the W
4cf0: 68 65 72 65 4c 6f 6f 70 2e 77 73 46 6c 61 67 73  hereLoop.wsFlags
4d00: 20 66 69 65 6c 64 2e 0a 2a 2a 20 54 68 65 20 70   field..** The p
4d10: 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e  articular combin
4d20: 61 74 69 6f 6e 20 6f 66 20 62 69 74 73 20 69 6e  ation of bits in
4d30: 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 20   each WhereLoop 
4d40: 68 65 6c 70 20 74 6f 0a 2a 2a 20 64 65 74 65 72  help to.** deter
4d50: 6d 69 6e 65 20 74 68 65 20 61 6c 67 6f 72 69 74  mine the algorit
4d60: 68 6d 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f  hm that WhereLoo
4d70: 70 20 72 65 70 72 65 73 65 6e 74 73 2e 0a 2a 2f  p represents..*/
4d80: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
4d90: 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78 30 30  OLUMN_EQ    0x00
4da0: 30 30 30 30 30 31 20 20 2f 2a 20 78 3d 45 58 50  000001  /* x=EXP
4db0: 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20  R or x IN (...) 
4dc0: 6f 72 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a  or x IS NULL */.
4dd0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
4de0: 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30 30  LUMN_RANGE 0x000
4df0: 30 30 30 30 32 20 20 2f 2a 20 78 3c 45 58 50 52  00002  /* x<EXPR
4e00: 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a   and/or x>EXPR *
4e10: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
4e20: 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30  COLUMN_IN    0x0
4e30: 30 30 30 30 30 30 34 20 20 2f 2a 20 78 20 49 4e  0000004  /* x IN
4e40: 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e   (...) */.#defin
4e50: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  e WHERE_COLUMN_N
4e60: 55 4c 4c 20 20 30 78 30 30 30 30 30 30 30 38 20  ULL  0x00000008 
4e70: 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f   /* x IS NULL */
4e80: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
4e90: 4f 4e 53 54 52 41 49 4e 54 20 20 20 30 78 30 30  ONSTRAINT   0x00
4ea0: 30 30 30 30 30 66 20 20 2f 2a 20 41 6e 79 20 6f  00000f  /* Any o
4eb0: 66 20 74 68 65 20 57 48 45 52 45 5f 43 4f 4c 55  f the WHERE_COLU
4ec0: 4d 4e 5f 78 78 78 20 76 61 6c 75 65 73 20 2a 2f  MN_xxx values */
4ed0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54  .#define WHERE_T
4ee0: 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30  OP_LIMIT    0x00
4ef0: 30 30 30 30 31 30 20 20 2f 2a 20 78 3c 45 58 50  000010  /* x<EXP
4f00: 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e  R or x<=EXPR con
4f10: 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69  straint */.#defi
4f20: 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  ne WHERE_BTM_LIM
4f30: 49 54 20 20 20 20 30 78 30 30 30 30 30 30 32 30  IT    0x00000020
4f40: 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78    /* x>EXPR or x
4f50: 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  >=EXPR constrain
4f60: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  t */.#define WHE
4f70: 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20 20  RE_BOTH_LIMIT   
4f80: 30 78 30 30 30 30 30 30 33 30 20 20 2f 2a 20 42  0x00000030  /* B
4f90: 6f 74 68 20 78 3e 45 58 50 52 20 61 6e 64 20 78  oth x>EXPR and x
4fa0: 3c 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  <EXPR */.#define
4fb0: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
4fc0: 20 20 20 20 30 78 30 30 30 30 30 30 34 30 20 20      0x00000040  
4fd0: 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c  /* Use index onl
4fe0: 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a  y - omit table *
4ff0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
5000: 49 50 4b 20 20 20 20 20 20 20 20 20 20 30 78 30  IPK          0x0
5010: 30 30 30 30 31 30 30 20 20 2f 2a 20 78 20 69 73  0000100  /* x is
5020: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
5030: 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65 66  MARY KEY */.#def
5040: 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45 58 45  ine WHERE_INDEXE
5050: 44 20 20 20 20 20 20 30 78 30 30 30 30 30 32 30  D      0x0000020
5060: 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e  0  /* WhereLoop.
5070: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 69  u.btree.pIndex i
5080: 73 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66 69  s valid */.#defi
5090: 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c  ne WHERE_VIRTUAL
50a0: 54 41 42 4c 45 20 30 78 30 30 30 30 30 34 30 30  TABLE 0x00000400
50b0: 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75    /* WhereLoop.u
50c0: 2e 76 74 61 62 20 69 73 20 76 61 6c 69 64 20 2a  .vtab is valid *
50d0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
50e0: 49 4e 5f 41 42 4c 45 20 20 20 20 20 20 30 78 30  IN_ABLE      0x0
50f0: 30 30 30 30 38 30 30 20 20 2f 2a 20 41 62 6c 65  0000800  /* Able
5100: 20 74 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 49   to support an I
5110: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64  N operator */.#d
5120: 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45 52  efine WHERE_ONER
5130: 4f 57 20 20 20 20 20 20 20 30 78 30 30 30 30 31  OW       0x00001
5140: 30 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20  000  /* Selects 
5150: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
5160: 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20   row */.#define 
5170: 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20  WHERE_MULTI_OR  
5180: 20 20 20 30 78 30 30 30 30 32 30 30 30 20 20 2f     0x00002000  /
5190: 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69  * OR using multi
51a0: 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23  ple indices */.#
51b0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 45 4d  define WHERE_TEM
51c0: 50 5f 49 4e 44 45 58 20 20 20 30 78 30 30 30 30  P_INDEX   0x0000
51d0: 34 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e  4000  /* Uses an
51e0: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
51f0: 20 2a 2f 0a 0a 0a 2f 2a 20 43 6f 6e 76 65 72 74   */.../* Convert
5200: 20 61 20 57 68 65 72 65 43 6f 73 74 20 76 61 6c   a WhereCost val
5210: 75 65 20 28 31 30 20 74 69 6d 65 73 20 6c 6f 67  ue (10 times log
5220: 32 28 58 29 29 20 69 6e 74 6f 20 69 74 73 20 69  2(X)) into its i
5230: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 58 2e 0a  nteger value X..
5240: 2a 2a 20 41 20 72 6f 75 67 68 20 61 70 70 72 6f  ** A rough appro
5250: 78 69 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ximation is used
5260: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  .  The value ret
5270: 75 72 6e 65 64 20 69 73 20 6e 6f 74 20 65 78 61  urned is not exa
5280: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36  ct..*/.static u6
5290: 34 20 77 68 65 72 65 43 6f 73 74 54 6f 49 6e 74  4 whereCostToInt
52a0: 28 57 68 65 72 65 43 6f 73 74 20 78 29 7b 0a 20  (WhereCost x){. 
52b0: 20 75 36 34 20 6e 3b 0a 20 20 69 66 28 20 78 3c   u64 n;.  if( x<
52c0: 31 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  10 ) return 1;. 
52d0: 20 6e 20 3d 20 78 25 31 30 3b 0a 20 20 78 20 2f   n = x%10;.  x /
52e0: 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 3e 3d 35  = 10;.  if( n>=5
52f0: 20 29 20 6e 20 2d 3d 20 32 3b 0a 20 20 65 6c 73   ) n -= 2;.  els
5300: 65 20 69 66 28 20 6e 3e 3d 31 20 29 20 6e 20 2d  e if( n>=1 ) n -
5310: 3d 20 31 3b 0a 20 20 69 66 28 20 78 3e 3d 33 20  = 1;.  if( x>=3 
5320: 29 20 72 65 74 75 72 6e 20 28 6e 2b 38 29 3c 3c  ) return (n+8)<<
5330: 28 78 2d 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  (x-3);.  return 
5340: 28 6e 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a 7d 0a  (n+8)>>(3-x);.}.
5350: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5360: 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
5370: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
5380: 73 20 66 72 6f 6d 20 61 20 57 48 45 52 45 20 63  s from a WHERE c
5390: 6c 61 75 73 65 0a 2a 2f 0a 75 36 34 20 73 71 6c  lause.*/.u64 sql
53a0: 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
53b0: 6f 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66  owCount(WhereInf
53c0: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
53d0: 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74 54 6f  turn whereCostTo
53e0: 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  Int(pWInfo->nRow
53f0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Out);.}../*.** R
5400: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65  eturn one of the
5410: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
5420: 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20  xxxxx values to 
5430: 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69  indicate how thi
5440: 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  s.** WHERE claus
5450: 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74  e returns output
5460: 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  s for DISTINCT p
5470: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e  rocessing..*/.in
5480: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  t sqlite3WhereIs
5490: 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e  Distinct(WhereIn
54a0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
54b0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44  eturn pWInfo->eD
54c0: 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  istinct;.}../*.*
54d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
54e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
54f0: 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69  e returns rows i
5500: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  n ORDER BY order
5510: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
5520: 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  E if the output 
5530: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74  needs to be sort
5540: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
5550: 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
5560: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
5570: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
5580: 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30 3b  Info->bOBSat!=0;
5590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
55a0: 20 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73   the VDBE addres
55b0: 73 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75  s or label to ju
55c0: 6d 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74  mp to in order t
55d0: 6f 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d  o continue.** im
55e0: 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68 20 74  mediately with t
55f0: 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61  he next row of a
5600: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
5610: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
5620: 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28  reContinueLabel(
5630: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
5640: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
5650: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
5660: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5670: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
5680: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
5690: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
56a0: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
56b0: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
56c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
56d0: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
56e0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
56f0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
5700: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
5710: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
5720: 66 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  f an UPDATE or D
5730: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
5740: 63 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72 65  can operate dire
5750: 63 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20 72  ctly on.** the r
5760: 6f 77 69 64 73 20 72 65 74 75 72 6e 65 64 20 62  owids returned b
5770: 79 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  y a WHERE clause
5780: 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  .  Return FALSE 
5790: 69 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55  if doing an.** U
57a0: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
57b0: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 73 75 62  might change sub
57c0: 73 65 71 75 65 6e 74 20 57 48 45 52 45 20 63 6c  sequent WHERE cl
57d0: 61 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a 2f  ause results..*/
57e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
57f0: 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72 65  eOkOnePass(Where
5800: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
5810: 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e   return pWInfo->
5820: 6f 6b 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f 2a  okOnePass;.}../*
5830: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
5840: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68   preallocated Wh
5850: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
5860: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
5870: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49  oid whereClauseI
5880: 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75  nit(.  WhereClau
5890: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
58a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  /* The WhereClau
58b0: 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c  se to be initial
58c0: 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 49  ized */.  WhereI
58d0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20 20  nfo *pWInfo     
58e0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
58f0: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
5900: 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e  xt */.){.  pWC->
5910: 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b  pWInfo = pWInfo;
5920: 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20 3d  .  pWC->pOuter =
5930: 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d   0;.  pWC->nTerm
5940: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c   = 0;.  pWC->nSl
5950: 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70  ot = ArraySize(p
5960: 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20  WC->aStatic);.  
5970: 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53  pWC->a = pWC->aS
5980: 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  tatic;.}../* For
5990: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
59a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
59b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57  ereClauseClear(W
59c0: 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f  hereClause*);../
59d0: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
59e0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
59f0: 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65  iated with a Whe
5a00: 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  reOrInfo object.
5a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a20: 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74  whereOrInfoDelet
5a30: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
5a40: 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a  hereOrInfo *p){.
5a50: 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
5a60: 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71  ar(&p->wc);.  sq
5a70: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5a80: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  p);.}../*.** Dea
5a90: 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f  llocate all memo
5aa0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
5ab0: 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e 66  th a WhereAndInf
5ac0: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  o object..*/.sta
5ad0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41 6e  tic void whereAn
5ae0: 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69  dInfoDelete(sqli
5af0: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41 6e  te3 *db, WhereAn
5b00: 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65  dInfo *p){.  whe
5b10: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
5b20: 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->wc);.  sqlite3
5b30: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
5b40: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
5b50: 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  te a WhereClause
5b60: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
5b70: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
5b80: 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66  ucture.** itself
5b90: 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20   is not freed.  
5ba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5bb0: 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77  the inverse of w
5bc0: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29  hereClauseInit()
5bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5be0: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
5bf0: 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  r(WhereClause *p
5c00: 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  WC){.  int i;.  
5c10: 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20  WhereTerm *a;.  
5c20: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
5c30: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
5c40: 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70  e->db;.  for(i=p
5c50: 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70  WC->nTerm-1, a=p
5c60: 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  WC->a; i>=0; i--
5c70: 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , a++){.    if( 
5c80: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
5c90: 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  M_DYNAMIC ){.   
5ca0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5cb0: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70  lete(db, a->pExp
5cc0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
5cd0: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
5ce0: 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20  ERM_ORINFO ){.  
5cf0: 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44      whereOrInfoD
5d00: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
5d10: 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c  OrInfo);.    }el
5d20: 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67  se if( a->wtFlag
5d30: 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  s & TERM_ANDINFO
5d40: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41   ){.      whereA
5d50: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c  ndInfoDelete(db,
5d60: 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b   a->u.pAndInfo);
5d70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5d80: 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53   pWC->a!=pWC->aS
5d90: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c  tatic ){.    sql
5da0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5db0: 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  WC->a);.  }.}../
5dc0: 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
5dd0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
5de0: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68 65  entry to the Whe
5df0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
5e00: 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20  pWC..** The new 
5e10: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
5e20: 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20   is constructed 
5e30: 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20  from Expr p and 
5e40: 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a  with wtFlags..**
5e50: 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57   The index in pW
5e60: 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65  C->a[] of the ne
5e70: 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20 72  w WhereTerm is r
5e80: 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
5e90: 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75  ss..** 0 is retu
5ea0: 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77 20  rned if the new 
5eb0: 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20  WhereTerm could 
5ec0: 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75 65  not be added due
5ed0: 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20   to a memory.** 
5ee0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
5ef0: 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c  .  The memory al
5f00: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
5f10: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65   will be recorde
5f20: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e  d in.** the db->
5f30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
5f40: 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65 72  g so that higher
5f50: 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73  -level functions
5f60: 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a   can detect it..
5f70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5f80: 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ne will increase
5f90: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
5fa0: 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20   pWC->a[] array 
5fb0: 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
5fc0: 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61  .** If the wtFla
5fd0: 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c  gs argument incl
5fe0: 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49  udes TERM_DYNAMI
5ff0: 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69  C, then responsi
6000: 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72  bility.** for fr
6010: 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73  eeing the expres
6020: 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65  sion p is assume
6030: 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c  d by the WhereCl
6040: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
6050: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75 65  .** This is true
6060: 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f   even if this ro
6070: 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61  utine fails to a
6080: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
6090: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57  ereTerm..**.** W
60a0: 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f  ARNING:  This ro
60b0: 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c  utine might real
60c0: 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65  locate the space
60d0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
60e0: 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41  * WhereTerms.  A
60f0: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57  ll pointers to W
6100: 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64  hereTerms should
6110: 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
6120: 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67  after.** calling
6130: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
6140: 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61  Such pointers ma
6150: 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a  y be reinitializ
6160: 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e  ed by referencin
6170: 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b  g.** the pWC->a[
6180: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
6190: 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75  ic int whereClau
61a0: 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c  seInsert(WhereCl
61b0: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
61c0: 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b  *p, u8 wtFlags){
61d0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
61e0: 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  erm;.  int idx;.
61f0: 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46 6c    testcase( wtFl
6200: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
6210: 41 4c 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d  AL );  /* EV: R-
6220: 30 30 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20  00211-15100 */. 
6230: 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e   if( pWC->nTerm>
6240: 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20  =pWC->nSlot ){. 
6250: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
6260: 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20  ld = pWC->a;.   
6270: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
6280: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
6290: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d  se->db;.    pWC-
62a0: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
62b0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
62c0: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57  of(pWC->a[0])*pW
62d0: 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20  C->nSlot*2 );.  
62e0: 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20    if( pWC->a==0 
62f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74 46  ){.      if( wtF
6300: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
6310: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73  MIC ){.        s
6320: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6330: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d  (db, p);.      }
6340: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  .      pWC->a = 
6350: 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74 75  pOld;.      retu
6360: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
6370: 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70  memcpy(pWC->a, p
6380: 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  Old, sizeof(pWC-
6390: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72  >a[0])*pWC->nTer
63a0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  m);.    if( pOld
63b0: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
63c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
63d0: 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b  bFree(db, pOld);
63e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e  .    }.    pWC->
63f0: 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33 44  nSlot = sqlite3D
6400: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
6410: 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70  pWC->a)/sizeof(p
6420: 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20  WC->a[0]);.  }. 
6430: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
6440: 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72  [idx = pWC->nTer
6450: 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70  m++];.  pTerm->p
6460: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
6470: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 29  prSkipCollate(p)
6480: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  ;.  pTerm->wtFla
6490: 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20  gs = wtFlags;.  
64a0: 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43  pTerm->pWC = pWC
64b0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
64c0: 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  nt = -1;.  retur
64d0: 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n idx;.}../*.** 
64e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65  This routine ide
64f0: 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65  ntifies subexpre
6500: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48  ssions in the WH
6510: 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65  ERE clause where
6520: 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72  .** each subexpr
6530: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
6540: 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f  ted by the AND o
6550: 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20  perator or some 
6560: 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f  other.** operato
6570: 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
6580: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
6590: 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73    The WhereClaus
65a0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
65b0: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f  s filled with po
65c0: 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70  inters to subexp
65d0: 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65  ressions.  For e
65e0: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
65f0: 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c   WHERE  a=='hell
6600: 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28  o' AND coalesce(
6610: 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b  b,11)<10 AND (c+
6620: 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a  12!=d OR c==22).
6630: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f  **           \__
6640: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f  ______/     \___
6650: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  ____________/   
6660: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
6670: 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
6680: 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20     slot[0]      
6690: 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20        slot[1]   
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
66b0: 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  [2].**.** The or
66c0: 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  iginal WHERE cla
66d0: 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20  use in pExpr is 
66e0: 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20  unaltered.  All 
66f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
6700: 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f  does is make slo
6710: 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e  t[] entries poin
6720: 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72  t to substructur
6730: 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a  e within pExpr..
6740: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65  **.** In the pre
6750: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61  vious sentence a
6760: 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  nd in the diagra
6770: 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65  m, "slot[]" refe
6780: 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65  rs to.** the Whe
6790: 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72  reClause.a[] arr
67a0: 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20  ay.  The slot[] 
67b0: 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e  array grows as n
67c0: 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  eeded to contain
67d0: 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  .** all terms of
67e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
67f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
6800: 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68 65  d whereSplit(Whe
6810: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
6820: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
6830: 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d  op){.  pWC->op =
6840: 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20 70   (u8)op;.  if( p
6850: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
6860: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
6870: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65  p!=op ){.    whe
6880: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
6890: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  WC, pExpr, 0);. 
68a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72   }else{.    wher
68b0: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
68c0: 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20  r->pLeft, op);. 
68d0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
68e0: 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  C, pExpr->pRight
68f0: 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , op);.  }.}../*
6900: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
6910: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62   WhereMaskSet ob
6920: 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ject.*/.#define 
6930: 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20  initMaskSet(P)  
6940: 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20  (P)->n=0../*.** 
6950: 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61  Return the bitma
6960: 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  sk for the given
6970: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20   cursor number. 
6980: 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20   Return 0 if.** 
6990: 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69  iCursor is not i
69a0: 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74  n the set..*/.st
69b0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74  atic Bitmask get
69c0: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
69d0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
69e0: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74   iCursor){.  int
69f0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   i;.  assert( pM
6a00: 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29  askSet->n<=(int)
6a10: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
6a20: 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  8 );.  for(i=0; 
6a30: 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69  i<pMaskSet->n; i
6a40: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61  ++){.    if( pMa
6a50: 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43  skSet->ix[i]==iC
6a60: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72  ursor ){.      r
6a70: 65 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29  eturn MASKBIT(i)
6a80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6a90: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
6aa0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61   Create a new ma
6ab0: 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43  sk for cursor iC
6ac0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
6ad0: 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72  re is one cursor
6ae0: 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68   per table in th
6af0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
6b00: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  The number of.**
6b10: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
6b20: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
6b30: 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20  mited by a test 
6b40: 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20  early in the.** 
6b50: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
6b60: 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f  n() routine.  So
6b70: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
6b80: 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d  e pMaskSet->ix[]
6b90: 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e  .** array will n
6ba0: 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a  ever overflow..*
6bb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
6bc0: 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61  eateMask(WhereMa
6bd0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
6be0: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
6bf0: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
6c00: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
6c10: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
6c20: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
6c30: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
6c40: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
6c50: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
6c60: 65 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76  e walk (recursiv
6c70: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
6c80: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
6c90: 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61  rates.** a bitma
6ca0: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
6cb0: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
6cc0: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
6cd0: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
6ce0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
6cf0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
6d00: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
6d10: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
6d20: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
6d30: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
6d40: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
6d50: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61  *, Select*);.sta
6d60: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
6d70: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
6d80: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
6d90: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42  t, Expr *p){.  B
6da0: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
6db0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
6dc0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
6dd0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
6de0: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74  {.    mask = get
6df0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
6e00: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72  ->iTable);.    r
6e10: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a  eturn mask;.  }.
6e20: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62    mask = exprTab
6e30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
6e40: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
6e50: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
6e60: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
6e70: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66   p->pLeft);.  if
6e80: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6e90: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
6ea0: 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  t) ){.    mask |
6eb0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
6ec0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
6ed0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
6ee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73    }else{.    mas
6ef0: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
6f00: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
6f10: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
6f20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
6f30: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
6f40: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
6f50: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
6f60: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
6f70: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
6f80: 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61    int i;.  Bitma
6f90: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
6fa0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
6fb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
6fc0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
6fd0: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
6fe0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
6ff0: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
7000: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
7010: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
7020: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
7030: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
7040: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
7050: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
7060: 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20   Select *pS){.  
7070: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
7080: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b  ;.  while( pS ){
7090: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
70a0: 72 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  rc = pS->pSrc;. 
70b0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
70c0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
70d0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69  askSet, pS->pELi
70e0: 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  st);.    mask |=
70f0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
7100: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
7110: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
7120: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
7130: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
7140: 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72  kSet, pS->pOrder
7150: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
7160: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
7170: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57  pMaskSet, pS->pW
7180: 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20  here);.    mask 
7190: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
71a0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
71b0: 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66  pHaving);.    if
71c0: 28 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30  ( ALWAYS(pSrc!=0
71d0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
71e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
71f0: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
7200: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73  ++){.        mas
7210: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
7220: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
7230: 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  et, pSrc->a[i].p
7240: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
7250: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
7260: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
7270: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e  , pSrc->a[i].pOn
7280: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7290: 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50  .    pS = pS->pP
72a0: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rior;.  }.  retu
72b0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn mask;.}../*.*
72c0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
72d0: 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61   the given opera
72e0: 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  tor is one of th
72f0: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
7300: 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66   is.** allowed f
7310: 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20  or an indexable 
7320: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
7330: 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20  m.  The allowed 
7340: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
7350: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20   "=", "<", ">", 
7360: 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22  "<=", ">=", "IN"
7370: 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a  , and "IS NULL".
7380: 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  **.** IMPLEMENTA
7390: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 39 39 32 36  TION-OF: R-59926
73a0: 2d 32 36 33 39 33 20 54 6f 20 62 65 20 75 73 61  -26393 To be usa
73b0: 62 6c 65 20 62 79 20 61 6e 20 69 6e 64 65 78 20  ble by an index 
73c0: 61 20 74 65 72 6d 20 6d 75 73 74 20 62 65 0a 2a  a term must be.*
73d0: 2a 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * of one of the 
73e0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
73f0: 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 65 73   column = expres
7400: 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3e 20 65 78  sion column > ex
7410: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75  pression.** colu
7420: 6d 6e 20 3e 3d 20 65 78 70 72 65 73 73 69 6f 6e  mn >= expression
7430: 20 63 6f 6c 75 6d 6e 20 3c 20 65 78 70 72 65 73   column < expres
7440: 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65  sion column <= e
7450: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 78 70  xpression.** exp
7460: 72 65 73 73 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e  ression = column
7470: 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 20 63 6f   expression > co
7480: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
7490: 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70  >= column.** exp
74a0: 72 65 73 73 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e  ression < column
74b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 3d 20 63   expression <= c
74c0: 6f 6c 75 6d 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a  olumn column IN.
74d0: 2a 2a 20 28 65 78 70 72 65 73 73 69 6f 6e 2d 6c  ** (expression-l
74e0: 69 73 74 29 20 63 6f 6c 75 6d 6e 20 49 4e 20 28  ist) column IN (
74f0: 73 75 62 71 75 65 72 79 29 20 63 6f 6c 75 6d 6e  subquery) column
7500: 20 49 53 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74   IS NULL.*/.stat
7510: 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70  ic int allowedOp
7520: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65  (int op){.  asse
7530: 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20  rt( TK_GT>TK_EQ 
7540: 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29  && TK_GT<TK_GE )
7550: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
7560: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54  T>TK_EQ && TK_LT
7570: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
7580: 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20  rt( TK_LE>TK_EQ 
7590: 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29  && TK_LE<TK_GE )
75a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  ;.  assert( TK_G
75b0: 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20  E==TK_EQ+4 );.  
75c0: 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e  return op==TK_IN
75d0: 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26   || (op>=TK_EQ &
75e0: 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20  & op<=TK_GE) || 
75f0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d  op==TK_ISNULL;.}
7600: 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f  ../*.** Swap two
7610: 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65   objects of type
7620: 20 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e   TYPE..*/.#defin
7630: 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29  e SWAP(TYPE,A,B)
7640: 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b   {TYPE t=A; A=B;
7650: 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   B=t;}../*.** Co
7660: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
7670: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78  on operator.  Ex
7680: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
7690: 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a   form "X op Y".*
76a0: 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  * are converted 
76b0: 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a  into "Y op X"..*
76c0: 2a 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67  *.** If left/rig
76d0: 68 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75  ht precedence ru
76e0: 6c 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c  les come into pl
76f0: 61 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e  ay when determin
7700: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61  ing the.** colla
7710: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 74  ting sequence, t
7720: 68 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  hen COLLATE oper
7730: 61 74 6f 72 73 20 61 72 65 20 61 64 6a 75 73 74  ators are adjust
7740: 65 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20  ed to ensure.** 
7750: 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69  that the collati
7760: 6e 67 20 73 65 71 75 65 6e 63 65 20 64 6f 65 73  ng sequence does
7770: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20 46 6f   not change.  Fo
7780: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59  r example:.** "Y
7790: 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20   collate NOCASE 
77a0: 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 22 58  op X" becomes "X
77b0: 20 6f 70 20 59 22 20 62 65 63 61 75 73 65 20 61   op Y" because a
77c0: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
77d0: 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  uence on.** the 
77e0: 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  left hand side o
77f0: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
7800: 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c  verrides any col
7810: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
7820: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
7830: 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74  the right. For t
7840: 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74  he same reason t
7850: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
7860: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
7870: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
7880: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
7890: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
78a0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
78b0: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
78c0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
78d0: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
78e0: 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65  te);.  u16 expLe
78f0: 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  ft = (pExpr->pLe
7900: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  ft->flags & EP_C
7910: 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72  ollate);.  asser
7920: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
7930: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
7940: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
7950: 20 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65   if( expRight==e
7960: 78 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a  xpLeft ){.    /*
7970: 20 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20   Either X and Y 
7980: 62 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54  both have COLLAT
7990: 45 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65  E operator or ne
79a0: 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20  ither do */.    
79b0: 69 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a  if( expRight ){.
79c0: 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20        /* Both X 
79d0: 61 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41  and Y have COLLA
79e0: 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d  TE operators.  M
79f0: 61 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c  ake sure X is al
7a00: 77 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ways.      ** us
7a10: 65 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ed by clearing t
7a20: 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c  he EP_Collate fl
7a30: 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20  ag from Y. */.  
7a40: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
7a50: 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f  t->flags &= ~EP_
7a60: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c  Collate;.    }el
7a70: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  se if( sqlite3Ex
7a80: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
7a90: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  , pExpr->pLeft)!
7aa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  =0 ){.      /* N
7ab0: 65 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68  either X nor Y h
7ac0: 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ave COLLATE oper
7ad0: 61 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73  ators, but X has
7ae0: 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20   a non-default. 
7af0: 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e       ** collatin
7b00: 67 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20  g sequence.  So 
7b10: 61 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61  add the EP_Colla
7b20: 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74  te marker on X t
7b30: 6f 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  o cause.      **
7b40: 20 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68   it to be search
7b50: 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20  ed first. */.   
7b60: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d     pExpr->pLeft-
7b70: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c  >flags |= EP_Col
7b80: 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  late;.    }.  }.
7b90: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
7ba0: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
7bb0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
7bc0: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
7bd0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7be0: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
7bf0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
7c00: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
7c10: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
7c20: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
7c30: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
7c40: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
7c50: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
7c60: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
7c70: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
7c80: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
7c90: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
7ca0: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
7cb0: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
7cc0: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
7cd0: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
7ce0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  sk..*/.static u1
7cf0: 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  6 operatorMask(i
7d00: 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b  nt op){.  u16 c;
7d10: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
7d20: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
7d30: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
7d40: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
7d50: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
7d60: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
7d70: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
7d80: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
7d90: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
7da0: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
7db0: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
7dc0: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
7dd0: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
7de0: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
7df0: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
7e00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
7e10: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
7e20: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
7e30: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
7e40: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
7e50: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
7e60: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
7e70: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
7e80: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
7e90: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
7ea0: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
7eb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
7ec0: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
7ed0: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
7ee0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
7ef0: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57  ce to the next W
7f00: 68 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61  hereTerm that ma
7f10: 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20  tches according 
7f20: 74 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  to the criteria.
7f30: 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77  ** established w
7f40: 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62  hen the pScan ob
7f50: 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c  ject was initial
7f60: 69 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61  ized by whereSca
7f70: 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75  nInit()..** Retu
7f80: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  rn NULL if there
7f90: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74   are no more mat
7fa0: 63 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73  ching WhereTerms
7fb0: 2e 0a 2a 2f 0a 57 68 65 72 65 54 65 72 6d 20 2a  ..*/.WhereTerm *
7fc0: 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68  whereScanNext(Wh
7fd0: 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b  ereScan *pScan){
7fe0: 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
7ff0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8000: 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ursor on the LHS
8010: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a   of the term */.
8020: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20    int iColumn;  
8030: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
8040: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20  lumn on the LHS 
8050: 6f 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31  of the term.  -1
8060: 20 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78   for IPK */.  Ex
8070: 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
8080: 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73     /* An express
8090: 69 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64  ion being tested
80a0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
80b0: 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68  e *pWC;    /* Sh
80c0: 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61  orthand for pSca
80d0: 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72  n->pWC */.  Wher
80e0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
80f0: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69   /* The term bei
8100: 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69  ng tested */.  i
8110: 6e 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b  nt k = pScan->k;
8120: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
8130: 73 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a  start scanning *
8140: 2f 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61  /..  while( pSca
8150: 6e 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e  n->iEquiv<=pScan
8160: 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20  ->nEquiv ){.    
8170: 69 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45  iCur = pScan->aE
8180: 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75  quiv[pScan->iEqu
8190: 69 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75  iv-2];.    iColu
81a0: 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75  mn = pScan->aEqu
81b0: 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  iv[pScan->iEquiv
81c0: 2d 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  -1];.    while( 
81d0: 28 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  (pWC = pScan->pW
81e0: 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  C)!=0 ){.      f
81f0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b  or(pTerm=pWC->a+
8200: 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  k; k<pWC->nTerm;
8210: 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k++, pTerm++){.
8220: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
8230: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
8240: 43 75 72 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e  Cur && pTerm->u.
8250: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
8260: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
8270: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
8280: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49  erator & WO_EQUI
8290: 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  V)!=0.          
82a0: 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69   && pScan->nEqui
82b0: 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63 61  v<ArraySize(pSca
82c0: 6e 2d 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20  n->aEquiv).     
82d0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
82e0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
82f0: 20 20 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69         pX = sqli
8300: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
8310: 74 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  te(pTerm->pExpr-
8320: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
8330: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
8340: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
8350: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
8360: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d  or(j=0; j<pScan-
8370: 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a  >nEquiv; j+=2){.
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8390: 28 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ( pScan->aEquiv[
83a0: 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20  j]==pX->iTable. 
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
83c0: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
83d0: 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e  +1]==pX->iColumn
83e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
83f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8400: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8410: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8420: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53         if( j==pS
8430: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20  can->nEquiv ){. 
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
8450: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20  an->aEquiv[j] = 
8460: 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
8470: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
8480: 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70  >aEquiv[j+1] = p
8490: 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  X->iColumn;.    
84a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
84b0: 3e 6e 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20  >nEquiv += 2;.  
84c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
84d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
84e0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
84f0: 70 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d  perator & pScan-
8500: 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20  >opMask)!=0 ){. 
8510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
8520: 72 69 66 79 20 74 68 65 20 61 66 66 69 6e 69 74  rify the affinit
8530: 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  y and collating 
8540: 73 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a  sequence match *
8550: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
8560: 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61  ( pScan->zCollNa
8570: 6d 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f  me && (pTerm->eO
8580: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
8590: 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
85a0: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
85b0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
85c0: 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50         Parse *pP
85d0: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e  arse = pWC->pWIn
85e0: 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  fo->pParse;.    
85f0: 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 70            pX = p
8600: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
8610: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
8620: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
8630: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e  nityOk(pX, pScan
8640: 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20  ->idxaff) ){.   
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
8660: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
8670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8680: 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e       assert(pX->
8690: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
86a0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
86b0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
86c0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
86d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8700: 20 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70      pX->pLeft, p
8710: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
8720: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
8730: 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
8740: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
8750: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
8760: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8770: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
8780: 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43  zName, pScan->zC
8790: 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ollName) ){.    
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
87b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
87c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
87d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
87e0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
87f0: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d  rator & WO_EQ)!=
8800: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  0.             &
8810: 26 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  & (pX = pTerm->p
8820: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f  Expr->pRight)->o
8830: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
8840: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d            && pX-
8850: 3e 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e  >iTable==pScan->
8860: 61 45 71 75 69 76 5b 30 5d 0a 20 20 20 20 20 20  aEquiv[0].      
8870: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43         && pX->iC
8880: 6f 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45  olumn==pScan->aE
8890: 71 75 69 76 5b 31 5d 0a 20 20 20 20 20 20 20 20  quiv[1].        
88a0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
88b0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
88c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
88d0: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
88e0: 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20  k = k+1;.       
88f0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72       return pTer
8900: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  m;.          }. 
8910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8920: 0a 20 20 20 20 20 20 70 57 43 20 3d 20 70 53 63  .      pWC = pSc
8930: 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d  an->pWC = pScan-
8940: 3e 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20  >pWC->pOuter;.  
8950: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d      k = 0;.    }
8960: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20  .    pScan->pWC 
8970: 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43  = pScan->pOrigWC
8980: 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20  ;.    k = 0;.   
8990: 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b   pScan->iEquiv +
89a0: 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 2;.  }.  retur
89b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
89c0: 69 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45  itialize a WHERE
89d0: 20 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20   clause scanner 
89e0: 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20  object.  Return 
89f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8a00: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e  .** first match.
8a10: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
8a20: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61   there are no ma
8a30: 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tches..**.** The
8a40: 20 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65   scanner will be
8a50: 20 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57   searching the W
8a60: 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e  HERE clause pWC.
8a70: 20 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a    It will look.*
8a80: 2a 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74  * for terms of t
8a90: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
8aa0: 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20  <expr>" where X 
8ab0: 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d  is column iColum
8ac0: 6e 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43  n of table.** iC
8ad0: 75 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75  ur.  The <op> mu
8ae0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  st be one of the
8af0: 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72   operators descr
8b00: 69 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a  ibed by opMask..
8b10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61  **.** If the sea
8b20: 72 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64  rch is for X and
8b30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
8b40: 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73  e contains terms
8b50: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
8b60: 58 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f  X=Y then this ro
8b70: 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f  utine might also
8b80: 20 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66   return terms of
8b90: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20   the form.** "Y 
8ba0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54  <op> <expr>".  T
8bb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  he number of lev
8bc0: 65 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76  els of transitiv
8bd0: 69 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a  ity is limited,.
8be0: 2a 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68  ** but is enough
8bf0: 20 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20   to handle most 
8c00: 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69  commonly occurri
8c10: 6e 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ng SQL statement
8c20: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73  s..**.** If X is
8c30: 20 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52   not the INTEGER
8c40: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65   PRIMARY KEY the
8c50: 6e 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70  n X must be comp
8c60: 61 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69  atible with.** i
8c70: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 57 68  ndex pIdx..*/.Wh
8c80: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
8c90: 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53  anInit(.  WhereS
8ca0: 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20  can *pScan,     
8cb0: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63    /* The WhereSc
8cc0: 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  an object being 
8cd0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
8ce0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
8cf0: 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C,       /* The 
8d00: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
8d10: 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
8d20: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
8d30: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
8d40: 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  r to scan for */
8d50: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
8d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
8d70: 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72  lumn to scan for
8d80: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b   */.  u32 opMask
8d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
8da0: 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20   Operator(s) to 
8db0: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e  scan for */.  In
8dc0: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
8dd0: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
8de0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
8df0: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29   this index */.)
8e00: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a  {.  int j;..  /*
8e10: 20 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30   memset(pScan, 0
8e20: 2c 20 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29  , sizeof(*pScan)
8e30: 29 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70  ); */.  pScan->p
8e40: 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20  OrigWC = pWC;.  
8e50: 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43  pScan->pWC = pWC
8e60: 3b 0a 20 20 69 66 28 20 70 49 64 78 20 26 26 20  ;.  if( pIdx && 
8e70: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
8e80: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
8e90: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
8ea0: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
8eb0: 66 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28  finity;.    for(
8ec0: 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c  j=0; pIdx->aiCol
8ed0: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
8ee0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
8ef0: 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e   NEVER(j>=pIdx->
8f00: 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72  nColumn) ) retur
8f10: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
8f20: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
8f30: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  = pIdx->azColl[j
8f40: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
8f50: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
8f60: 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43  0;.    pScan->zC
8f70: 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ollName = 0;.  }
8f80: 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b  .  pScan->opMask
8f90: 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63   = opMask;.  pSc
8fa0: 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63  an->k = 0;.  pSc
8fb0: 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20  an->aEquiv[0] = 
8fc0: 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61  iCur;.  pScan->a
8fd0: 45 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75  Equiv[1] = iColu
8fe0: 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71  mn;.  pScan->nEq
8ff0: 75 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e  uiv = 2;.  pScan
9000: 2d 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->iEquiv = 2;.  
9010: 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e  return whereScan
9020: 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a  Next(pScan);.}..
9030: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
9040: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
9050: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
9060: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
9070: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
9080: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
9090: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
90a0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
90b0: 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20  e iCur and <op> 
90c0: 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65  is one of.** the
90d0: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
90e0: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
90f0: 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  by the op parame
9100: 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ter..** Return a
9110: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
9120: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
9130: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
9140: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74  .** The term ret
9150: 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59  urned might by Y
9160: 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65  =<expr> if there
9170: 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73   is another cons
9180: 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  traint in.** the
9190: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
91a0: 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61  at specifies tha
91b0: 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68  t X=Y.  Any such
91c0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c   constraints wil
91d0: 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69  l be.** identifi
91e0: 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55  ed by the WO_EQU
91f0: 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54  IV bit in the pT
9200: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66  erm->eOperator f
9210: 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45  ield.  The.** aE
9220: 71 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c  quiv[] array hol
9230: 64 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73  ds X and all its
9240: 20 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69   equivalents, wi
9250: 74 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69  th each SQL vari
9260: 61 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75  able.** taking u
9270: 70 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61  p two slots in a
9280: 45 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69  Equiv[].  The fi
9290: 72 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20  rst slot is for 
92a0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
92b0: 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63  r.** and the sec
92c0: 6f 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63  ond is for the c
92d0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54  olumn number.  T
92e0: 68 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74  here are 22 slot
92f0: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a  s in aEquiv[].**
9300: 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77   so that means w
9310: 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58  e can look for X
9320: 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f   plus up to 10 o
9330: 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ther equivalent 
9340: 76 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65  values..** Hence
9350: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20   a search for X 
9360: 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70  will return <exp
9370: 72 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41  r> if X=A1 and A
9380: 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a  1=A2 and A2=A3.*
9390: 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39  * and ... and A9
93a0: 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78  =A10 and A10=<ex
93b0: 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pr>..**.** If th
93c0: 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65  ere are multiple
93d0: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
93e0: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
93f0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
9400: 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74  expr>".** then t
9410: 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77  ry for the one w
9420: 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63  ith no dependenc
9430: 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20  ies on <expr> - 
9440: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77  in other words w
9450: 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69  here.** <expr> i
9460: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  s a constant exp
9470: 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20  ression of some 
9480: 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75  kind.  Only retu
9490: 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a  rn entries of.**
94a0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
94b0: 3e 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20  > Y" where Y is 
94c0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74  a column in anot
94d0: 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20  her table if no 
94e0: 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20  terms of.** the 
94f0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f  form "X <op> <co
9500: 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74  nst-expr>" exist
9510: 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20  .   If no terms 
9520: 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
9530: 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72  RHS.** exist, tr
9540: 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65  y to return a te
9550: 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  rm that does not
9560: 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a   use WO_EQUIV..*
9570: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
9580: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
9590: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
95a0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
95b0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
95c0: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
95d0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
95e0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
95f0: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
9600: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
9610: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
9620: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
9630: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
9640: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
9650: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
9660: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
9670: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20   */.  u32 op,   
9680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
9690: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
96a0: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
96b0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
96c0: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
96d0: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
96e0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
96f0: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
9700: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
9710: 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74  ereTerm *pResult
9720: 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72   = 0;.  WhereTer
9730: 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61  m *p;.  WhereSca
9740: 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77  n scan;..  p = w
9750: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
9760: 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69  an, pWC, iCur, i
9770: 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78  Column, op, pIdx
9780: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
9790: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
97a0: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
97b0: 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ady)==0 ){.     
97c0: 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69   if( p->prereqRi
97d0: 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f  ght==0 && (p->eO
97e0: 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d  perator&WO_EQ)!=
97f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
9800: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
9810: 20 20 20 20 20 69 66 28 20 70 52 65 73 75 6c 74       if( pResult
9820: 3d 3d 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20  ==0 ) pResult = 
9830: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  p;.    }.    p =
9840: 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
9850: 73 63 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  scan);.  }.  ret
9860: 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a  urn pResult;.}..
9870: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
9880: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
9890: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
98a0: 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43  SrcList*, WhereC
98b0: 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  lause*, int);../
98c0: 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e  *.** Call exprAn
98d0: 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72  alyze on all ter
98e0: 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  ms in a WHERE cl
98f0: 61 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  ause.  .*/.stati
9900: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
9910: 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74  zeAll(.  SrcList
9920: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
9930: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
9940: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
9950: 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20  lause *pWC      
9960: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
9970: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61  clause to be ana
9980: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lyzed */.){.  in
9990: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  t i;.  for(i=pWC
99a0: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
99b0: 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41   i--){.    exprA
99c0: 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c  nalyze(pTabList,
99d0: 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a   pWC, i);.  }.}.
99e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
99f0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
9a00: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65  ZATION./*.** Che
9a10: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
9a20: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
9a30: 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47  n is a LIKE or G
9a40: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61  LOB operator tha
9a50: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69  t.** can be opti
9a60: 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71  mized using ineq
9a70: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
9a80: 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ts.  Return TRUE
9a90: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20   if it is.** so 
9aa0: 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
9ab0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
9ac0: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
9ad0: 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69  r to be optimizi
9ae0: 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73  ble, the RHS mus
9af0: 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a  t be a string.**
9b00: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f   literal that do
9b10: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
9b20: 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a  h a wildcard.  .
9b30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
9b40: 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61  LikeOrGlob(.  Pa
9b50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9b60: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
9b70: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
9b80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9b90: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
9ba0: 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65   Test this expre
9bb0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ssion */.  Expr 
9bc0: 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20  **ppPrefix,  /* 
9bd0: 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54  Pointer to TK_ST
9be0: 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  RING expression 
9bf0: 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65  with pattern pre
9c00: 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  fix */.  int *pi
9c10: 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72  sComplete, /* Tr
9c20: 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77  ue if the only w
9c30: 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20  ildcard is % in 
9c40: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
9c50: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f  er */.  int *pno
9c60: 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75  Case      /* Tru
9c70: 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69  e if uppercase i
9c80: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
9c90: 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a  lowercase */.){.
9ca0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
9cb0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
9cc0: 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66  String on RHS of
9cd0: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
9ce0: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
9cf0: 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f  , *pLeft;      /
9d00: 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74  * Right and left
9d10: 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70   size of LIKE op
9d20: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72  erator */.  Expr
9d30: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
9d40: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
9d50: 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68  f operands to th
9d60: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
9d70: 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20  */.  int c;     
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72  /* One character
9da0: 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74   in z[] */.  int
9db0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
9dc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9dd0: 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72  r of non-wildcar
9de0: 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74  d prefix charact
9df0: 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63  ers */.  char wc
9e00: 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [3];            
9e10: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
9e20: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
9e30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9e40: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
9e50: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9e60: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  n */.  sqlite3_v
9e70: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a  alue *pVal = 0;.
9e80: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ea0: 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74  Opcode of pRight
9eb0: 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69   */..  if( !sqli
9ec0: 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f  te3IsLikeFunctio
9ed0: 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f  n(db, pExpr, pno
9ee0: 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20  Case, wc) ){.   
9ef0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
9f00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43  ifdef SQLITE_EBC
9f10: 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61  DIC.  if( *pnoCa
9f20: 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  se ) return 0;.#
9f30: 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20  endif.  pList = 
9f40: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
9f50: 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d    pLeft = pList-
9f60: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[1].pExpr;.  i
9f70: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b  f( pLeft->op!=TK
9f80: 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73  _COLUMN .   || s
9f90: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
9fa0: 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54  ty(pLeft)!=SQLIT
9fb0: 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c  E_AFF_TEXT .   |
9fc0: 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66  | IsVirtual(pLef
9fd0: 74 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20  t->pTab).  ){.  
9fe0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36    /* IMP: R-0206
9ff0: 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74  5-49465 The left
a000: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
a010: 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  e LIKE or GLOB o
a020: 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20  perator must.   
a030: 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20   ** be the name 
a040: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
a050: 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61  lumn with TEXT a
a060: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
a070: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a080: 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69  assert( pLeft->i
a090: 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20  Column!=(-1) ); 
a0a0: 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e  /* Because IPK n
a0b0: 65 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58  ever has AFF_TEX
a0c0: 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d  T */..  pRight =
a0d0: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
a0e0: 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68  pr;.  op = pRigh
a0f0: 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  t->op;.  if( op=
a100: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
a110: 20 20 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d      op = pRight-
a120: 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >op2;.  }.  if( 
a130: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
a140: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65  ){.    Vdbe *pRe
a150: 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65  prepare = pParse
a160: 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20  ->pReprepare;.  
a170: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69    int iCol = pRi
a180: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ght->iColumn;.  
a190: 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
a1a0: 56 64 62 65 47 65 74 56 61 6c 75 65 28 70 52 65  VdbeGetValue(pRe
a1b0: 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53  prepare, iCol, S
a1c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b  QLITE_AFF_NONE);
a1d0: 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26  .    if( pVal &&
a1e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
a1f0: 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54  ype(pVal)==SQLIT
a200: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
a210: 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  z = (char *)sqli
a220: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
a230: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
a240: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
a250: 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
a260: 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  dbe, iCol);.    
a270: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
a280: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
a290: 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  || pRight->op==T
a2a0: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
a2b0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
a2c0: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a  _STRING ){.    z
a2d0: 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f   = pRight->u.zTo
a2e0: 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ken;.  }.  if( z
a2f0: 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   ){.    cnt = 0;
a300: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
a310: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
a320: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
a330: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
a340: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
a350: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
a360: 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a  =0 && 255!=(u8)z
a370: 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20  [cnt-1] ){.     
a380: 20 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a   Expr *pPrefix;.
a390: 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65        *pisComple
a3a0: 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26  te = c==wc[0] &&
a3b0: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
a3c0: 20 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71      pPrefix = sq
a3d0: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
a3e0: 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20  _STRING, z);.   
a3f0: 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29     if( pPrefix )
a400: 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b   pPrefix->u.zTok
a410: 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20  en[cnt] = 0;.   
a420: 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70     *ppPrefix = p
a430: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66  Prefix;.      if
a440: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
a450: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  E ){.        Vdb
a460: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a470: 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Vdbe;.        sq
a480: 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
a490: 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69  ask(v, pRight->i
a4a0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
a4b0: 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74   if( *pisComplet
a4c0: 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a  e && pRight->u.z
a4d0: 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  Token[1] ){.    
a4e0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
a4f0: 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  rhs of the LIKE 
a500: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
a510: 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68  variable, and th
a520: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20  e current.      
a530: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
a540: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61  the variable mea
a550: 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ns there is no n
a560: 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  eed to invoke th
a570: 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20  e LIKE.         
a580: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68   ** function, th
a590: 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c  en no OP_Variabl
a5a0: 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  e will be added 
a5b0: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
a5c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
a5d0: 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d  s causes problem
a5e0: 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  s for the sqlite
a5f0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
a600: 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20  _name().        
a610: 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72    ** API. To wor
a620: 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64  karound them, ad
a630: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72  d a dummy OP_Var
a640: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20  iable here..    
a650: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
a660: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
a670: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a680: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
a690: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a6a0: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
a6b0: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20  pRight, r1);.   
a6c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a6d0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71  beChangeP3(v, sq
a6e0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
a6f0: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20  Addr(v)-1, 0);. 
a700: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a710: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
a720: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
a730: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
a750: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
a760: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
a770: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74  ree(pVal);.  ret
a780: 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65  urn (z!=0);.}.#e
a790: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
a7a0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
a7b0: 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64  ATION */...#ifnd
a7c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
a7d0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
a7e0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
a7f0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
a800: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
a810: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
a820: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
a830: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
a840: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
a850: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
a860: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
a870: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
a880: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
a890: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
a8a0: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
a8b0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
a8c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
a8d0: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
a8e0: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
a8f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a900: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
a910: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
a920: 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22  u.zToken,"match"
a930: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
a940: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
a950: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
a960: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  st;.  if( pList-
a970: 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20  >nExpr!=2 ){.   
a980: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a990: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d   if( pList->a[1]
a9a0: 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b  .pExpr->op != TK
a9b0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
a9c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
a9d0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
a9e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
a9f0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
aa00: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
aa10: 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  Base expression 
aa20: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
aa30: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
aa40: 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69  ause of.** a joi
aa50: 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  n, then transfer
aa60: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
aa70: 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74   markings over t
aa80: 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74  o derived..*/.st
aa90: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66  atic void transf
aaa0: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45  erJoinMarkings(E
aab0: 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45  xpr *pDerived, E
aac0: 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70  xpr *pBase){.  p
aad0: 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c  Derived->flags |
aae0: 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26  = pBase->flags &
aaf0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20   EP_FromJoin;.  
ab00: 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74  pDerived->iRight
ab10: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73  JoinTable = pBas
ab20: 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
ab30: 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  le;.}..#if !defi
ab40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ab50: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
ab60: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
ab70: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
ab80: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
ab90: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
aba0: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
abb0: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
abc0: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
abd0: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
abe0: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
abf0: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
ac00: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
ac10: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
ac40: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
ac50: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
ac60: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
ac70: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
ac80: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
ac90: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
aca0: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
acb0: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
acc0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
acd0: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
ace0: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
acf0: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
ad00: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
ad10: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
ad20: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
ad30: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
ad40: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
ad50: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
ad60: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
ad70: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
ad80: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
ad90: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
ada0: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
adb0: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
adc0: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
add0: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
ade0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
adf0: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
ae00: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
ae10: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
ae20: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
ae30: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
ae40: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
ae50: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
ae60: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
ae70: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
ae80: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
ae90: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
aea0: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
aeb0: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
aec0: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
aed0: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
aee0: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
aef0: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
af00: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
af10: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
af20: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
af30: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
af40: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
af50: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
af60: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
af70: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
af80: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
af90: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
afa0: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
afb0: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
afc0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64   column of C and
afd0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
afe0: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
aff0: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
b000: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
b010: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
b020: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
b030: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
b040: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
b050: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
b060: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
b070: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
b080: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
b090: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
b0a0: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
b0b0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
b0c0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
b0d0: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
b0e0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
b0f0: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
b100: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
b110: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
b120: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
b130: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
b140: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
b150: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
b160: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
b170: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
b180: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
b190: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
b1a0: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
b1b0: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
b1c0: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
b1d0: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
b1e0: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
b1f0: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
b200: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
b210: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
b220: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
b230: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
b240: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
b250: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
b260: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
b270: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
b280: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
b290: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
b2a0: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
b2b0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
b2c0: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
b2d0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
b2e0: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
b2f0: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
b300: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
b310: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
b320: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
b330: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
b340: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
b350: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
b360: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
b370: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
b380: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
b390: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
b3a0: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
b3b0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
b3c0: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
b3d0: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
b3e0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
b3f0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
b400: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
b410: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
b420: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
b430: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
b440: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
b450: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
b460: 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20 62 65  something the be
b470: 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74 69 6e  stIndex() routin
b480: 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65  e will determine
b490: 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  .  This analysis
b4a0: 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61  .** only looks a
b4b0: 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72  t whether subter
b4c0: 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ms appropriate f
b4d0: 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73  or indexing exis
b4e0: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61  t..**.** All exa
b4f0: 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20  mples A through 
b500: 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61 74 69  E above all sati
b510: 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74  sfy case 2.  But
b520: 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c   if a term.** al
b530: 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61  so statisfies ca
b540: 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29  se 1 (such as B)
b550: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
b560: 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c  e optimizer will
b570: 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65  .** always prefe
b580: 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20  r case 1, so in 
b590: 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65  that case we pre
b5a0: 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32  tend that case 2
b5b0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73   is not.** satis
b5c0: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d  fied..**.** It m
b5d0: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
b5e0: 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74   that multiple t
b5f0: 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61  ables are indexa
b600: 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ble.  For exampl
b610: 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20  e,.** (E) above 
b620: 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20  is indexable on 
b630: 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64  tables P, Q, and
b640: 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20   R..**.** Terms 
b650: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
b660: 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74  e 2 are candidat
b670: 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79  es for lookup by
b680: 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61   using.** separa
b690: 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69  te indices to fi
b6a0: 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61  nd rowids for ea
b6b0: 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63  ch subterm and c
b6c0: 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20  omposing.** the 
b6d0: 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77  union of all row
b6e0: 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53  ids using a RowS
b6f0: 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  et object.  This
b700: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
b710: 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65  o "bitmap indice
b720: 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61  s" in other data
b730: 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a  base engines..**
b740: 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a  .** OTHERWISE:.*
b750: 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
b760: 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20  case 1 nor case 
b770: 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65  2 apply, then le
b780: 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f  ave the eOperato
b790: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f  r set to.** zero
b7a0: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20  .  This term is 
b7b0: 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73  not useful for s
b7c0: 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  earch..*/.static
b7d0: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
b7e0: 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69  eOrTerm(.  SrcLi
b7f0: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
b800: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
b810: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
b820: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
b830: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f         /* the co
b840: 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61  mplete WHERE cla
b850: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
b860: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
b870: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
b880: 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65  he OR-term to be
b890: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
b8a0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
b8b0: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
b8c0: 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45  o;        /* WHE
b8d0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
b8e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b8f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
b900: 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
b910: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
b920: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
b930: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b940: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
b950: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
b960: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
b970: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
b980: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
b990: 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20  idxTerm];    /* 
b9a0: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
b9b0: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70  nalyzed */.  Exp
b9c0: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
b9d0: 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->pExpr;        
b9e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
b9f0: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  ession of the te
ba00: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rm */.  int i;  
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
ba40: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
ba50: 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20  e *pOrWc;       
ba60: 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54  /* Breakup of pT
ba70: 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  erm into subterm
ba80: 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  s */.  WhereTerm
ba90: 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20   *pOrTerm;      
baa0: 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77   /* A Sub-term w
bab0: 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20  ithin the pOrWc 
bac0: 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f  */.  WhereOrInfo
bad0: 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f   *pOrInfo;     /
bae0: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  * Additional inf
baf0: 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61  ormation associa
bb00: 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a  ted with pTerm *
bb10: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67  /.  Bitmask chng
bb20: 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a  ToIN;         /*
bb30: 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   Tables that mig
bb40: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ht satisfy case 
bb50: 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  1 */.  Bitmask i
bb60: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
bb70: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
bb80: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73  are indexable, s
bb90: 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32  atisfying case 2
bba0: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42   */..  /*.  ** B
bbb0: 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75  reak the OR clau
bbc0: 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61  se into its sepa
bbd0: 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20  rate subterms.  
bbe0: 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65  The subterms are
bbf0: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
bc00: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
bc10: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
bc20: 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68  ng within the Wh
bc30: 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f  ereOrInfo.  ** o
bc40: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74  bject that is at
bc50: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72  tached to the or
bc60: 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65  iginal OR clause
bc70: 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73   term..  */.  as
bc80: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
bc90: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59  Flags & (TERM_DY
bca0: 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46  NAMIC|TERM_ORINF
bcb0: 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29  O|TERM_ANDINFO))
bcc0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
bcd0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
bce0: 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e  R );.  pTerm->u.
bcf0: 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66  pOrInfo = pOrInf
bd00: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
bd10: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
bd20: 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20  of(*pOrInfo));. 
bd30: 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20   if( pOrInfo==0 
bd40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72  ) return;.  pTer
bd50: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
bd60: 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72  RM_ORINFO;.  pOr
bd70: 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77  Wc = &pOrInfo->w
bd80: 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  c;.  whereClause
bd90: 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 49 6e  Init(pOrWc, pWIn
bda0: 66 6f 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  fo);.  whereSpli
bdb0: 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20  t(pOrWc, pExpr, 
bdc0: 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e  TK_OR);.  exprAn
bdd0: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
bde0: 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d  OrWc);.  if( db-
bdf0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
be00: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
be10: 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d  ( pOrWc->nTerm>=
be20: 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 );..  /*.  ** 
be30: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20  Compute the set 
be40: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d  of tables that m
be50: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
be60: 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a  es 1 or 2..  */.
be70: 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28    indexable = ~(
be80: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e  Bitmask)0;.  chn
be90: 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73  gToIN = ~(Bitmas
bea0: 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72  k)0;.  for(i=pOr
beb0: 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72  Wc->nTerm-1, pOr
bec0: 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69  Term=pOrWc->a; i
bed0: 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65  >=0 && indexable
bee0: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
bef0: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54  ){.    if( (pOrT
bf00: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
bf10: 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29   WO_SINGLE)==0 )
bf20: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64  {.      WhereAnd
bf30: 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a  Info *pAndInfo;.
bf40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
bf50: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
bf60: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
bf70: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
bf80: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
bf90: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
bfa0: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
bfb0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
bfc0: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
bfd0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
bfe0: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
bff0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
c000: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
c010: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
c020: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
c030: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
c040: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
c050: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
c060: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
c070: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
c080: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c090: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
c0a0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
c0b0: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
c0c0: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
c0d0: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
c0e0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
c0f0: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
c100: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20   pWC->pWInfo);. 
c110: 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69         whereSpli
c120: 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72  t(pAndWC, pOrTer
c130: 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44  m->pExpr, TK_AND
c140: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
c150: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
c160: 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20  pAndWC);.       
c170: 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20   pAndWC->pOuter 
c180: 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74  = pWC;.        t
c190: 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c  estcase( db->mal
c1a0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
c1b0: 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61       if( !db->ma
c1c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
c1d0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
c1e0: 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43   pAndTerm=pAndWC
c1f0: 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e  ->a; j<pAndWC->n
c200: 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54  Term; j++, pAndT
c210: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
c220: 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64      assert( pAnd
c230: 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
c240: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
c250: 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72  llowedOp(pAndTer
c260: 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b  m->pExpr->op) ){
c270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
c280: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
c290: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
c2a0: 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  AndTerm->leftCur
c2b0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sor);.          
c2c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
c2d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c2e0: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
c2f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
c300: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
c310: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
c320: 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20  COPIED ){.      
c330: 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  /* Skip this ter
c340: 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72  m for now.  We r
c350: 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20 77  evisit it when w
c360: 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20  e process the.  
c370: 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
c380: 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41  ding TERM_VIRTUA
c390: 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65  L term */.    }e
c3a0: 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
c3b0: 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20  sk b;.      b = 
c3c0: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
c3d0: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  >sMaskSet, pOrTe
c3e0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  rm->leftCursor);
c3f0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
c400: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
c410: 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20  RM_VIRTUAL ){.  
c420: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
c430: 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63  *pOther = &pOrWc
c440: 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61  ->a[pOrTerm->iPa
c450: 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62  rent];.        b
c460: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49   |= getMask(&pWI
c470: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
c480: 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f  Other->leftCurso
c490: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
c4a0: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
c4b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f 72  ;.      if( (pOr
c4c0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
c4d0: 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a 20  & WO_EQ)==0 ){. 
c4e0: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
c4f0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
c500: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
c510: 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  IN &= b;.      }
c520: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
c530: 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  .  ** Record the
c540: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
c550: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
c560: 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67   2.  The set mig
c570: 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79  ht be.  ** empty
c580: 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f  ..  */.  pOrInfo
c590: 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e  ->indexable = in
c5a0: 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d  dexable;.  pTerm
c5b0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e  ->eOperator = in
c5c0: 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a  dexable==0 ? 0 :
c5d0: 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20   WO_OR;..  /*.  
c5e0: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64  ** chngToIN hold
c5f0: 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65  s a set of table
c600: 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73  s that *might* s
c610: 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20  atisfy case 1.  
c620: 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65  But.  ** we have
c630: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69   to do some addi
c640: 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20  tional checking 
c650: 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31  to see if case 1
c660: 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20   really.  ** is 
c670: 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a  satisfied..  **.
c680: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69    ** chngToIN wi
c690: 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30  ll hold either 0
c6a0: 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20  , 1, or 2 bits. 
c6b0: 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20   The 0-bit case 
c6c0: 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
c6d0: 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73  there is no poss
c6e0: 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73  ibility of trans
c6f0: 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63  forming the OR c
c700: 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20  lause into an.  
c710: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62  ** IN operator b
c720: 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f  ecause one or mo
c730: 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
c740: 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  OR clause contai
c750: 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67  n.  ** something
c760: 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f   other than == o
c770: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  n a column in th
c780: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
c790: 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20   The 1-bit.  ** 
c7a0: 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20  case means that 
c7b0: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
c7c0: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f  e OR clause is o
c7d0: 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20  f the form.  ** 
c7e0: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78  "table.column=ex
c7f0: 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  pr" for some sin
c800: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
c810: 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20  one bit that is 
c820: 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f  set.  ** will co
c830: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
c840: 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57  common table.  W
c850: 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
c860: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20  check to make.  
c870: 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65  ** sure the same
c880: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
c890: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54  on all terms.  T
c8a0: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73  he 2-bit case is
c8b0: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61   when.  ** the a
c8c0: 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20  ll terms are of 
c8d0: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31  the form "table1
c8e0: 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63  .column=table2.c
c8f0: 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a  olumn".  It.  **
c900: 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62   might be possib
c910: 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e  le to form an IN
c920: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65   operator with e
c930: 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c  ither table1.col
c940: 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c  umn.  ** or tabl
c950: 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  e2.column as the
c960: 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69   LHS if either i
c970: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72  s common to ever
c980: 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74  y term of.  ** t
c990: 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20  he OR clause..  
c9a0: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
c9b0: 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  t terms of the f
c9c0: 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d  orm "table.colum
c9d0: 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32  n1=table.column2
c9e0: 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  " (the.  ** same
c9f0: 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73   table on both s
ca00: 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20  izes of the ==) 
ca10: 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
ca20: 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
ca30: 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  chngToIN ){.    
ca40: 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  int okToChngToIN
ca50: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
ca60: 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73  e if the convers
ca70: 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c  ion to IN is val
ca80: 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  id */.    int iC
ca90: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20  olumn = -1;     
caa0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e      /* Column in
cab0: 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e  dex on lhs of IN
cac0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
cad0: 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d   int iCursor = -
cae0: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  1;         /* Ta
caf0: 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f  ble cursor commo
cb00: 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a  n to all terms *
cb10: 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b  /.    int j = 0;
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb30: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
cb40: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  */..    /* Searc
cb50: 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e  h for a table an
cb60: 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70  d column that ap
cb70: 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64  pears on one sid
cb80: 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  e or the.    ** 
cb90: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20  other of the == 
cba0: 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72  operator in ever
cbb0: 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74  y subterm.  That
cbc0: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
cbd0: 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65  n.    ** will be
cbe0: 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75   recorded in iCu
cbf0: 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e  rsor and iColumn
cc00: 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e  .  There might n
cc10: 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a  ot be any.    **
cc20: 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20   such table and 
cc30: 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54  column.  Set okT
cc40: 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20  oChngToIN if an 
cc50: 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c  appropriate tabl
cc60: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c  e.    ** and col
cc70: 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74  umn is found but
cc80: 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54   leave okToChngT
cc90: 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  oIN false if not
cca0: 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20   found..    */. 
ccb0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20     for(j=0; j<2 
ccc0: 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  && !okToChngToIN
ccd0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f  ; j++){.      pO
cce0: 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61  rTerm = pOrWc->a
ccf0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ;.      for(i=pO
cd00: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e  rWc->nTerm-1; i>
cd10: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
cd20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
cd30: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
cd40: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
cd50: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  );.        pOrTe
cd60: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
cd70: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
cd80: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
cd90: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
cda0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
cdb0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
cdc0: 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20   2-bit case and 
cdd0: 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65  we are on the se
cde0: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61  cond iteration a
cdf0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
ce00: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
ce10: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69  from the first i
ce20: 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b  teration.  So sk
ce30: 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f  ip this term. */
ce40: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
ce50: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
ce60: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
ce70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ce80: 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26   if( (chngToIN &
ce90: 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
cea0: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  ->sMaskSet, pOrT
ceb0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
cec0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
ced0: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d    /* This term m
cee0: 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f  ust be of the fo
cef0: 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68  rm t1.a==t2.b wh
cf00: 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65  ere t2 is in the
cf10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68  .          ** ch
cf20: 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74  ngToIN set but t
cf30: 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20  1 is not.  This 
cf40: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74  term will be eit
cf50: 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20  her preceeded.  
cf60: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f          ** or fo
cf70: 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65  llwed by an inve
cf80: 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d  rted copy (t2.b=
cf90: 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68  =t1.a).  Skip th
cfa0: 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20  is term .       
cfb0: 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74     ** and use it
cfc0: 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a  s inversion. */.
cfd0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
cfe0: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
cff0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
d000: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ED );.          
d010: 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72  testcase( pOrTer
d020: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
d030: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
d040: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d050: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
d060: 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54  & (TERM_COPIED|T
d070: 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a  ERM_VIRTUAL) );.
d080: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
d090: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
d0a0: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
d0b0: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
d0c0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69  olumn;.        i
d0d0: 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d  Cursor = pOrTerm
d0e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ->leftCursor;.  
d0f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d100: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
d110: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
d120: 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61   No candidate ta
d130: 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66  ble+column was f
d140: 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20  ound.  This can 
d150: 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20  only occur.     
d160: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63     ** on the sec
d170: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ond iteration */
d180: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d190: 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   j==1 );.       
d1a0: 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72   assert( IsPower
d1b0: 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29 20  OfTwo(chngToIN) 
d1c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
d1d0: 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74  t( chngToIN==get
d1e0: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
d1f0: 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29  askSet, iCursor)
d200: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
d210: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d220: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20   testcase( j==1 
d230: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  );..      /* We 
d240: 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e  have found a can
d250: 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64  didate table and
d260: 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20   column.  Check 
d270: 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20  to see if that. 
d280: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e       ** table an
d290: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d  d column is comm
d2a0: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
d2b0: 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73   in the OR claus
d2c0: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43  e */.      okToC
d2d0: 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  hngToIN = 1;.   
d2e0: 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26     for(; i>=0 &&
d2f0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69   okToChngToIN; i
d300: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
d310: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d320: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
d330: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
d340: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
d350: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
d360: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
d370: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
d380: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
d390: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
d3a0: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
d3b0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43  u.leftColumn!=iC
d3c0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
d3d0: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
d3e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
d3f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
d400: 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69  t affLeft, affRi
d410: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  ght;.          /
d420: 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68  * If the right-h
d430: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f  and side is also
d440: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
d450: 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20  the affinities. 
d460: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62           ** of b
d470: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
d480: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
d490: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
d4a0: 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  pe.          ** 
d4b0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
d4c0: 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  required on the 
d4d0: 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20  right.  (Ticket 
d4e0: 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20  #2249).         
d4f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66   */.          af
d500: 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  fRight = sqlite3
d510: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
d520: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
d530: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
d540: 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  affLeft = sqlite
d550: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
d560: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
d570: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
d580: 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20  if( affRight!=0 
d590: 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66  && affRight!=aff
d5a0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
d5b0: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
d5c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
d5d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d5e0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
d5f0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
d600: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
d610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d620: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
d630: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b  t this point, ok
d640: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72  ToChngToIN is tr
d650: 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70  ue if original p
d660: 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20  Term satisfies. 
d670: 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49     ** case 1.  I
d680: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e  n that case, con
d690: 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72  struct a new vir
d6a0: 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69  tual term that i
d6b0: 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20  s .    ** pTerm 
d6c0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
d6d0: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n IN operator.. 
d6e0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a     **.    ** EV:
d6f0: 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20   R-00211-15100. 
d700: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b     */.    if( ok
d710: 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ToChngToIN ){.  
d720: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20      Expr *pDup; 
d730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
d740: 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63  transient duplic
d750: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ate expression *
d760: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
d770: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f   *pList = 0;   /
d780: 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65  * The RHS of the
d790: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
d7a0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
d7b0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
d7c0: 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
d7d0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
d7e0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20      Expr *pNew; 
d7f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d800: 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70  e complete IN op
d810: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
d820: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
d830: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
d840: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  OrWc->a; i>=0; i
d850: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
d860: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
d870: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
d880: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
d890: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
d8a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
d8b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
d8c0: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
d8d0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
d8e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
d8f0: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20  ursor );.       
d900: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
d910: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
d920: 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  iColumn );.     
d930: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
d940: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
d950: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
d960: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
d970: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
d980: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
d990: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
d9a0: 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  List, pDup);.   
d9b0: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72       pLeft = pOr
d9c0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
d9d0: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ft;.      }.    
d9e0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
d9f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70  =0 );.      pDup
da00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
da10: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
da20: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
da30: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
da40: 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  e, TK_IN, pDup, 
da50: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
da60: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
da70: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
da80: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
da90: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
daa0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
dab0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
dac0: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
dad0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
dae0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
daf0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
db00: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
db10: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
db20: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
db30: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
db40: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
db50: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
db60: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  w==0 );.        
db70: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
db80: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
db90: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
dba0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
dbb0: 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61  ;.        pWC->a
dbc0: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
dbd0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
dbe0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
dbf0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
dc00: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
dc10: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
dc20: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
dc30: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72      }.      pTer
dc40: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
dc50: 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65  O_NOOP;  /* case
dc60: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
dc70: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
dc80: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
dc90: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
dca0: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
dcb0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
dcc0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  */../*.** The in
dcd0: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
dce0: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
dcf0: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
dd00: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
dd10: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
dd20: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
dd30: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
dd40: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
dd50: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
dd60: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
dd70: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
dd80: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
dd90: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
dda0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
ddb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ddc0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
ddd0: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
dde0: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
ddf0: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
de00: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
de10: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
de20: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
de30: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
de40: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
de50: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
de60: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
de70: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
de80: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
de90: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
dea0: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
deb0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
dec0: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
ded0: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
dee0: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
def0: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
df00: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
df10: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
df20: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
df30: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
df40: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
df50: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
df60: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
df70: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
df80: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
df90: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
dfa0: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
dfb0: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
dfc0: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
dfd0: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
dfe0: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
dff0: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
e000: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
e010: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
e020: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
e030: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
e040: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
e050: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
e060: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
e070: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
e080: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
e090: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
e0a0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
e0b0: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
e0c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
e0d0: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
e0e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
e0f0: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
e100: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
e110: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
e120: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
e130: 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  o; /* WHERE clau
e140: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  se processing co
e150: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
e160: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
e170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e180: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
e190: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alyzed */.  Wher
e1a0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
e1b0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
e1c0: 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64  Set of table ind
e1d0: 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78  ex masks */.  Ex
e1e0: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e200: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
e210: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
e220: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
e230: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20  reqLeft;        
e240: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
e250: 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45  esites of the pE
e260: 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20  xpr->pLeft */.  
e270: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
e280: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
e290: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
e2a0: 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  s of pExpr */.  
e2b0: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67  Bitmask extraRig
e2c0: 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ht = 0;         
e2d0: 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64   /* Extra depend
e2e0: 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a  encies on LEFT J
e2f0: 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  OIN */.  Expr *p
e300: 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Str1 = 0;       
e310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
e320: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
e330: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
e340: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e360: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
e370: 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63   ends with wildc
e380: 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ard */.  int noC
e390: 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ase = 0;        
e3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b            /* LIK
e3b0: 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69  E/GLOB distingui
e3c0: 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69  shes case */.  i
e3d0: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65  /* Top-level ope
e400: 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f  rator.  pExpr->o
e410: 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  p */.  Parse *pP
e420: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
e430: 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69  Parse;  /* Parsi
e440: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e450: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
e460: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
e470: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
e480: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  nection */..  if
e490: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
e4a0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
e4b0: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
e4c0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
e4d0: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
e4e0: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
e4f0: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
e500: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
e510: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
e520: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
e530: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
e540: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
e550: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
e560: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
e570: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
e580: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
e590: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
e5a0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
e5b0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
e5c0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
e5d0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
e5e0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
e5f0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
e600: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
e610: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
e620: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
e630: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
e640: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
e650: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
e660: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
e670: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
e680: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
e690: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
e6a0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
e6b0: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
e6c0: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
e6d0: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
e6e0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
e6f0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
e700: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
e710: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
e720: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
e730: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
e740: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
e750: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
e760: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
e770: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
e780: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
e790: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
e7a0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
e7b0: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
e7c0: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
e7d0: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
e7e0: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
e7f0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
e800: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
e830: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
e840: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
e850: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
e860: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
e870: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
e880: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
e890: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
e8a0: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
e8b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
e8c0: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
e8d0: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
e8e0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
e8f0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
e900: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
e910: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
e920: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
e930: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
e940: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
e950: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
e960: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
e970: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
e980: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
e990: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28  O_EQUIV;.    if(
e9a0: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
e9b0: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
e9c0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
e9d0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
e9e0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
e9f0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
ea00: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
ea10: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
ea20: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
ea30: 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b  ask(op) & opMask
ea40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ea50: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
ea60: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
ea70: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
ea80: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
ea90: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
eaa0: 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d    u16 eExtraOp =
eab0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78   0;        /* Ex
eac0: 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65  tra bits for pNe
ead0: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  w->eOperator */.
eae0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
eaf0: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
eb00: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
eb10: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
eb20: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
eb30: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
eb40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
eb50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
eb60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
eb70: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
eb80: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
eb90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
eba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
ebb0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
ebc0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
ebd0: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
ebe0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
ebf0: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
ec00: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
ec10: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
ec20: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
ec30: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
ec40: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
ec50: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
ec60: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
ec70: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
ec80: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
ec90: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
eca0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
ecb0: 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IED;.        if(
ecc0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
ecd0: 51 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45  Q.         && !E
ece0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ecf0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
ed00: 6e 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  n).         && O
ed10: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
ed20: 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 54 72  ed(db, SQLITE_Tr
ed30: 61 6e 73 69 74 69 76 65 29 0a 20 20 20 20 20 20  ansitive).      
ed40: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
ed50: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
ed60: 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20  |= WO_EQUIV;.   
ed70: 20 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20         eExtraOp 
ed80: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
ed90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
eda0: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  e{.        pDup 
edb0: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
edc0: 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20   pNew = pTerm;. 
edd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
ede0: 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c  rCommute(pParse,
edf0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c   pDup);.      pL
ee00: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
ee10: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 75  rSkipCollate(pDu
ee20: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  p->pLeft);.     
ee30: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
ee40: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
ee50: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
ee60: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
ee70: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
ee80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
ee90: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
eea0: 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65  aRight) != prere
eeb0: 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70  qLeft );.      p
eec0: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
eed0: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20   = prereqLeft | 
eee0: 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20  extraRight;.    
eef0: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
ef00: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
ef10: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
ef20: 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f 72  ator = (operator
ef30: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 2b  Mask(pDup->op) +
ef40: 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 4d   eExtraOp) & opM
ef50: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ask;.    }.  }..
ef60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ef70: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
ef80: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66  MIZATION.  /* If
ef90: 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42   a term is the B
efa0: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c  ETWEEN operator,
efb0: 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20   create two new 
efc0: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20  virtual terms.  
efd0: 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74  ** that define t
efe0: 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68  he range that th
eff0: 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d  e BETWEEN implem
f000: 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ents.  For examp
f010: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
f020: 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41     a BETWEEN b A
f030: 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  ND c.  **.  ** i
f040: 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  s converted into
f050: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
f060: 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e   (a BETWEEN b AN
f070: 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20  D c) AND (a>=b) 
f080: 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a  AND (a<=c).  **.
f090: 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77    ** The two new
f0a0: 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
f0b0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
f0c0: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
f0d0: 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68   object..  ** Th
f0e0: 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  e new terms are 
f0f0: 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72  "dynamic" and ar
f100: 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  e children of th
f110: 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45  e original BETWE
f120: 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54  EN.  ** term.  T
f130: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69  hat means that i
f140: 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65  f the BETWEEN te
f150: 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65  rm is coded, the
f160: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20   children are.  
f170: 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c  ** skipped.  Or,
f180: 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e   if the children
f190: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
f1a0: 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  y an index, the 
f1b0: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45  original.  ** BE
f1c0: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b  TWEEN term is sk
f1d0: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
f1e0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
f1f0: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20  ==TK_BETWEEN && 
f200: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
f210: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
f220: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
f230: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74  x.pList;.    int
f240: 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   i;.    static c
f250: 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20  onst u8 ops[] = 
f260: 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a  {TK_GE, TK_LE};.
f270: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
f280: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
f290: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
f2a0: 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==2 );.    for(i
f2b0: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
f2c0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
f2d0: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
f2e0: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65  dxNew;.      pNe
f2f0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
f300: 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73  Expr(pParse, ops
f310: 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  [i], .          
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
f340: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  p(db, pExpr->pLe
f350: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f370: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f380: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
f390: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30  [i].pExpr, 0), 0
f3a0: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
f3b0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
f3c0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
f3d0: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
f3e0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
f3f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
f400: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
f410: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
f420: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
f430: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
f440: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
f450: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
f460: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
f470: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   idxTerm;.    }.
f480: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
f490: 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 2;.  }.#endi
f4a0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
f4b0: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
f4c0: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64  ATION */..#if !d
f4d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f4e0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
f4f0: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
f500: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
f510: 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79  UERY).  /* Analy
f520: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69  ze a term that i
f530: 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77  s composed of tw
f540: 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72  o or more subter
f550: 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  ms connected by.
f560: 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61    ** an OR opera
f570: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  tor..  */.  else
f580: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
f590: 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73  TK_OR ){.    ass
f5a0: 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  ert( pWC->op==TK
f5b0: 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72  _AND );.    expr
f5c0: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53  AnalyzeOrTerm(pS
f5d0: 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d  rc, pWC, idxTerm
f5e0: 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
f5f0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
f600: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
f610: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
f620: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
f630: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f640: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
f650: 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f  TION.  /* Add co
f660: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64  nstraints to red
f670: 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
f680: 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f  pace on a LIKE o
f690: 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72  r GLOB.  ** oper
f6a0: 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
f6b0: 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f  A like pattern o
f6c0: 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49  f the form "x LI
f6d0: 4b 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68  KE 'abc%'" is ch
f6e0: 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74  anged into const
f6f0: 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a  raints.  **.  **
f700: 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62            x>='ab
f710: 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41  c' AND x<'abd' A
f720: 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27  ND x LIKE 'abc%'
f730: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
f740: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ast character of
f750: 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63   the prefix "abc
f760: 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  " is incremented
f770: 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a   to form the.  *
f780: 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  * termination co
f790: 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20  ndition "abd".. 
f7a0: 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f   */.  if( pWC->o
f7b0: 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26  p==TK_AND .   &&
f7c0: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50   isLikeOrGlob(pP
f7d0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53  arse, pExpr, &pS
f7e0: 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65  tr1, &isComplete
f7f0: 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a  , &noCase).  ){.
f800: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
f810: 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66         /* LHS of
f820: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
f830: 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
f840: 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a  *pStr2;       /*
f850: 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d   Copy of pStr1 -
f860: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
f870: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
f880: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
f890: 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  1;.    Expr *pNe
f8a0: 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20  wExpr2;.    int 
f8b0: 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74  idxNew1;.    int
f8c0: 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 54 6f   idxNew2;.    To
f8d0: 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65  ken sCollSeqName
f8e0: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f  ;  /* Name of co
f8f0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f900: 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d   */..    pLeft =
f910: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
f920: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
f930: 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33   pStr2 = sqlite3
f940: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72  ExprDup(db, pStr
f950: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 0);.    if( !
f960: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f970: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20   ){.      u8 c, 
f980: 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61  *pC;       /* La
f990: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
f9a0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69  ore the first wi
f9b0: 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20  ldcard */.      
f9c0: 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32  pC = (u8*)&pStr2
f9d0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74  ->u.zToken[sqlit
f9e0: 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32  e3Strlen30(pStr2
f9f0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a  ->u.zToken)-1];.
fa00: 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20        c = *pC;. 
fa10: 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20       if( noCase 
fa20: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
fa30: 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e  e point is to in
fa40: 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74  crement the last
fa50: 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72   character befor
fa60: 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  e the first.    
fa70: 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e      ** wildcard.
fa80: 20 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72    But if we incr
fa90: 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20  ement '@', that 
faa0: 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74  will push it int
fab0: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
fac0: 20 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67   alphabetic rang
fad0: 65 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e  e where case con
fae0: 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65  versions will me
faf0: 73 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20  ss up the .     
fb00: 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79     ** inequality
fb10: 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73  .  To avoid this
fb20: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61  , make sure to a
fb30: 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c  lso run the full
fb40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45  .        ** LIKE
fb50: 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74   on all candidat
fb60: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  e expressions by
fb70: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73   clearing the is
fb80: 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20  Complete flag.  
fb90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
fba0: 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20   if( c=='A'-1 ) 
fbb0: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
fbc0: 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33 33 39    /* EV: R-64339
fbd0: 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20 20 20  -08207 */...    
fbe0: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
fbf0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
fc00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
fc10: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
fc20: 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
fc30: 65 2e 7a 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22  e.z = noCase ? "
fc40: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
fc50: 59 22 3b 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71  Y";.    sCollSeq
fc60: 4e 61 6d 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20  Name.n = 6;.    
fc70: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
fc80: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
fc90: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e  Left, 0);.    pN
fca0: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
fcb0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
fcc0: 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20  K_GE, .         
fcd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
fce0: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
fcf0: 72 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 26 73  rse,pNewExpr1,&s
fd00: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
fd10: 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c 20           pStr1, 
fd20: 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20  0);.    idxNew1 
fd30: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
fd40: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
fd50: 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  r1, TERM_VIRTUAL
fd60: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
fd70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
fd80: 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20  xNew1==0 );.    
fd90: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
fda0: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b  , pWC, idxNew1);
fdb0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
fdc0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
fdd0: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
fde0: 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
fdf0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
fe00: 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20  se, TK_LT,.     
fe10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fe20: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
fe30: 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72  (pParse,pNewExpr
fe40: 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 29  2,&sCollSeqName)
fe50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 74  ,.           pSt
fe60: 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e  r2, 0);.    idxN
fe70: 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew2 = whereClaus
fe80: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
fe90: 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52  wExpr2, TERM_VIR
fea0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
feb0: 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
fec0: 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a  ( idxNew2==0 );.
fed0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
fee0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
fef0: 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
ff00: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
ff10: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
ff20: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
ff30: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
ff40: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
ff50: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
ff60: 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
ff70: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
ff80: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
ff90: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
ffa0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ffb0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
ffc0: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
ffd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ffe0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
fff0: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
10000 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
10010 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
10020 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
10030 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
10040 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
10050 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
10060 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
10070 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
10080 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
10090 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
100a0 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
100b0 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
100c0 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
100d0 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
100e0 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
100f0 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
10100 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
10110 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
10120 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
10130 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
10140 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
10150 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
10160 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
10170 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
10180 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
10190 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
101a0 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
101b0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
101c0 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
101d0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
101e0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
101f0 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65    prereqExpr = e
10200 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
10210 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
10220 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d  .    prereqColum
10230 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  n = exprTableUsa
10240 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65  ge(pMaskSet, pLe
10250 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72  ft);.    if( (pr
10260 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65  ereqExpr & prere
10270 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20  qColumn)==0 ){. 
10280 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
10290 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  xpr;.      pNewE
102a0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
102b0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41  pr(pParse, TK_MA
102c0 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TCH, .          
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78      0, sqlite3Ex
102f0 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
10300 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
10310 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
10320 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
10330 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
10340 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
10350 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
10360 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
10370 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
10380 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
10390 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
103a0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
103b0 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
103c0 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
103d0 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
103e0 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
103f0 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
10400 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
10410 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
10420 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
10430 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
10440 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10450 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
10460 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
10470 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
10480 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
10490 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
104a0 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
104b0 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
104c0 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
104d0 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
104e0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
104f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
10500 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
10510 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
10520 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10530 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 2f 2a 20  ABLE_STAT3.  /* 
10540 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74  When sqlite_stat
10550 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
10560 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e   is available an
10570 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65   operator of the
10580 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53  .  ** form "x IS
10590 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73   NOT NULL" can s
105a0 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c  ometimes be eval
105b0 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63  uated more effic
105c0 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22  iently.  ** as "
105d0 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20  x>NULL" if x is 
105e0 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
105f0 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20  RIMARY KEY.  So 
10600 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a  construct a.  **
10610 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66   virtual term of
10620 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a   that form..  **
10630 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
10640 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  the virtual term
10650 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20   must be tagged 
10660 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e  with TERM_VNULL.
10670 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d    This.  ** TERM
10680 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20  _VNULL tag will 
10690 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74  suppress the not
106a0 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74  -null check at t
106b0 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
106c0 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  * of the loop.  
106d0 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d  Without the TERM
106e0 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65  _VNULL flag, the
106f0 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20   not-null check 
10700 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72  at.  ** the star
10710 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69  t of the loop wi
10720 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72  ll prevent any r
10730 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e  esults from bein
10740 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  g returned..  */
10750 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
10760 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20  ==TK_NOTNULL.   
10770 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
10780 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
10790 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
107a0 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20  t->iColumn>=0.  
107b0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
107c0 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  wExpr;.    Expr 
107d0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
107e0 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69  pLeft;.    int i
107f0 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65  dxNew;.    Where
10800 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
10810 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20  .    pNewExpr = 
10820 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
10830 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20  rse, TK_GT,.    
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10860 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
10870 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10890 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70    sqlite3PExpr(p
108a0 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
108b0 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20  0, 0, 0), 0);.. 
108c0 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
108d0 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
108e0 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20  C, pNewExpr,.   
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10900 20 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f             TERM_
10910 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
10920 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29  AMIC|TERM_VNULL)
10930 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77  ;.    if( idxNew
10940 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   ){.      pNewTe
10950 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
10960 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
10970 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
10980 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  t = 0;.      pNe
10990 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
109a0 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
109b0 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
109c0 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
109d0 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
109e0 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
109f0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
10a00 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  _GT;.      pNewT
10a10 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
10a20 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
10a30 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
10a40 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
10a50 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
10a60 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
10a70 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
10a80 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
10a90 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
10aa0 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
10ab0 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
10ac0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
10ad0 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20  NABLE_STAT */.. 
10ae0 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63   /* Prevent ON c
10af0 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61  lause terms of a
10b00 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20   LEFT JOIN from 
10b10 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72  being used to dr
10b20 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ive.  ** an inde
10b30 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  x for tables to 
10b40 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
10b50 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65  join..  */.  pTe
10b60 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
10b70 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d  |= extraRight;.}
10b80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
10b90 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 70  ction searches p
10ba0 4c 69 73 74 20 66 6f 72 20 61 20 65 6e 74 72 79  List for a entry
10bb0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
10bc0 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
10bd0 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64  .** of index pId
10be0 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68  x..**.** If such
10bf0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
10c00 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64  s found, its ind
10c10 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d  ex in pList->a[]
10c20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
10c30 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f  .** no expressio
10c40 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69  n is found, -1 i
10c50 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
10c60 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
10c70 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20  dexCol(.  Parse 
10c80 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
10ca0 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
10cb0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69  /* Expression li
10ce0 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  st to search */.
10cf0 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20    int iBase,    
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d10 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20    /* Cursor for 
10d20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
10d30 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20   with pIdx */.  
10d40 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63  /* Index to matc
10d70 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20  h column of */. 
10d80 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20   int iCol       
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10da0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e   /* Column of in
10db0 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a  dex to match */.
10dc0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
10dd0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
10de0 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
10df0 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Col];..  for(i=0
10e00 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
10e10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
10e20 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
10e30 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
10e40 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
10e50 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
10e60 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26  TK_COLUMN.     &
10e70 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  & p->iColumn==pI
10e80 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f  dx->aiColumn[iCo
10e90 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54  l].     && p->iT
10ea0 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20  able==iBase.    
10eb0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
10ec0 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
10ed0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
10ee0 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
10ef0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
10f00 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29  f( ALWAYS(pColl)
10f10 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
10f20 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
10f30 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
10f40 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
10f50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10f60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
10f70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10f80 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  true if the DIST
10f90 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d  INCT expression-
10fa0 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
10fb0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
10fc0 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e  t.** is redundan
10fd0 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49  t..**.** A DISTI
10fe0 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75  NCT list is redu
10ff0 6e 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74  ndant if the dat
11000 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73  abase contains s
11010 6f 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  ome subset of.**
11020 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
11030 65 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e  e unique and non
11040 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  -null..*/.static
11050 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
11060 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
11070 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11080 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11090 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
110a0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
110b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
110c0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
110d0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
110e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
110f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
11100 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
11110 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20  stinct       /* 
11120 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  The result set t
11130 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
11140 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20  DISTINCT */.){. 
11150 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
11160 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
11170 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
11190 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20    int iBase;..  
111a0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  /* If there is m
111b0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62  ore than one tab
111c0 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  le or sub-select
111d0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
111e0 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  use of.  ** this
111f0 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
11200 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
11210 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61  ible to show tha
11220 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a  t the DISTINCT .
11230 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72    ** clause is r
11240 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69  edundant. */.  i
11250 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
11260 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
11270 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c  .  iBase = pTabL
11280 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
11290 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62  r;.  pTab = pTab
112a0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
112b0 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
112c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
112d0 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d   is an IPK colum
112e0 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65  n on table iBase
112f0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  , then return . 
11300 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20   ** true. Note: 
11310 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d  The (p->iTable==
11320 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74  iBase) part of t
11330 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20  his test may be 
11340 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a  false if the.  *
11350 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  * current SELECT
11360 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
11370 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f   sub-query..  */
11380 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
11390 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20  istinct->nExpr; 
113a0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
113b0 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
113c0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74  kipCollate(pDist
113d0 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
113e0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
113f0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
11400 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
11410 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
11420 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
11430 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
11440 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
11450 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
11460 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
11470 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
11480 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
11490 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
114a0 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
114b0 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
114c0 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
114d0 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
114e0 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
114f0 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
11500 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
11510 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
11520 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
11530 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
11540 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
11550 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
11560 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
11570 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
11580 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
11590 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
115a0 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
115b0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
115c0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
115d0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
115e0 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
115f0 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
11600 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
11610 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
11620 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f     3. All of tho
11630 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  se index columns
11640 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57   for which the W
11650 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
11660 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63   not.  **      c
11670 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22  ontain a "col=X"
11680 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63   term are subjec
11690 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  t to a NOT NULL 
116a0 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
116b0 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
116c0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
116d0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
116e0 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  ){.    if( pIdx-
116f0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e  >onError==OE_Non
11700 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
11710 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
11720 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
11730 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
11740 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
11750 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  n[i];.      if( 
11760 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  0==findTerm(pWC,
11770 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28   iBase, iCol, ~(
11780 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
11790 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  , pIdx) ){.     
117a0 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d     int iIdxCol =
117b0 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50   findIndexCol(pP
117c0 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c  arse, pDistinct,
117d0 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29   iBase, pIdx, i)
117e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49  ;.        if( iI
117f0 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d  dxCol<0 || pTab-
11800 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
11810 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c  lumn[i]].notNull
11820 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11830 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11840 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11850 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d      if( i==pIdx-
11860 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
11870 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
11880 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
11890 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
118a0 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74  ier is redundant
118b0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
118c0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 1;.    }.  }..
118d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
118e0 2a 20 0a 2a 2a 20 54 68 65 20 28 61 6e 20 61 70  * .** The (an ap
118f0 70 72 6f 78 69 6d 61 74 65 29 20 73 75 6d 20 6f  proximate) sum o
11900 66 20 74 77 6f 20 57 68 65 72 65 43 6f 73 74 73  f two WhereCosts
11910 2e 20 20 54 68 69 73 20 63 6f 6d 70 75 74 61 74  .  This computat
11920 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20  ion is.** not a 
11930 73 69 6d 70 6c 65 20 22 2b 22 20 6f 70 65 72 61  simple "+" opera
11940 74 6f 72 20 62 65 63 61 75 73 65 20 57 68 65 72  tor because Wher
11950 65 43 6f 73 74 20 69 73 20 73 74 6f 72 65 64 20  eCost is stored 
11960 61 73 20 61 20 6c 6f 67 61 72 69 74 68 6d 69 63  as a logarithmic
11970 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 20 0a 2a  .** value..** .*
11980 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43 6f  /.static WhereCo
11990 73 74 20 77 68 65 72 65 43 6f 73 74 41 64 64 28  st whereCostAdd(
119a0 57 68 65 72 65 43 6f 73 74 20 61 2c 20 57 68 65  WhereCost a, Whe
119b0 72 65 43 6f 73 74 20 62 29 7b 0a 20 20 73 74 61  reCost b){.  sta
119c0 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
119d0 65 64 20 63 68 61 72 20 78 5b 5d 20 3d 20 7b 0a  ed char x[] = {.
119e0 20 20 20 20 20 31 30 2c 20 31 30 2c 20 20 20 20       10, 10,    
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 20 20 20 2f 2a 20 30 2c 31 20 2a 2f 0a 20       /* 0,1 */. 
11a10 20 20 20 20 20 39 2c 20 39 2c 20 20 20 20 20 20       9, 9,      
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 20 20 20 20 2f 2a 20 32 2c 33 20 2a 2f 0a 20 20      /* 2,3 */.  
11a40 20 20 20 20 38 2c 20 38 2c 20 20 20 20 20 20 20      8, 8,       
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a60 20 20 20 2f 2a 20 34 2c 35 20 2a 2f 0a 20 20 20     /* 4,5 */.   
11a70 20 20 20 37 2c 20 37 2c 20 37 2c 20 20 20 20 20     7, 7, 7,     
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a90 20 20 2f 2a 20 36 2c 37 2c 38 20 2a 2f 0a 20 20    /* 6,7,8 */.  
11aa0 20 20 20 20 36 2c 20 36 2c 20 36 2c 20 20 20 20      6, 6, 6,    
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ac0 20 20 20 2f 2a 20 39 2c 31 30 2c 31 31 20 2a 2f     /* 9,10,11 */
11ad0 0a 20 20 20 20 20 20 35 2c 20 35 2c 20 35 2c 20  .      5, 5, 5, 
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11af0 20 20 20 20 20 20 2f 2a 20 31 32 2d 31 34 20 2a        /* 12-14 *
11b00 2f 0a 20 20 20 20 20 20 34 2c 20 34 2c 20 34 2c  /.      4, 4, 4,
11b10 20 34 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   4,             
11b20 20 20 20 20 20 20 20 2f 2a 20 31 35 2d 31 38 20         /* 15-18 
11b30 2a 2f 0a 20 20 20 20 20 20 33 2c 20 33 2c 20 33  */.      3, 3, 3
11b40 2c 20 33 2c 20 33 2c 20 33 2c 20 20 20 20 20 20  , 3, 3, 3,      
11b50 20 20 20 20 20 20 20 20 2f 2a 20 31 39 2d 32 34          /* 19-24
11b60 20 2a 2f 0a 20 20 20 20 20 20 32 2c 20 32 2c 20   */.      2, 2, 
11b70 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 20  2, 2, 2, 2, 2,  
11b80 20 20 20 20 20 20 20 20 20 2f 2a 20 32 35 2d 33           /* 25-3
11b90 31 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69 66 28 20  1 */.  };.  if( 
11ba0 61 3e 3d 62 20 29 7b 0a 20 20 20 20 69 66 28 20  a>=b ){.    if( 
11bb0 61 3e 62 2b 34 39 20 29 20 72 65 74 75 72 6e 20  a>b+49 ) return 
11bc0 61 3b 0a 20 20 20 20 69 66 28 20 61 3e 62 2b 33  a;.    if( a>b+3
11bd0 31 20 29 20 72 65 74 75 72 6e 20 61 2b 31 3b 0a  1 ) return a+1;.
11be0 20 20 20 20 72 65 74 75 72 6e 20 61 2b 78 5b 61      return a+x[a
11bf0 2d 62 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -b];.  }else{.  
11c00 20 20 69 66 28 20 62 3e 61 2b 34 39 20 29 20 72    if( b>a+49 ) r
11c10 65 74 75 72 6e 20 62 3b 0a 20 20 20 20 69 66 28  eturn b;.    if(
11c20 20 62 3e 61 2b 33 31 20 29 20 72 65 74 75 72 6e   b>a+31 ) return
11c30 20 62 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   b+1;.    return
11c40 20 62 2b 78 5b 62 2d 61 5d 3b 0a 20 20 7d 0a 7d   b+x[b-a];.  }.}
11c50 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
11c60 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  an integer into 
11c70 61 20 57 68 65 72 65 43 6f 73 74 2e 20 20 49 6e  a WhereCost.  In
11c80 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63 6f   other words, co
11c90 6d 70 75 74 65 20 61 0a 2a 2a 20 67 6f 6f 64 20  mpute a.** good 
11ca0 61 70 70 72 6f 78 69 6d 61 74 61 74 69 6f 6e 20  approximatation 
11cb0 66 6f 72 20 31 30 2a 6c 6f 67 32 28 78 29 2e 0a  for 10*log2(x)..
11cc0 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 43  */.static WhereC
11cd0 6f 73 74 20 77 68 65 72 65 43 6f 73 74 28 74 52  ost whereCost(tR
11ce0 6f 77 63 6e 74 20 78 29 7b 0a 20 20 73 74 61 74  owcnt x){.  stat
11cf0 69 63 20 57 68 65 72 65 43 6f 73 74 20 61 5b 5d  ic WhereCost a[]
11d00 20 3d 20 7b 20 30 2c 20 32 2c 20 33 2c 20 35 2c   = { 0, 2, 3, 5,
11d10 20 36 2c 20 37 2c 20 38 2c 20 39 20 7d 3b 0a 20   6, 7, 8, 9 };. 
11d20 20 57 68 65 72 65 43 6f 73 74 20 79 20 3d 20 34   WhereCost y = 4
11d30 30 3b 0a 20 20 69 66 28 20 78 3c 38 20 29 7b 0a  0;.  if( x<8 ){.
11d40 20 20 20 20 69 66 28 20 78 3c 32 20 29 20 72 65      if( x<2 ) re
11d50 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
11d60 65 28 20 78 3c 38 20 29 7b 20 20 79 20 2d 3d 20  e( x<8 ){  y -= 
11d70 31 30 3b 20 78 20 3c 3c 3d 20 31 3b 20 7d 0a 20  10; x <<= 1; }. 
11d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
11d90 65 28 20 78 3e 32 35 35 20 29 7b 20 79 20 2b 3d  e( x>255 ){ y +=
11da0 20 34 30 3b 20 78 20 3e 3e 3d 20 34 3b 20 7d 0a   40; x >>= 4; }.
11db0 20 20 20 20 77 68 69 6c 65 28 20 78 3e 31 35 20      while( x>15 
11dc0 29 7b 20 20 79 20 2b 3d 20 31 30 3b 20 78 20 3e  ){  y += 10; x >
11dd0 3e 3d 20 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65  >= 1; }.  }.  re
11de0 74 75 72 6e 20 61 5b 78 26 37 5d 20 2b 20 79 20  turn a[x&7] + y 
11df0 2d 20 31 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  - 10;.}..#ifndef
11e00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
11e10 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
11e20 43 6f 6e 76 65 72 74 20 61 20 64 6f 75 62 6c 65  Convert a double
11e30 20 28 61 73 20 72 65 63 65 69 76 65 64 20 66 72   (as received fr
11e40 6f 6d 20 78 42 65 73 74 49 6e 64 65 78 20 6f 66  om xBestIndex of
11e50 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
11e60 29 0a 2a 2a 20 69 6e 74 6f 20 61 20 57 68 65 72  ).** into a Wher
11e70 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74 68 65 72  eCost.  In other
11e80 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75 74 65 20   words, compute 
11e90 61 6e 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  an approximation
11ea0 20 66 6f 72 0a 2a 2a 20 31 30 2a 6c 6f 67 32 28   for.** 10*log2(
11eb0 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  x)..*/.static Wh
11ec0 65 72 65 43 6f 73 74 20 77 68 65 72 65 43 6f 73  ereCost whereCos
11ed0 74 46 72 6f 6d 44 6f 75 62 6c 65 28 64 6f 75 62  tFromDouble(doub
11ee0 6c 65 20 78 29 7b 0a 20 20 75 36 34 20 61 3b 0a  le x){.  u64 a;.
11ef0 20 20 57 68 65 72 65 43 6f 73 74 20 65 3b 0a 20    WhereCost e;. 
11f00 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
11f10 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
11f20 61 29 3d 3d 38 20 29 3b 0a 20 20 69 66 28 20 78  a)==8 );.  if( x
11f30 3c 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=1 ) return 0;.
11f40 20 20 69 66 28 20 78 3c 3d 32 30 30 30 30 30 30    if( x<=2000000
11f50 30 30 30 20 29 20 72 65 74 75 72 6e 20 77 68 65  000 ) return whe
11f60 72 65 43 6f 73 74 28 28 74 52 6f 77 63 6e 74 29  reCost((tRowcnt)
11f70 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 2c  x);.  memcpy(&a,
11f80 20 26 78 2c 20 38 29 3b 0a 20 20 65 20 3d 20 28   &x, 8);.  e = (
11f90 61 3e 3e 35 32 29 20 2d 20 31 30 32 32 3b 0a 20  a>>52) - 1022;. 
11fa0 20 72 65 74 75 72 6e 20 65 2a 31 30 3b 0a 7d 0a   return e*10;.}.
11fb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11fc0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11fd0 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  LE */../*.** Est
11fe0 69 6d 61 74 65 20 74 68 65 20 6c 6f 67 61 72 69  imate the logari
11ff0 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
12000 20 76 61 6c 75 65 20 74 6f 20 62 61 73 65 20 32   value to base 2
12010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
12020 65 43 6f 73 74 20 65 73 74 4c 6f 67 28 57 68 65  eCost estLog(Whe
12030 72 65 43 6f 73 74 20 4e 29 7b 0a 20 20 57 68 65  reCost N){.  Whe
12040 72 65 43 6f 73 74 20 78 20 3d 20 77 68 65 72 65  reCost x = where
12050 43 6f 73 74 28 4e 29 3b 0a 20 20 72 65 74 75 72  Cost(N);.  retur
12060 6e 20 78 3e 33 33 20 3f 20 78 20 2d 20 33 33 20  n x>33 ? x - 33 
12070 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77  : 0;.}../*.** Tw
12080 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  o routines for p
12090 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74  rinting the cont
120a0 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ent of an sqlite
120b0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20  3_index_info.** 
120c0 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64  structure.  Used
120d0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
120e0 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
120f0 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20    If neither.** 
12100 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53  SQLITE_TEST or S
12110 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20  QLITE_DEBUG are 
12120 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
12130 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ese routines.** 
12140 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23  are no-ops..*/.#
12150 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
12160 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12170 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
12180 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
12190 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64  LED).static void
121a0 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
121b0 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
121c0 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
121d0 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
121e0 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
121f0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
12200 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
12210 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
12220 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12230 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
12240 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
12250 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
12260 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
12270 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
12280 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
12290 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
122a0 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
122b0 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
122c0 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
122d0 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
122e0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
122f0 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
12300 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
12310 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
12320 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
12330 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
12340 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
12350 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
12360 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
12370 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
12380 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
12390 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
123a0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
123b0 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
123c0 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
123d0 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
123e0 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
123f0 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
12400 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
12410 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
12420 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
12430 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12440 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
12450 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
12460 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
12470 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
12480 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
12490 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
124a0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
124b0 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
124c0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
124d0 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
124e0 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
124f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
12500 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
12510 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
12520 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
12530 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
12540 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
12550 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
12560 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
12570 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12580 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
12590 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
125a0 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65  edCost);.}.#else
125b0 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
125c0 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
125d0 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
125e0 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
125f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12600 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
12610 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75  INDEX./*.** Retu
12620 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57  rn TRUE if the W
12630 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
12640 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66   pTerm is of a f
12650 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20  orm where it.** 
12660 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69  could be used wi
12670 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61  th an index to a
12680 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75  ccess pSrc, assu
12690 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69  ming an appropri
126a0 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69  ate.** index exi
126b0 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
126c0 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65  int termCanDrive
126d0 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65  Index(.  WhereTe
126e0 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20  rm *pTerm,      
126f0 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
12700 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
12710 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63  check */.  struc
12720 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
12730 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62  pSrc,     /* Tab
12740 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  le we are trying
12750 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20   to access */.  
12760 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12780 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65  * Tables in oute
12790 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a  r loops of the j
127a0 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  oin */.){.  char
127b0 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72   aff;.  if( pTer
127c0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70  m->leftCursor!=p
127d0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72  Src->iCursor ) r
127e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
127f0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12800 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 20 72   & WO_EQ)==0 ) r
12810 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
12820 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
12830 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ht & notReady)!=
12840 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12850 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  if( pTerm->u.lef
12860 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  tColumn<0 ) retu
12870 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53  rn 0;.  aff = pS
12880 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  rc->pTab->aCol[p
12890 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
128a0 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
128b0 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
128c0 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72  xAffinityOk(pTer
128d0 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29  m->pExpr, aff) )
128e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
128f0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
12900 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12910 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
12920 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  INDEX./*.** Gene
12930 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e  rate code to con
12940 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
12950 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e 20 61   object for an a
12960 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a  utomatic index.*
12970 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20  * and to set up 
12980 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c 20 6f  the WhereLevel o
12990 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73 6f 20  bject pLevel so 
129a0 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 67 65  that the code ge
129b0 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73  nerator.** makes
129c0 20 75 73 65 20 6f 66 20 74 68 65 20 61 75 74 6f   use of the auto
129d0 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a  matic index..*/.
129e0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73  static void cons
129f0 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
12a00 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
12a10 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
12a20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
12a30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
12a40 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
12a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12a60 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
12a70 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
12a80 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
12a90 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
12aa0 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74  se term to get t
12ab0 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f  he next index */
12ac0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
12ad0 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
12ae0 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
12af0 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
12b00 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68  vailable */.  Wh
12b10 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
12b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
12b30 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72  te new index her
12b40 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43  e */.){.  int nC
12b50 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
12b60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12b70 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
12b80 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
12b90 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  dex */.  WhereTe
12ba0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
12bb0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
12bc0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
12bd0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
12be0 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
12bf0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  ;          /* En
12c00 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
12c10 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12c30 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79  * Byte of memory
12c40 20 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64 78   needed for pIdx
12c50 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
12c60 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
12c70 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63    /* Object desc
12c80 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73  ribing the trans
12c90 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
12ca0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12cc0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
12cd0 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
12ce0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
12cf0 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  drInit;         
12d00 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
12d10 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
12d20 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75  zation bypass ju
12d30 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  mp */.  Table *p
12d40 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
12d50 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
12d60 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
12d70 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
12d80 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yinfo;          
12d90 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
12da0 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  on for the index
12db0 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64   */   .  int add
12dc0 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
12dd0 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
12de0 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f  he index fill lo
12df0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  op */.  int regR
12e00 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
12e10 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
12e20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  holding an index
12e30 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
12e40 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
12e50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
12e60 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  mn counter */.  
12e70 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
12e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
12e90 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
12ea0 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20   int mxBitCol;  
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ec0 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69  Maximum column i
12ed0 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  n pSrc->colUsed 
12ee0 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
12ef0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
12f00 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
12f10 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63  quence to on a c
12f20 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
12f30 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
12f40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f         /* The Lo
12f50 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 42  op object */.  B
12f60 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20  itmask idxCols; 
12f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
12f80 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  tmap of columns 
12f90 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e  used for indexin
12fa0 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  g */.  Bitmask e
12fb0 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20  xtraCols;       
12fc0 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
12fd0 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
12fe0 6e 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ns */.  const in
12ff0 74 20 6d 78 43 6f 6e 73 74 72 61 69 6e 74 20 3d  t mxConstraint =
13000 20 31 30 3b 20 2f 2a 20 4d 61 78 69 6d 75 6d 20   10; /* Maximum 
13010 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72  number of constr
13020 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 47  aints */..  /* G
13030 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13040 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72  skip over the cr
13050 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69  eation and initi
13060 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65  alization of the
13070 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20  .  ** transient 
13080 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64  index on 2nd and
13090 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72   subsequent iter
130a0 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f  ations of the lo
130b0 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61  op. */.  v = pPa
130c0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
130d0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
130e0 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74  addrInit = sqlit
130f0 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
13100 65 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  e);..  /* Count 
13110 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
13120 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
13130 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
13140 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75  index.  ** and u
13150 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45  sed to match WHE
13160 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
13170 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75  aints */.  nColu
13180 6d 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  mn = 0;.  pTable
13190 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
131a0 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e   pWCEnd = &pWC->
131b0 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  a[pWC->nTerm];. 
131c0 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
131d0 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f  >pWLoop;.  idxCo
131e0 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54  ls = 0;.  for(pT
131f0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
13200 6d 3c 70 57 43 45 6e 64 20 26 26 20 70 4c 6f 6f  m<pWCEnd && pLoo
13210 70 2d 3e 6e 4c 54 65 72 6d 3c 6d 78 43 6f 6e 73  p->nLTerm<mxCons
13220 74 72 61 69 6e 74 3b 20 70 54 65 72 6d 2b 2b 29  traint; pTerm++)
13230 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
13240 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
13250 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
13260 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
13270 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
13280 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
13290 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
132a0 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41  = iCol>=BMS ? MA
132b0 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d  SKBIT(BMS-1) : M
132c0 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20  ASKBIT(iCol);.  
132d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
132e0 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
132f0 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
13300 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
13310 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
13320 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
13330 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
13340 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
13350 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 43 6f 6c 75  db, pLoop, nColu
13360 6d 6e 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a  mn+1) ) return;.
13370 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
13380 4c 54 65 72 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b 5d  LTerm[nColumn++]
13390 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
133a0 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
133b0 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
133c0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
133d0 6e 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70  nColumn>0 );.  p
133e0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
133f0 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  q = pLoop->nLTer
13400 6d 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70  m = nColumn;.  p
13410 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
13420 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
13430 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  | WHERE_IDX_ONLY
13440 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   | WHERE_INDEXED
13450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13460 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 54 45        | WHERE_TE
13470 4d 50 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20  MP_INDEX;..  /* 
13480 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
13490 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
134a0 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
134b0 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63   create a.  ** c
134c0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
134d0 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  A "covering inde
134e0 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74  x" is an index t
134f0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  hat contains all
13500 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  .  ** columns th
13510 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  at are needed by
13520 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74   the query.  Wit
13530 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  h a covering ind
13540 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69  ex, the.  ** ori
13550 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65  ginal table neve
13560 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63  r needs to be ac
13570 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74  cessed.  Automat
13580 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a  ic indices must.
13590 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69    ** be a coveri
135a0 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65  ng index because
135b0 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
135c0 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69  not be updated i
135d0 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  f the.  ** origi
135e0 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65  nal table change
135f0 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
13600 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74  and table cannot
13610 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20   both be used.  
13620 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75  ** if they go ou
13630 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a  t of sync..  */.
13640 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53    extraCols = pS
13650 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e  rc->colUsed & (~
13660 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49  idxCols | MASKBI
13670 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42  T(BMS-1));.  mxB
13680 69 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d  itCol = (pTable-
13690 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20  >nCol >= BMS-1) 
136a0 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65  ? BMS-1 : pTable
136b0 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61  ->nCol;.  testca
136c0 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
136d0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73  ==BMS-1 );.  tes
136e0 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e  tcase( pTable->n
136f0 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  Col==BMS-2 );.  
13700 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
13710 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
13720 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
13730 41 53 4b 42 49 54 28 69 29 20 29 20 6e 43 6f 6c  ASKBIT(i) ) nCol
13740 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  umn++;.  }.  if(
13750 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
13760 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
13770 29 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 2b  ){.    nColumn +
13780 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d  = pTable->nCol -
13790 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20   BMS + 1;.  }.  
137a0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
137b0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
137c0 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  Q | WHERE_IDX_ON
137d0 4c 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72  LY;..  /* Constr
137e0 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
137f0 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65  ject to describe
13800 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20   this index */. 
13810 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
13820 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20  Index);.  nByte 
13830 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f  += nColumn*sizeo
13840 66 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49  f(int);     /* I
13850 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f  ndex.aiColumn */
13860 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
13870 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  umn*sizeof(char*
13880 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a  );   /* Index.az
13890 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20  Coll */.  nByte 
138a0 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  += nColumn;     
138b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
138c0 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20  ndex.aSortOrder 
138d0 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69  */.  pIdx = sqli
138e0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
138f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74  pParse->db, nByt
13900 65 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d  e);.  if( pIdx==
13910 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c  0 ) return;.  pL
13920 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
13930 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49  dex = pIdx;.  pI
13940 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68  dx->azColl = (ch
13950 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20  ar**)&pIdx[1];. 
13960 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20   pIdx->aiColumn 
13970 3d 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61  = (int*)&pIdx->a
13980 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a  zColl[nColumn];.
13990 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64    pIdx->aSortOrd
139a0 65 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d  er = (u8*)&pIdx-
139b0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
139c0 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d  n];.  pIdx->zNam
139d0 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22  e = "auto-index"
139e0 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ;.  pIdx->nColum
139f0 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70  n = nColumn;.  p
13a00 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  Idx->pTable = pT
13a10 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  able;.  n = 0;. 
13a20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
13a30 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
13a40 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
13a50 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
13a60 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
13a70 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
13a80 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
13a90 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
13aa0 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
13ab0 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
13ac0 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
13ad0 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
13ae0 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
13af0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Col);.      if( 
13b00 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
13b10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
13b20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
13b30 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
13b40 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
13b50 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  k;.        pIdx-
13b60 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70  >aiColumn[n] = p
13b70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
13b80 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  mn;.        pCol
13b90 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
13ba0 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
13bb0 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
13bc0 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
13bd0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
13be0 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53  Coll[n] = ALWAYS
13bf0 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d  (pColl) ? pColl-
13c00 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59  >zName : "BINARY
13c10 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  ";.        n++;.
13c20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13c30 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32  }.  assert( (u32
13c40 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  )n==pLoop->u.btr
13c50 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  ee.nEq );..  /* 
13c60 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  Add additional c
13c70 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
13c80 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61   make the automa
13c90 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20  tic index into. 
13ca0 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69   ** a covering i
13cb0 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ndex */.  for(i=
13cc0 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
13cd0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
13ce0 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54  raCols & MASKBIT
13cf0 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64  (i) ){.      pId
13d00 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
13d10 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
13d20 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e  azColl[n] = "BIN
13d30 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  ARY";.      n++;
13d40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
13d50 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
13d60 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
13d70 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53  ){.    for(i=BMS
13d80 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  -1; i<pTable->nC
13d90 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
13da0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
13db0 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
13dc0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22  x->azColl[n] = "
13dd0 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e  BINARY";.      n
13de0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
13df0 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75  assert( n==nColu
13e00 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  mn );..  /* Crea
13e10 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  te the automatic
13e20 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79   index */.  pKey
13e30 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e  info = sqlite3In
13e40 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
13e50 65 2c 20 70 49 64 78 29 3b 0a 20 20 61 73 73 65  e, pIdx);.  asse
13e60 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  rt( pLevel->iIdx
13e70 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76  Cur>=0 );.  pLev
13e80 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50  el->iIdxCur = pP
13e90 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
13ea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13eb0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f  4(v, OP_OpenAuto
13ec0 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69  index, pLevel->i
13ed0 49 64 78 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b  IdxCur, nColumn+
13ee0 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
13ef0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
13f00 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyinfo, P4_KE
13f10 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
13f20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
13f30 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62  , "for %s", pTab
13f40 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  le->zName));..  
13f50 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f  /* Fill the auto
13f60 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68  matic index with
13f70 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64   content */.  ad
13f80 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
13f90 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
13fa0 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e  Rewind, pLevel->
13fb0 69 54 61 62 43 75 72 29 3b 0a 20 20 72 65 67 52  iTabCur);.  regR
13fc0 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
13fd0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
13fe0 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  );.  sqlite3Gene
13ff0 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
14000 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65  rse, pIdx, pLeve
14010 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52  l->iTabCur, regR
14020 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c  ecord, 1);.  sql
14030 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14040 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
14050 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
14060 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
14070 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
14080 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
14090 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73  SEEKRESULT);.  s
140a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
140b0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65  (v, OP_Next, pLe
140c0 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64  vel->iTabCur, ad
140d0 64 72 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69  drTop+1);.  sqli
140e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
140f0 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  v, SQLITE_STMTST
14100 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b  ATUS_AUTOINDEX);
14110 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
14120 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
14130 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  p);.  sqlite3Rel
14140 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
14150 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
14160 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72    .  /* Jump her
14170 65 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20  e when skipping 
14180 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
14190 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  on */.  sqlite3V
141a0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
141b0 64 64 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64  ddrInit);.}.#end
141c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
141d0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
141e0 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  X */..#ifndef SQ
141f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14200 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c  LTABLE./*.** All
14210 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61  ocate and popula
14220 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  te an sqlite3_in
14230 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
14240 72 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  re. It is the .*
14250 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
14260 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
14270 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c  o eventually rel
14280 65 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75  ease the structu
14290 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67  re.** by passing
142a0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   the pointer ret
142b0 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
142c0 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65  nction to sqlite
142d0 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  3_free()..*/.sta
142e0 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  tic sqlite3_inde
142f0 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65  x_info *allocate
14300 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72  IndexInfo(.  Par
14310 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68  se *pParse,.  Wh
14320 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a  ereClause *pWC,.
14330 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
14340 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45  _item *pSrc,.  E
14350 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
14360 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  y.){.  int i, j;
14370 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20  .  int nTerm;.  
14380 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14390 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
143a0 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
143b0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
143c0 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f  x_orderby *pIdxO
143d0 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74  rderBy;.  struct
143e0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
143f0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
14400 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
14410 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
14420 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73  nt nOrderBy;.  s
14430 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
14440 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20  o *pIdxInfo;..  
14450 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
14460 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20  ber of possible 
14470 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
14480 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69  straints referri
14490 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  ng.  ** to this 
144a0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
144b0 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30  .  for(i=nTerm=0
144c0 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
144d0 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
144e0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
144f0 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
14500 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
14510 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
14520 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
14530 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
14540 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
14550 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
14560 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
14570 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
14580 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
14590 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
145a0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
145b0 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  LL );.    if( pT
145c0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
145d0 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63   (WO_ISNULL) ) c
145e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
145f0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
14600 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
14610 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65  ontinue;.    nTe
14620 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rm++;.  }..  /* 
14630 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
14640 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
14650 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  only columns in 
14660 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a  the current .  *
14670 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
14680 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70  then allocate sp
14690 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64  ace for the aOrd
146a0 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a  erBy part of.  *
146b0 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
146c0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
146d0 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65  re..  */.  nOrde
146e0 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rBy = 0;.  if( p
146f0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
14700 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d  nt n = pOrderBy-
14710 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
14720 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
14730 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
14740 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
14750 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
14760 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
14770 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
14780 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d  r->iTable!=pSrc-
14790 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  >iCursor ) break
147a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
147b0 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72  i==n){.      nOr
147c0 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d  derBy = n;.    }
147d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
147e0 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ate the sqlite3_
147f0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
14800 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ture.  */.  pIdx
14810 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
14820 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
14830 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
14840 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20  IdxInfo).       
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70      + (sizeof(*p
14870 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f  IdxCons) + sizeo
14880 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72  f(*pUsage))*nTer
14890 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
148b0 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72  izeof(*pIdxOrder
148c0 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a  By)*nOrderBy );.
148d0 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
148e0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
148f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14900 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
14910 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
14920 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
14930 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74  alize the struct
14940 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ure.  The sqlite
14950 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
14960 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
14970 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73    ** many fields
14980 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72   that are declar
14990 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72  ed "const" to pr
149a0 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78  event xBestIndex
149b0 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67   from.  ** chang
149c0 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
149d0 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
149e0 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
149f0 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69  rder to.  ** ini
14a00 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69  tialize those fi
14a10 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64  elds..  */.  pId
14a20 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20  xCons = (struct 
14a30 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
14a40 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49  nstraint*)&pIdxI
14a50 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72  nfo[1];.  pIdxOr
14a60 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20  derBy = (struct 
14a70 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
14a80 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73  derby*)&pIdxCons
14a90 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67  [nTerm];.  pUsag
14aa0 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  e = (struct sqli
14ab0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
14ac0 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64  aint_usage*)&pId
14ad0 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42  xOrderBy[nOrderB
14ae0 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  y];.  *(int*)&pI
14af0 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
14b00 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a  int = nTerm;.  *
14b10 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
14b20 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
14b30 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
14b40 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
14b50 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
14b60 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
14b70 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
14b80 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
14b90 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
14ba0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
14bb0 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
14bc0 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
14bd0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
14be0 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
14bf0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
14c00 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
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 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72    pUsage;..  for
14c60 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57  (i=j=0, pTerm=pW
14c70 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
14c80 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
14c90 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20  ){.    u8 op;.  
14ca0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
14cb0 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
14cc0 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
14cd0 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
14ce0 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
14cf0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
14d00 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
14d10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
14d20 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
14d30 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
14d40 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
14d50 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
14d60 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ULL );.    if( p
14d70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
14d80 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  & (WO_ISNULL) ) 
14d90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
14da0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
14db0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
14dc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49  continue;.    pI
14dd0 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d  dxCons[j].iColum
14de0 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  n = pTerm->u.lef
14df0 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  tColumn;.    pId
14e00 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66  xCons[j].iTermOf
14e10 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70  fset = i;.    op
14e20 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f   = (u8)pTerm->eO
14e30 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
14e40 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f  ;.    if( op==WO
14e50 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51  _IN ) op = WO_EQ
14e60 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
14e70 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f  ].op = op;.    /
14e80 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73  * The direct ass
14e90 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70  ignment in the p
14ea0 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20  revious line is 
14eb0 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65  possible only be
14ec0 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  cause.    ** the
14ed0 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f   WO_ and SQLITE_
14ee0 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
14ef0 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e  _ codes are iden
14f00 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20  tical.  The.    
14f10 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
14f20 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73  erts verify this
14f30 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73   fact. */.    as
14f40 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c  sert( WO_EQ==SQL
14f50 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
14f60 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61  AINT_EQ );.    a
14f70 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51  ssert( WO_LT==SQ
14f80 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
14f90 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20  RAINT_LT );.    
14fa0 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53  assert( WO_LE==S
14fb0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
14fc0 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20  TRAINT_LE );.   
14fd0 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d   assert( WO_GT==
14fe0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
14ff0 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20  STRAINT_GT );.  
15000 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d    assert( WO_GE=
15010 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
15020 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20  NSTRAINT_GE );. 
15030 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41     assert( WO_MA
15040 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  TCH==SQLITE_INDE
15050 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
15060 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CH );.    assert
15070 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
15080 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45  or & (WO_IN|WO_E
15090 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
150a0 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54  _GT|WO_GE|WO_MAT
150b0 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  CH) );.    j++;.
150c0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
150d0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
150e0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
150f0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
15100 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64  ].pExpr;.    pId
15110 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
15120 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
15130 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72  lumn;.    pIdxOr
15140 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20  derBy[i].desc = 
15150 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
15160 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
15170 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
15180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
15190 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
151a0 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
151b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
151c0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
151d0 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
151e0 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
151f0 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
15200 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
15210 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
15220 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
15230 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
15240 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
15250 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74  ndex_info object
15260 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69   that.** comes i
15270 6e 20 61 73 20 74 68 65 20 33 72 64 20 61 72 67  n as the 3rd arg
15280 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
15290 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
152a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
152b0 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75  , pParse is popu
152c0 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  lated with an er
152d0 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
152e0 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  a.** non-zero va
152f0 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
15300 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
15310 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
15320 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74  e output.** part
15330 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
15340 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
15350 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70  ture is left pop
15360 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  ulated..**.** Wh
15370 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20  ether or not an 
15380 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
15390 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  d, it is the res
153a0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
153b0 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
153c0 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
153d0 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e  p->idxStr if p->
153e0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
153f0 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68   indicates.** th
15400 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69  at this is requi
15410 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
15420 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  nt vtabBestIndex
15430 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15440 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c  Table *pTab, sql
15450 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15460 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *p){.  sqlite3_v
15470 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c  tab *pVtab = sql
15480 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50  ite3GetVTable(pP
15490 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d  arse->db, pTab)-
154a0 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b  >pVtab;.  int i;
154b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52  .  int rc;..  TR
154c0 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70  ACE_IDX_INPUTS(p
154d0 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d  );.  rc = pVtab-
154e0 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49  >pModule->xBestI
154f0 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a  ndex(pVtab, p);.
15500 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50    TRACE_IDX_OUTP
15510 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72  UTS(p);..  if( r
15520 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15530 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15540 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
15550 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
15560 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
15570 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
15580 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
15590 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
155a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
155b0 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
155c0 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c  tr(rc));.    }el
155d0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
155e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
155f0 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a  , "%s", pVtab->z
15600 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  ErrMsg);.    }. 
15610 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
15620 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
15630 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
15640 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  Msg = 0;..  for(
15650 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
15660 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
15670 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72   if( !p->aConstr
15680 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26  aint[i].usable &
15690 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  & p->aConstraint
156a0 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
156b0 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  ex>0 ){.      sq
156c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
156d0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
156e0 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73   "table %s: xBes
156f0 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20  tIndex returned 
15700 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22  an invalid plan"
15710 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
15720 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
15730 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  urn pParse->nErr
15740 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
15750 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15760 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
15770 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c   */...#ifdef SQL
15780 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
15790 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
157a0 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
157b0 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79  a particular key
157c0 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20   among all keys 
157d0 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  in an.** index. 
157e0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
157f0 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66  ts in aStat as f
15800 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
15810 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45   aStat[0]      E
15820 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
15830 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61  ws less than pVa
15840 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d  l.**    aStat[1]
15850 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
15860 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20  r of rows equal 
15870 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65  to pVal.**.** Re
15880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
15890 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74  n success..*/.st
158a0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65  atic int whereKe
158b0 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
158c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
158d0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
158e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
158f0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15910 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
15920 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
15930 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
15940 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a  *pVal,        /*
15950 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64   Value to consid
15960 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
15970 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
15980 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
15990 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
159a0 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
159b0 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
159c0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
159d0 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
159e0 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
159f0 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49    tRowcnt n;.  I
15a00 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d  ndexSample *aSam
15a10 70 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54  ple;.  int i, eT
15a20 79 70 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20  ype;.  int isEq 
15a30 3d 20 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20  = 0;.  i64 v;.  
15a40 64 6f 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20  double r, rS;.. 
15a50 20 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70   assert( roundUp
15a60 3d 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d  ==0 || roundUp==
15a70 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
15a80 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  Idx->nSample>0 )
15a90 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20  ;.  if( pVal==0 
15aa0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
15ab0 45 52 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64  ERROR;.  n = pId
15ac0 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  x->aiRowEst[0];.
15ad0 20 20 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78    aSample = pIdx
15ae0 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79  ->aSample;.  eTy
15af0 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
15b00 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a  ue_type(pVal);..
15b10 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
15b20 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
15b30 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76     v = sqlite3_v
15b40 61 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29  alue_int64(pVal)
15b50 3b 0a 20 20 20 20 72 20 3d 20 28 69 36 34 29 76  ;.    r = (i64)v
15b60 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
15b70 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
15b80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
15b90 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
15ba0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
15bb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
15bc0 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
15bd0 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58  Type>=SQLITE_TEX
15be0 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  T ) break;.     
15bf0 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
15c00 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e  eType==SQLITE_IN
15c10 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
15c20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
15c30 75 2e 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20  u.i>=v ){.      
15c40 20 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70      isEq = aSamp
15c50 6c 65 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20  le[i].u.i==v;.  
15c60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15c70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
15c90 73 65 72 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d  sert( aSample[i]
15ca0 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46  .eType==SQLITE_F
15cb0 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 20 20  LOAT );.        
15cc0 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  if( aSample[i].u
15cd0 2e 72 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20  .r>=r ){.       
15ce0 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c     isEq = aSampl
15cf0 65 5b 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20  e[i].u.r==r;.   
15d00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15d20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
15d30 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
15d40 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 72 20 3d  FLOAT ){.    r =
15d50 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
15d60 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20  ouble(pVal);.   
15d70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
15d80 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
15d90 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
15da0 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
15db0 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  ITE_NULL ) conti
15dc0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61  nue;.      if( a
15dd0 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e  Sample[i].eType>
15de0 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62  =SQLITE_TEXT ) b
15df0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
15e00 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
15e10 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29  ==SQLITE_FLOAT )
15e20 7b 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20 61  {.        rS = a
15e30 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20  Sample[i].u.r;. 
15e40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15e50 20 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65      rS = aSample
15e60 5b 69 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d  [i].u.i;.      }
15e70 0a 20 20 20 20 20 20 69 66 28 20 72 53 3e 3d 72  .      if( rS>=r
15e80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71   ){.        isEq
15e90 20 3d 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20   = rS==r;.      
15ea0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
15eb0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
15ec0 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
15ed0 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d  _NULL ){.    i =
15ee0 20 30 3b 0a 20 20 20 20 69 66 28 20 61 53 61 6d   0;.    if( aSam
15ef0 70 6c 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[0].eType==SQ
15f00 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71  LITE_NULL ) isEq
15f10 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
15f20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
15f30 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
15f40 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42   eType==SQLITE_B
15f50 4c 4f 42 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  LOB );.    for(i
15f60 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  =0; i<pIdx->nSam
15f70 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
15f80 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
15f90 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45  eType==SQLITE_TE
15fa0 58 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d  XT || aSample[i]
15fb0 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42  .eType==SQLITE_B
15fc0 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 62  LOB ){.        b
15fd0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15fe0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49    }.    if( i<pI
15ff0 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20  dx->nSample ){  
16000 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74      .      sqlit
16010 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16020 3e 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  >db;.      CollS
16030 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
16040 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20   const u8 *z;.  
16050 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53      if( eType==S
16060 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20  QLITE_BLOB ){.  
16070 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74        z = (const
16080 20 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61   u8 *)sqlite3_va
16090 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a  lue_blob(pVal);.
160a0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
160b0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
160c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
160d0 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Coll->enc==SQLIT
160e0 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20  E_UTF8 );.      
160f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
16100 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
16110 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
16120 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
16130 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b   *pIdx->azColl);
16140 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
16150 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
16160 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16170 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
16180 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63  }.        z = (c
16190 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65  onst u8 *)sqlite
161a0 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
161b0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
161c0 20 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a        if( !z ){.
161d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
161e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
161f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16200 20 61 73 73 65 72 74 28 20 7a 20 26 26 20 70 43   assert( z && pC
16210 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43  oll && pColl->xC
16220 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mp );.      }.  
16230 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56      n = sqlite3V
16240 61 6c 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20  alueBytes(pVal, 
16250 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 0a  pColl->enc);.  .
16260 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3c 70 49        for(; i<pI
16270 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  dx->nSample; i++
16280 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  ){.        int c
16290 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 53  ;.        int eS
162a0 61 6d 70 6c 65 74 79 70 65 20 3d 20 61 53 61 6d  ampletype = aSam
162b0 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20  ple[i].eType;.  
162c0 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c        if( eSampl
162d0 65 74 79 70 65 3c 65 54 79 70 65 20 29 20 63 6f  etype<eType ) co
162e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
162f0 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65 21  if( eSampletype!
16300 3d 65 54 79 70 65 20 29 20 62 72 65 61 6b 3b 0a  =eType ) break;.
16310 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16320 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 20  MIT_UTF16.      
16330 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63    if( pColl->enc
16340 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b  !=SQLITE_UTF8 ){
16350 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
16360 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20 20 20  Sample;.        
16370 20 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20    char *zSample 
16380 3d 20 73 71 6c 69 74 65 33 55 74 66 38 74 6f 31  = sqlite3Utf8to1
16390 36 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  6(.             
163a0 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c   db, pColl->enc,
163b0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c   aSample[i].u.z,
163c0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74   aSample[i].nByt
163d0 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20  e, &nSample.    
163e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
163f0 20 20 20 69 66 28 20 21 7a 53 61 6d 70 6c 65 20     if( !zSample 
16400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
16410 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
16420 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
16430 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
16440 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
16450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16460 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d    c = pColl->xCm
16470 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
16480 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65  nSample, zSample
16490 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  , n, z);.       
164a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
164b0 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20  (db, zSample);. 
164c0 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
164d0 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
164e0 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c          c = pCol
164f0 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
16500 55 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  User, aSample[i]
16510 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b  .nByte, aSample[
16520 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20  i].u.z, n, z);. 
16530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16540 20 69 66 28 20 63 3e 3d 30 20 29 7b 0a 20 20 20   if( c>=0 ){.   
16550 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20         if( c==0 
16560 29 20 69 73 45 71 20 3d 20 31 3b 0a 20 20 20 20  ) isEq = 1;.    
16570 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16590 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
165a0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 53  t this point, aS
165b0 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65 20  ample[i] is the 
165c0 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74 68 61  first sample tha
165d0 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
165e0 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20  n.  ** or equal 
165f0 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69 66 20  to pVal.  Or if 
16600 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
16610 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d 70 6c  , then all sampl
16620 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20 2a 2a  es are less.  **
16630 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49 66 20   than pVal.  If 
16640 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56 61 6c  aSample[i]==pVal
16650 2c 20 74 68 65 6e 20 69 73 45 71 3d 3d 31 2e 0a  , then isEq==1..
16660 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 71 20    */.  if( isEq 
16670 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
16680 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  <pIdx->nSample )
16690 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  ;.    aStat[0] =
166a0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b   aSample[i].nLt;
166b0 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
166c0 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45 71 3b 0a  aSample[i].nEq;.
166d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f    }else{.    tRo
166e0 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70  wcnt iLower, iUp
166f0 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
16700 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
16710 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
16720 20 20 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d     iUpper = aSam
16730 70 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20 20 20 20  ple[0].nLt;.    
16740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55 70  }else{.      iUp
16750 70 65 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e  per = i>=pIdx->n
16760 53 61 6d 70 6c 65 20 3f 20 6e 20 3a 20 61 53 61  Sample ? n : aSa
16770 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20  mple[i].nLt;.   
16780 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
16790 70 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20 2b 20 61  ple[i-1].nEq + a
167a0 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 4c 74 3b  Sample[i-1].nLt;
167b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74  .    }.    aStat
167c0 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 76 67 45  [1] = pIdx->avgE
167d0 71 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65  q;.    if( iLowe
167e0 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20  r>=iUpper ){.   
167f0 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20     iGap = 0;.   
16800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
16810 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c  ap = iUpper - iL
16820 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ower;.    }.    
16830 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20  if( roundUp ){. 
16840 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61       iGap = (iGa
16850 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73  p*2)/3;.    }els
16860 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
16870 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20  iGap/3;.    }.  
16880 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f    aStat[0] = iLo
16890 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a  wer + iGap;.  }.
168a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
168b0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
168c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
168d0 41 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  AT3 */../*.** If
168e0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
168f0 72 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 6c  r represents a l
16900 69 74 65 72 61 6c 20 76 61 6c 75 65 2c 20 73 65  iteral value, se
16910 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74  t *pp to point t
16920 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f  o.** an sqlite3_
16930 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
16940 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
16950 61 6d 65 20 76 61 6c 75 65 2c 20 77 69 74 68 20  ame value, with 
16960 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20  affinity.** aff 
16970 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 62  applied to it, b
16980 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
16990 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
169a0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
169b0 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65   .** caller to e
169c0 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
169d0 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  e this structure
169e0 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 74   by passing it t
169f0 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c  o .** sqlite3Val
16a00 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  ueFree()..**.** 
16a10 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  If the current p
16a20 61 72 73 65 20 69 73 20 61 20 72 65 63 6f 6d 70  arse is a recomp
16a30 69 6c 65 20 28 73 71 6c 69 74 65 33 52 65 70 72  ile (sqlite3Repr
16a40 65 70 61 72 65 28 29 29 20 61 6e 64 20 70 45 78  epare()) and pEx
16a50 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20  pr.** is an SQL 
16a60 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 63 75  variable that cu
16a70 72 72 65 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f  rrently has a no
16a80 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75  n-NULL value bou
16a90 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65  nd to it,.** cre
16aa0 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  ate an sqlite3_v
16ab0 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
16ac0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 76  ontaining this v
16ad0 61 6c 75 65 2c 20 61 67 61 69 6e 20 77 69 74 68  alue, again with
16ae0 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 61 66 66  .** affinity aff
16af0 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20   applied to it, 
16b00 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
16b10 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74 68 65  f neither of the
16b20 20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20 73 65   above apply, se
16b30 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  t *pp to NULL..*
16b40 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
16b50 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
16b60 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
16b70 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
16b80 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  _OK..*/.#ifdef S
16b90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
16ba0 54 33 0a 73 74 61 74 69 63 20 69 6e 74 20 76 61  T3.static int va
16bb0 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 50  lueFromExpr(.  P
16bc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
16bd0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20   Expr *pExpr, . 
16be0 20 75 38 20 61 66 66 2c 20 0a 20 20 73 71 6c 69   u8 aff, .  sqli
16bf0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29  te3_value **pp.)
16c00 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
16c10 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20  p==TK_VARIABLE. 
16c20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d    || (pExpr->op=
16c30 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
16c40 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56  pExpr->op2==TK_V
16c50 41 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20  ARIABLE).  ){.  
16c60 20 20 69 6e 74 20 69 56 61 72 20 3d 20 70 45 78    int iVar = pEx
16c70 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
16c80 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
16c90 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70  armask(pParse->p
16ca0 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20  Vdbe, iVar);.   
16cb0 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 56 64   *pp = sqlite3Vd
16cc0 62 65 47 65 74 56 61 6c 75 65 28 70 50 61 72 73  beGetValue(pPars
16cd0 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69  e->pReprepare, i
16ce0 56 61 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 72  Var, aff);.    r
16cf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16d00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
16d10 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78  lite3ValueFromEx
16d20 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  pr(pParse->db, p
16d30 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46  Expr, SQLITE_UTF
16d40 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23  8, aff, pp);.}.#
16d50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
16d60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
16d70 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
16d80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
16d90 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76  s that will be v
16da0 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61  isited.** by sca
16db0 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66  nning an index f
16dc0 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61  or a range of va
16dd0 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20  lues. The range 
16de0 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65  may have an uppe
16df0 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f  r.** bound, a lo
16e00 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f  wer bound, or bo
16e10 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c  th. The WHERE cl
16e20 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
16e30 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a  set the upper.**
16e40 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
16e50 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  s are represente
16e60 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20  d by pLower and 
16e70 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
16e80 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  ely. For.** exam
16e90 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ple, assuming th
16ea0 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  at index p is on
16eb0 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   t1(a):.**.**   
16ec0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
16ed0 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
16ee0 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ? ....**        
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f              |___
16f00 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a  __|   |_____|.**
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
16f30 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
16f40 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72            pLower
16f50 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a      pUpper.**.**
16f60 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
16f70 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  e upper or lower
16f80 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72   bound is not pr
16f90 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c  esent, then NULL
16fa0 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a   is passed in.**
16fb0 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f   place of the co
16fc0 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
16fd0 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
16fe0 20 6e 45 71 20 70 61 72 61 6d 65 74 65 72 20 69   nEq parameter i
16ff0 73 20 70 61 73 73 65 64 20 74 68 65 20 69 6e 64  s passed the ind
17000 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ex of the index 
17010 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74  column subject t
17020 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63  o the.** range c
17030 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65  onstraint. Or, e
17040 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65  quivalently, the
17050 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c   number of equal
17060 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ity constraints.
17070 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20  ** optimized by 
17080 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64  the proposed ind
17090 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61  ex scan. For exa
170a0 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69  mple, assuming i
170b0 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20  ndex p is.** on 
170c0 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68  t1(a, b), and th
170d0 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a  e SQL query is:.
170e0 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
170f0 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20   t1 WHERE a = ? 
17100 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20  AND b > ? AND b 
17110 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
17120 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65  en nEq should be
17130 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75   passed the valu
17140 65 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67  e 1 (as the rang
17150 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c  e restricted col
17160 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68  umn,.** b, is th
17170 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f  e second left-mo
17180 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
17190 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20   index). Or, if 
171a0 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
171b0 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
171c0 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
171d0 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D a < ? ....**.*
171e0 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c  * then nEq shoul
171f0 64 20 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a  d be passed 0..*
17200 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
17210 64 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  d value is an in
17220 74 65 67 65 72 20 64 69 76 69 73 6f 72 20 74 6f  teger divisor to
17230 20 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69   reduce the esti
17240 6d 61 74 65 64 0a 2a 2a 20 73 65 61 72 63 68 20  mated.** search 
17250 73 70 61 63 65 2e 20 20 41 20 72 65 74 75 72 6e  space.  A return
17260 20 76 61 6c 75 65 20 6f 66 20 31 20 6d 65 61 6e   value of 1 mean
17270 73 20 74 68 61 74 20 72 61 6e 67 65 20 63 6f 6e  s that range con
17280 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20  straints are.** 
17290 6e 6f 20 68 65 6c 70 20 61 74 20 61 6c 6c 2e 20  no help at all. 
172a0 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20   A return value 
172b0 6f 66 20 32 20 6d 65 61 6e 73 20 72 61 6e 67 65  of 2 means range
172c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
172d0 0a 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20  .** expected to 
172e0 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63  reduce the searc
172f0 68 20 73 70 61 63 65 20 62 79 20 68 61 6c 66 2e  h space by half.
17300 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 2e    And so forth..
17310 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61  ..**.** In the a
17320 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65  bsence of sqlite
17330 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a 45 20 64  _stat3 ANALYZE d
17340 61 74 61 2c 20 65 61 63 68 20 72 61 6e 67 65 20  ata, each range 
17350 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65  inequality.** re
17360 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
17370 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74   space by a fact
17380 6f 72 20 6f 66 20 34 2e 20 20 48 65 6e 63 65 20  or of 4.  Hence 
17390 61 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61  a single constra
173a0 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73  int (x>?).** res
173b0 75 6c 74 73 20 69 6e 20 61 20 72 65 74 75 72 6e  ults in a return
173c0 20 6f 66 20 34 20 61 6e 64 20 61 20 72 61 6e 67   of 4 and a rang
173d0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e  e constraint (x>
173e0 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c  ? AND x<?) resul
173f0 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75 72  ts.** in a retur
17400 6e 20 6f 66 20 31 36 2e 0a 2a 2f 0a 73 74 61 74  n of 16..*/.stat
17410 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
17420 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  eScanEst(.  Pars
17430 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
17440 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
17450 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
17460 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
17470 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
17480 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 63 6f 6e  /* The index con
17490 74 61 69 6e 69 6e 67 20 74 68 65 20 72 61 6e 67  taining the rang
174a0 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d  e-compared colum
174b0 6e 3b 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20  n; "x" */.  int 
174c0 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  nEq,            
174d0 20 2f 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20 70   /* index into p
174e0 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20  ->aCol[] of the 
174f0 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63  range-compared c
17500 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65  olumn */.  Where
17510 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20  Term *pLower,   
17520 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  /* Lower bound o
17530 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
17540 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62   "x>123" Might b
17550 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
17560 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20  eTerm *pUpper,  
17570 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20   /* Upper bound 
17580 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
17590 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20  : "x<455" Might 
175a0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
175b0 72 65 43 6f 73 74 20 2a 70 52 61 6e 67 65 44 69  reCost *pRangeDi
175c0 76 20 2f 2a 20 4f 55 54 3a 20 52 65 64 75 63 65  v /* OUT: Reduce
175d0 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
175e0 20 74 68 69 73 20 64 69 76 69 73 6f 72 20 2a 2f   this divisor */
175f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
17600 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65  QLITE_OK;..#ifde
17610 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17620 53 54 41 54 33 0a 0a 20 20 69 66 28 20 6e 45 71  STAT3..  if( nEq
17630 3d 3d 30 20 26 26 20 70 2d 3e 6e 53 61 6d 70 6c  ==0 && p->nSampl
17640 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
17650 5f 76 61 6c 75 65 20 2a 70 52 61 6e 67 65 56 61  _value *pRangeVa
17660 6c 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  l;.    tRowcnt i
17670 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 74  Lower = 0;.    t
17680 52 6f 77 63 6e 74 20 69 55 70 70 65 72 20 3d 20  Rowcnt iUpper = 
17690 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  p->aiRowEst[0];.
176a0 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d      tRowcnt a[2]
176b0 3b 0a 20 20 20 20 75 38 20 61 66 66 20 3d 20 70  ;.    u8 aff = p
176c0 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
176d0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61  ->aiColumn[0]].a
176e0 66 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66  ffinity;..    if
176f0 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
17700 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
17710 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pLower->pExpr->p
17720 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20  Right;.      rc 
17730 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
17740 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
17750 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29 3b  ff, &pRangeVal);
17760 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
17770 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
17780 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
17790 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ))!=0 );.      i
177a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
177b0 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65  .       && where
177c0 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
177d0 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 30   p, pRangeVal, 0
177e0 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  , a)==SQLITE_OK.
177f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
17800 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a   iLower = a[0];.
17810 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f          if( (pLo
17820 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
17830 20 57 4f 5f 47 54 29 21 3d 30 20 29 20 69 4c 6f   WO_GT)!=0 ) iLo
17840 77 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20  wer += a[1];.   
17850 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17860 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e  e3ValueFree(pRan
17870 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  geVal);.    }.  
17880 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17890 5f 4f 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b  _OK && pUpper ){
178a0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
178b0 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78  pr = pUpper->pEx
178c0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
178d0 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
178e0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
178f0 70 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65  pr, aff, &pRange
17900 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Val);.      asse
17910 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70  rt( (pUpper->eOp
17920 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
17930 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_LE))!=0 );.  
17940 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17950 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20  TE_OK.       && 
17960 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
17970 61 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56  arse, p, pRangeV
17980 61 6c 2c 20 31 2c 20 61 29 3d 3d 53 51 4c 49 54  al, 1, a)==SQLIT
17990 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20  E_OK.      ){.  
179a0 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
179b0 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
179c0 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61   (pUpper->eOpera
179d0 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20  tor & WO_LE)!=0 
179e0 29 20 69 55 70 70 65 72 20 2b 3d 20 61 5b 31 5d  ) iUpper += a[1]
179f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17a00 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
17a10 28 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20  (pRangeVal);.   
17a20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
17a30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17a40 20 20 57 68 65 72 65 43 6f 73 74 20 69 42 61 73    WhereCost iBas
17a50 65 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70 2d  e = whereCost(p-
17a60 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b 0a 20  >aiRowEst[0]);. 
17a70 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e       if( iUpper>
17a80 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  iLower ){.      
17a90 20 20 69 42 61 73 65 20 2d 3d 20 77 68 65 72 65    iBase -= where
17aa0 43 6f 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c  Cost(iUpper - iL
17ab0 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ower);.      }. 
17ac0 20 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20       *pRangeDiv 
17ad0 3d 20 69 42 61 73 65 3b 0a 20 20 20 20 20 20 57  = iBase;.      W
17ae0 48 45 52 45 54 52 41 43 45 28 30 78 31 30 30 2c  HERETRACE(0x100,
17af0 20 28 22 72 61 6e 67 65 20 73 63 61 6e 20 72 65   ("range scan re
17b00 67 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64  gions: %u..%u  d
17b10 69 76 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  iv=%d\n",.      
17b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b30 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20     (u32)iLower, 
17b40 28 75 33 32 29 69 55 70 70 65 72 2c 20 2a 70 52  (u32)iUpper, *pR
17b50 61 6e 67 65 44 69 76 29 29 3b 0a 20 20 20 20 20  angeDiv));.     
17b60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17b70 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  K;.    }.  }.#el
17b80 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
17b90 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20  METER(pParse);. 
17ba0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
17bb0 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  R(p);.  UNUSED_P
17bc0 41 52 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23  ARAMETER(nEq);.#
17bd0 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
17be0 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
17bf0 20 29 3b 0a 20 20 2a 70 52 61 6e 67 65 44 69 76   );.  *pRangeDiv
17c00 20 3d 20 30 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e   = 0;.  /* TUNIN
17c10 47 3a 20 20 45 61 63 68 20 69 6e 65 71 75 61 6c  G:  Each inequal
17c20 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  ity constraint r
17c30 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
17c40 68 20 73 70 61 63 65 20 34 2d 66 6f 6c 64 2e 0a  h space 4-fold..
17c50 20 20 2a 2a 20 41 20 42 45 54 57 45 45 4e 20 6f    ** A BETWEEN o
17c60 70 65 72 61 74 6f 72 2c 20 74 68 65 72 65 66 6f  perator, therefo
17c70 72 65 2c 20 72 65 64 75 63 65 73 20 74 68 65 20  re, reduces the 
17c80 73 65 61 72 63 68 20 73 70 61 63 65 20 31 36 2d  search space 16-
17c90 66 6f 6c 64 20 2a 2f 0a 20 20 69 66 28 20 70 4c  fold */.  if( pL
17ca0 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d  ower && (pLower-
17cb0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
17cc0 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
17cd0 20 2a 70 52 61 6e 67 65 44 69 76 20 2b 3d 20 32   *pRangeDiv += 2
17ce0 30 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d  0;  assert( 20==
17cf0 77 68 65 72 65 43 6f 73 74 28 34 29 20 29 3b 0a  whereCost(4) );.
17d00 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72    }.  if( pUpper
17d10 20 29 7b 0a 20 20 20 20 2a 70 52 61 6e 67 65 44   ){.    *pRangeD
17d20 69 76 20 2b 3d 20 32 30 3b 20 20 61 73 73 65 72  iv += 20;  asser
17d30 74 28 20 32 30 3d 3d 77 68 65 72 65 43 6f 73 74  t( 20==whereCost
17d40 28 34 29 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (4) );.  }.  ret
17d50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
17d60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17d70 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT3./*.** Esti
17d80 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
17d90 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
17da0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
17db0 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75  sed on.** an equ
17dc0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
17dd0 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65   x=VALUE and whe
17de0 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63  re that VALUE oc
17df0 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68  curs in.** the h
17e00 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20  istogram data.  
17e10 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
17e20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65  when x is the le
17e30 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d  ft-most.** colum
17e40 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e  n of an index an
17e50 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  d sqlite_stat3 h
17e60 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
17e70 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f   available.** fo
17e80 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57  r that index.  W
17e90 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20  hen pExpr==NULL 
17ea0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  that means the c
17eb0 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20  onstraint is.** 
17ec0 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74  "x IS NULL" inst
17ed0 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22  ead of "x=VALUE"
17ee0 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
17ef0 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
17f00 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
17f10 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
17f20 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
17f30 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
17f40 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
17f50 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
17f60 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
17f70 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
17f80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
17f90 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
17fa0 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
17fb0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
17fc0 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
17fd0 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
17fe0 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
17ff0 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
18000 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
18010 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
18020 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
18030 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
18040 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
18050 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
18060 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
18070 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c  c int whereEqual
18080 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
18090 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
180a0 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
180b0 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
180c0 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
180d0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
180e0 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73  * The index whos
180f0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
18100 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20  mn is pTerm */. 
18110 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
18120 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
18130 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e  ion for VALUE in
18140 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e   the x=VALUE con
18150 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f  straint */.  tRo
18160 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20  wcnt *pnRow     
18170 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
18180 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d  evised row estim
18190 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ate here */.){. 
181a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
181b0 70 52 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56 41  pRhs = 0;  /* VA
181c0 4c 55 45 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  LUE on right-han
181d0 64 20 73 69 64 65 20 6f 66 20 70 54 65 72 6d 20  d side of pTerm 
181e0 2a 2f 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20  */.  u8 aff;    
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18200 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  * Column affinit
18210 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  y */.  int rc;  
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20   /* Subfunction 
18240 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
18250 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20   tRowcnt a[2];  
18260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
18270 61 74 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61  atistics */..  a
18280 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
18290 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
182a0 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  ( p->nSample>0 )
182b0 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61  ;.  aff = p->pTa
182c0 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
182d0 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69  olumn[0]].affini
182e0 74 79 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20  ty;.  if( pExpr 
182f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75  ){.    rc = valu
18300 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
18310 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70  , pExpr, aff, &p
18320 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Rhs);.    if( rc
18330 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75   ) goto whereEqu
18340 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c  alScanEst_cancel
18350 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18360 52 68 73 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Rhs = sqlite3Val
18370 75 65 4e 65 77 28 70 50 61 72 73 65 2d 3e 64 62  ueNew(pParse->db
18380 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 68  );.  }.  if( pRh
18390 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  s==0 ) return SQ
183a0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
183b0 20 72 63 20 3d 20 77 68 65 72 65 4b 65 79 53 74   rc = whereKeySt
183c0 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
183d0 52 68 73 2c 20 30 2c 20 61 29 3b 0a 20 20 69 66  Rhs, 0, a);.  if
183e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
183f0 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  ){.    WHERETRAC
18400 45 28 30 78 31 30 30 2c 28 22 65 71 75 61 6c 69  E(0x100,("equali
18410 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ty scan regions:
18420 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31   %d\n", (int)a[1
18430 5d 29 29 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  ]));.    *pnRow 
18440 3d 20 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68 65 72  = a[1];.  }.wher
18450 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61  eEqualScanEst_ca
18460 6e 63 65 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56  ncel:.  sqlite3V
18470 61 6c 75 65 46 72 65 65 28 70 52 68 73 29 3b 0a  alueFree(pRhs);.
18480 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
18490 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
184a0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
184b0 54 41 54 33 29 20 2a 2f 0a 0a 23 69 66 64 65 66  TAT3) */..#ifdef
184c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
184d0 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT3./*.** Estim
184e0 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
184f0 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
18500 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
18510 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63  ed on.** an IN c
18520 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20  onstraint where 
18530 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
18540 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ide of the IN op
18550 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c  erator.** is a l
18560 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20  ist of values.  
18570 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
18580 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e        WHERE x IN
18590 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a   (1,2,3,4).**.**
185a0 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
185b0 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
185c0 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
185d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
185e0 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
185f0 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
18600 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
18610 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
18620 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
18630 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
18640 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
18650 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
18660 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
18670 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
18680 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
18690 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
186a0 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
186b0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
186c0 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
186d0 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
186e0 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
186f0 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
18700 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
18710 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
18720 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
18730 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20  hereInScanEst(. 
18740 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
18750 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
18760 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
18770 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
18780 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
18790 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
187a0 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73  x whose left-mos
187b0 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72  t column is pTer
187c0 6d 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  m */.  ExprList 
187d0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
187e0 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
187f0 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
18800 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
18810 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  " */.  tRowcnt *
18820 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
18830 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
18840 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
18850 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
18860 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
18870 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
18880 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
18890 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b  .  tRowcnt nEst;
188a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
188b0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72  mber of rows for
188c0 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a   a single term *
188d0 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77  /.  tRowcnt nRow
188e0 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  Est = 0;    /* N
188f0 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ew estimate of t
18900 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
18910 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18930 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
18940 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
18950 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
18960 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
18970 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73  ITE_OK && i<pLis
18980 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
18990 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69      nEst = p->ai
189a0 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72  RowEst[0];.    r
189b0 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
189c0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 2c  anEst(pParse, p,
189d0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
189e0 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20  pr, &nEst);.    
189f0 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b  nRowEst += nEst;
18a00 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
18a10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18a20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d  if( nRowEst > p-
18a30 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e  >aiRowEst[0] ) n
18a40 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f  RowEst = p->aiRo
18a50 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e  wEst[0];.    *pn
18a60 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20  Row = nRowEst;. 
18a70 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
18a80 31 30 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74  100,("IN row est
18a90 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22  imate: est=%g\n"
18aa0 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d  , nRowEst));.  }
18ab0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18ac0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
18ad0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
18ae0 53 54 41 54 33 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  STAT3) */../*.**
18af0 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20   Disable a term 
18b00 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
18b10 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f  use.  Except, do
18b20 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65   not disable the
18b30 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63   term.** if it c
18b40 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f  ontrols a LEFT O
18b50 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74  UTER JOIN and it
18b60 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
18b70 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20  te in the ON.** 
18b80 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
18b90 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a  of that join..**
18ba0 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65  .** Consider the
18bb0 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20   term t2.z='ok' 
18bc0 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
18bd0 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20   queries:.**.** 
18be0 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20    (1)  SELECT * 
18bf0 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
18c00 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
18c10 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b  x WHERE t2.z='ok
18c20 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45  '.**   (2)  SELE
18c30 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
18c40 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
18c50 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
18c60 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53  'ok'.**   (3)  S
18c70 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
18c80 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74   t2 WHERE t1.a=t
18c90 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
18ca0 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a  '.**.** The t2.z
18cb0 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65  ='ok' is disable
18cc0 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20  d in the in (2) 
18cd0 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69  because it origi
18ce0 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  nates.** in the 
18cf0 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ON clause.  The 
18d00 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64  term is disabled
18d10 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20   in (3) because 
18d20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a  it is not part.*
18d30 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  * of a LEFT OUTE
18d40 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c  R JOIN.  In (1),
18d50 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
18d60 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a   disabled..**.**
18d70 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
18d80 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35 38 36 35  OF: R-24597-5865
18d90 35 20 4e 6f 20 74 65 73 74 73 20 61 72 65 20 64  5 No tests are d
18da0 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73 20 74 68  one for terms th
18db0 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65  at are.** comple
18dc0 74 65 6c 79 20 73 61 74 69 73 66 69 65 64 20 62  tely satisfied b
18dd0 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  y indices..**.**
18de0 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72   Disabling a ter
18df0 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65  m causes that te
18e00 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73  rm to not be tes
18e10 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  ted in the inner
18e20 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20   loop.** of the 
18e30 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67  join.  Disabling
18e40 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
18e50 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73  ion.  When terms
18e60 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
18e70 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65  * by indices, we
18e80 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f   disable them to
18e90 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61   prevent redunda
18ea0 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20  nt tests in the 
18eb0 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20  inner.** loop.  
18ec0 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65  We would get the
18ed0 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73   correct results
18ee0 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65   if nothing were
18ef0 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a   ever disabled,.
18f00 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67  ** but joins mig
18f10 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
18f20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69  slower.  The tri
18f30 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65  ck is to disable
18f40 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77   as much.** as w
18f50 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69  e can without di
18f60 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68  sabling too much
18f70 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65  .  If we disable
18f80 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67  d in (1), we'd g
18f90 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20  et.** the wrong 
18fa0 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63  answer.  See tic
18fb0 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61  ket #813..*/.sta
18fc0 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
18fd0 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20  Term(WhereLevel 
18fe0 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65  *pLevel, WhereTe
18ff0 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66  rm *pTerm){.  if
19000 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26  ( pTerm.      &&
19010 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
19020 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
19030 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  0.      && (pLev
19040 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30  el->iLeftJoin==0
19050 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
19060 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
19070 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
19080 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e    ){.    pTerm->
19090 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
190a0 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70  CODED;.    if( p
190b0 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  Term->iParent>=0
190c0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
190d0 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
190e0 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65  Term->pWC->a[pTe
190f0 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
19100 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65      if( (--pOthe
19110 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b  r->nChild)==0 ){
19120 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
19130 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74  Term(pLevel, pOt
19140 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  her);.      }.  
19150 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
19160 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69   Code an OP_Affi
19170 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61  nity opcode to a
19180 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pply the column 
19190 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
191a0 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  zAff.** to the n
191b0 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
191c0 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a  ing at base. .**
191d0 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69  .** As an optimi
191e0 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41  zation, SQLITE_A
191f0 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
19200 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70  (which are no-op
19210 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67  s) at the.** beg
19220 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f  inning and end o
19230 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72  f zAff are ignor
19240 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72  ed.  If all entr
19250 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a  ies in zAff are.
19260 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
19270 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65  NE, then no code
19280 20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e   gets generated.
19290 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
192a0 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77  ine makes its ow
192b0 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73  n copy of zAff s
192c0 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  o that the calle
192d0 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20  r is free.** to 
192e0 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65  modify zAff afte
192f0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
19300 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  eturns..*/.stati
19310 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79  c void codeApply
19320 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a  Affinity(Parse *
19330 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65  pParse, int base
19340 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a  , int n, char *z
19350 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Aff){.  Vdbe *v 
19360 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19370 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29  .  if( zAff==0 )
19380 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
19390 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
193a0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
193b0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
193c0 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f  rt( v!=0 );..  /
193d0 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e  * Adjust base an
193e0 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  d n to skip over
193f0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
19400 20 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20   entries at the 
19410 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61  beginning.  ** a
19420 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66  nd end of the af
19430 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20  finity string.. 
19440 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30   */.  while( n>0
19450 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c   && zAff[0]==SQL
19460 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
19470 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73      n--;.    bas
19480 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b  e++;.    zAff++;
19490 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e  .  }.  while( n>
194a0 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d  1 && zAff[n-1]==
194b0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
194c0 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a  ){.    n--;.  }.
194d0 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f  .  /* Code the O
194e0 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64  P_Affinity opcod
194f0 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
19500 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64  ything left to d
19510 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20  o. */.  if( n>0 
19520 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
19530 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
19540 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e  ffinity, base, n
19550 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19560 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
19570 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20  , zAff, n);.    
19580 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19590 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
195a0 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b  Parse, base, n);
195b0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
195c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
195d0 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
195e0 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
195f0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
19600 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
19610 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
19620 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
19630 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
19640 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
19650 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
19660 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
19670 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
19680 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e  raint is left in
19690 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a   register iReg..
196a0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73  **.** For a cons
196b0 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f  traint of the fo
196c0 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65  rm X=expr, the e
196d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
196e0 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a  luated and its.*
196f0 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74  * result is left
19700 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
19710 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  For constraints 
19720 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e  of the form X IN
19730 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72   (...).** this r
19740 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
19750 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
19760 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c  iterate over all
19770 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f   values of X..*/
19780 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
19790 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20  EqualityTerm(.  
197a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
197b0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
197c0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
197d0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
197e0 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20  ,   /* The term 
197f0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
19800 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20  use to be coded 
19810 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
19820 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20  *pLevel, /* The 
19830 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f  level of the FRO
19840 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20  M clause we are 
19850 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
19860 69 6e 74 20 69 45 71 2c 20 20 20 20 20 20 20 20  int iEq,        
19870 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
19880 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
19890 6d 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65  m within this le
198a0 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  vel */.  int bRe
198b0 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v,           /* 
198c0 54 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65  True for reverse
198d0 2d 6f 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74  -order IN operat
198e0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ions */.  int iT
198f0 61 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a  arget         /*
19900 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76   Attempt to leav
19910 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69  e results in thi
19920 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
19930 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54  .  Expr *pX = pT
19940 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64  erm->pExpr;.  Vd
19950 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
19960 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65  pVdbe;.  int iRe
19970 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
19980 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
19990 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20  holding results 
199a0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54  */..  assert( iT
199b0 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28  arget>0 );.  if(
199c0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29   pX->op==TK_EQ )
199d0 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  {.    iReg = sql
199e0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
199f0 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  et(pParse, pX->p
19a00 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
19a10 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d  .  }else if( pX-
19a20 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29  >op==TK_ISNULL )
19a30 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  {.    iReg = iTa
19a40 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rget;.    sqlite
19a50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19a60 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29  P_Null, 0, iReg)
19a70 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
19a80 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
19aa0 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69  eType;.    int i
19ab0 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Tab;.    struct 
19ac0 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
19ad0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
19ae0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
19af0 6f 70 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c  op;..    if( (pL
19b00 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
19b10 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
19b20 45 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70  E)==0.      && p
19b30 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
19b40 6e 64 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26  ndex!=0.      &&
19b50 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
19b60 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
19b70 65 72 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20  er[iEq].    ){. 
19b80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
19b90 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  Eq==0 );.      t
19ba0 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
19bb0 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62  .      bRev = !b
19bc0 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  Rev;.    }.    a
19bd0 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
19be0 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67  K_IN );.    iReg
19bf0 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
19c00 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
19c10 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
19c20 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69  e, pX, 0);.    i
19c30 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
19c40 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b  EX_INDEX_DESC ){
19c50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19c60 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62   bRev );.      b
19c70 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20  Rev = !bRev;.   
19c80 20 7d 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58   }.    iTab = pX
19c90 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71  ->iTable;.    sq
19ca0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19cb0 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73  v, bRev ? OP_Las
19cc0 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  t : OP_Rewind, i
19cd0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  Tab, 0);.    ass
19ce0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
19cf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
19d00 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20  TI_OR)==0 );.   
19d10 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
19d20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45  |= WHERE_IN_ABLE
19d30 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
19d40 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b  ->u.in.nIn==0 ){
19d50 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  .      pLevel->a
19d60 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33  ddrNxt = sqlite3
19d70 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
19d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
19d90 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a  el->u.in.nIn++;.
19da0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
19db0 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20  .aInLoop =.     
19dc0 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c    sqlite3DbReall
19dd0 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d  ocOrFree(pParse-
19de0 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  >db, pLevel->u.i
19df0 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20  n.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 20 73 69 7a 65 6f 66 28           sizeof(
19e20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
19e30 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d  Loop[0])*pLevel-
19e40 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20  >u.in.nIn);.    
19e50 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  pIn = pLevel->u.
19e60 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20  in.aInLoop;.    
19e70 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20  if( pIn ){.     
19e80 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e   pIn += pLevel->
19e90 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20  u.in.nIn - 1;.  
19ea0 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20      pIn->iCur = 
19eb0 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  iTab;.      if( 
19ec0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
19ed0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20  ROWID ){.       
19ee0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20   pIn->addrInTop 
19ef0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19f00 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
19f10 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20   iTab, iReg);.  
19f20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19f30 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
19f40 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
19f50 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
19f60 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65  mn, iTab, 0, iRe
19f70 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
19f80 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f    pIn->eEndLoopO
19f90 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
19fa0 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
19fb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19fc0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
19fd0 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d  ll, iReg);.    }
19fe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
19ff0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30  el->u.in.nIn = 0
1a000 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1a010 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
1a020 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
1a030 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
1a040 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1a050 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1a060 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
1a070 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
1a080 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
1a090 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  dex..**.** For e
1a0a0 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72  xample, consider
1a0b0 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c   table t1(a,b,c,
1a0c0 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65  d,e,f) with inde
1a0d0 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20  x i1(a,b,c)..** 
1a0e0 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52  Suppose the WHER
1a0f0 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73  E clause is this
1a100 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e  :  a==5 AND b IN
1a110 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35   (1,2,3) AND c>5
1a120 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65   AND c<10.** The
1a130 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61   index has as ma
1a140 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61  ny as three equa
1a150 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1a160 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a  , but in this.**
1a170 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68   example, the th
1a180 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73  ird "c" value is
1a190 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
1a1a0 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a   So only two .**
1a1b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
1a1c0 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f   coded.  This ro
1a1d0 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72  utine will gener
1a1e0 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
1a1f0 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64  uate.** a==5 and
1a200 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20   b IN (1,2,3).  
1a210 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
1a220 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77  es for a and b w
1a230 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a  ill be stored.**
1a240 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20   in consecutive 
1a250 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
1a260 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66  e index of the f
1a270 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73  irst register is
1a280 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1a290 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
1a2a0 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42  above nEq==2.  B
1a2b0 75 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  ut this subrouti
1a2c0 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
1a2d0 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71   value.** of nEq
1a2e0 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49   including 0.  I
1a2f0 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72  f nEq==0, this r
1a300 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79  outine is nearly
1a310 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65   a no-op..** The
1a320 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64   only thing it d
1a330 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20  oes is allocate 
1a340 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  the pLevel->iMem
1a350 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
1a360 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20  .** compute the 
1a370 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e  affinity string.
1a380 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1a390 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  ine always alloc
1a3a0 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ates at least on
1a3b0 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
1a3c0 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  d returns.** the
1a3d0 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d   index of that m
1a3e0 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20  emory cell. The 
1a3f0 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c  code that.** cal
1a400 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
1a410 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65  will use that me
1a420 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f  mory cell to sto
1a430 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  re the terminati
1a440 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20  on.** key value 
1a450 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
1a460 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20   one or more IN 
1a470 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72  operators appear
1a480 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
1a490 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
1a4a0 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   an additional n
1a4b0 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  Eq memory cells 
1a4c0 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  for internal.** 
1a4d0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  use..**.** Befor
1a4e0 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
1a4f0 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Aff is set to po
1a500 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
1a510 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
1a520 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
1a530 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
1a540 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ng of the index 
1a550 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a  allocated using.
1a560 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ** sqlite3DbMall
1a570 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e  oc(). Except, en
1a580 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70  tries in the cop
1a590 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  y of the string 
1a5a0 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
1a5b0 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  th equality cons
1a5c0 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65  traints that use
1a5d0 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61   NONE affinity a
1a5e0 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c  re set to.** SQL
1a5f0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68  ITE_AFF_NONE. Th
1a600 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69  is is to deal wi
1a610 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74  th SQL such as t
1a620 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
1a630 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
1a640 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49  LE t1(a TEXT PRI
1a650 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a  MARY KEY, b);.**
1a660 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
1a670 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20  OM t1 AS t2, t1 
1a680 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e  WHERE t1.a = t2.
1a690 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  b;.**.** In the 
1a6a0 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
1a6b0 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61  he index on t1(a
1a6c0 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e  ) has TEXT affin
1a6d0 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a  ity. But since.*
1a6e0 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  * the right hand
1a6f0 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75   side of the equ
1a700 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1a710 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45   (t2.b) has NONE
1a720 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f   affinity,.** no
1a730 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75   conversion shou
1a740 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20  ld be attempted 
1a750 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74  before using a t
1a760 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72  2.b value as par
1a770 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f  t of.** a key to
1a780 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65   search the inde
1a790 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72  x. Hence the fir
1a7a0 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72  st byte in the r
1a7b0 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79  eturned affinity
1a7c0 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68  .** string in th
1a7d0 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64  is example would
1a7e0 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
1a7f0 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73  E_AFF_NONE..*/.s
1a800 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c  tatic int codeAl
1a810 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
1a820 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1a830 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1a840 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1a850 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1a860 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e  el,   /* Which n
1a870 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
1a880 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f  e FROM we are co
1a890 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52  ding */.  int bR
1a8a0 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
1a8b0 2f 2a 20 52 65 76 65 72 73 65 20 74 68 65 20 6f  /* Reverse the o
1a8c0 72 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61  rder of IN opera
1a8d0 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  tors */.  int nE
1a8e0 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20  xtraReg,        
1a8f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
1a900 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  ra registers to 
1a910 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68  allocate */.  ch
1a920 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20  ar **pzAff      
1a930 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
1a940 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69  to point to affi
1a950 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
1a960 7b 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20  {.  int nEq;    
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a980 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1a990 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
1a9a0 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20  traints to code 
1a9b0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
1a9c0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
1a9d0 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64     /* The vm und
1a9e0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1a9f0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
1aa00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1aa10 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
1aa20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74  being used for t
1aa30 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68  his loop */.  Wh
1aa40 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1aa60 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
1aa70 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65  nt term */.  Whe
1aa80 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20  reLoop *pLoop;  
1aa90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1aaa0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
1aab0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  ct */.  int j;  
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aad0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1aae0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
1aaf0 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
1ab00 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
1ab10 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
1ab20 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
1ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ab40 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74  Number of regist
1ab50 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ers to allocate 
1ab60 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b  */.  char *zAff;
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab80 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73     /* Affinity s
1ab90 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20  tring to return 
1aba0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f  */..  /* This mo
1abb0 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  dule is only cal
1abc0 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61  led on query pla
1abd0 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69  ns that use an i
1abe0 6e 64 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70  ndex. */.  pLoop
1abf0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
1ac00 70 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c  p;.  assert( (pL
1ac10 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1ac20 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1ac30 45 29 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d  E)==0 );.  nEq =
1ac40 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
1ac50 6e 45 71 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c  nEq;.  pIdx = pL
1ac60 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1ac70 64 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dex;.  assert( p
1ac80 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Idx!=0 );..  /* 
1ac90 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1aca0 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  any memory cells
1acb0 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68   we will need th
1acc0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d  en allocate them
1acd0 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65  ..  */.  regBase
1ace0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
1acf0 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c  + 1;.  nReg = pL
1ad00 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1ad10 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20   + nExtraReg;.  
1ad20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1ad30 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20  nReg;..  zAff = 
1ad40 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
1ad50 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69  pParse->db, sqli
1ad60 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
1ad70 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20  Str(v, pIdx));. 
1ad80 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20   if( !zAff ){.  
1ad90 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
1ada0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
1adb0 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61    }..  /* Evalua
1adc0 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  te the equality 
1add0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f  constraints.  */
1ade0 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
1adf0 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b  >nColumn>=nEq );
1ae00 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45  .  for(j=0; j<nE
1ae10 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  q; j++){.    int
1ae20 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d   r1;.    pTerm =
1ae30 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1ae40 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1ae50 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f  Term!=0 );.    /
1ae60 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1ae70 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73  true for indices
1ae80 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20   with redundant 
1ae90 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a  columns. .    **
1aea0 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45   Ex: CREATE INDE
1aeb0 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61  X i1 ON t1(a,b,a
1aec0 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  ); SELECT * FROM
1aed0 20 74 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e   t1 WHERE a=0 AN
1aee0 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65  D b=0; */.    te
1aef0 73 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e  stcase( (pTerm->
1af00 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
1af10 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  ODED)!=0 );.    
1af20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1af30 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1af40 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
1af50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
1af60 2a 2f 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65  */.    r1 = code
1af70 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
1af80 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
1af90 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67  el, j, bRev, reg
1afa0 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28  Base+j);.    if(
1afb0 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29   r1!=regBase+j )
1afc0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 67  {.      if( nReg
1afd0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==1 ){.        s
1afe0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1aff0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1b000 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Base);.        r
1b010 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20  egBase = r1;.   
1b020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b030 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b040 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
1b050 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b   r1, regBase+j);
1b060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b070 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1b080 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1b090 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
1b0a0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1b0b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b0c0 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28  _IN );.    if( (
1b0d0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1b0e0 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f   & (WO_ISNULL|WO
1b0f0 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _IN))==0 ){.    
1b100 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
1b110 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
1b120 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
1b130 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75  ite3ExprCodeIsNu
1b140 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74  llJump(v, pRight
1b150 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65  , regBase+j, pLe
1b160 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
1b170 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b       if( zAff ){
1b180 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1b190 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1b1a0 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66  ity(pRight, zAff
1b1b0 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  [j])==SQLITE_AFF
1b1c0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _NONE ){.       
1b1d0 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c     zAff[j] = SQL
1b1e0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
1b1f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b200 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
1b210 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
1b220 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66  ange(pRight, zAf
1b230 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  f[j]) ){.       
1b240 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c     zAff[j] = SQL
1b250 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
1b260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b270 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41      }.  }.  *pzA
1b280 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74  ff = zAff;.  ret
1b290 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a  urn regBase;.}..
1b2a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b2b0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
1b2c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1b2d0 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65  s a helper for e
1b2e0 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
1b2f0 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70  () below.**.** p
1b300 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65  Str holds the te
1b310 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  xt of an express
1b320 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65 20  ion that we are 
1b330 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20  building up one 
1b340 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d  term.** at a tim
1b350 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1b360 20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d   adds a new term
1b370 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1b380 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
1b390 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65 70 61  * Terms are sepa
1b3a0 72 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20  rated by AND so 
1b3b0 61 64 64 20 74 68 65 20 22 41 4e 44 22 20 74 65  add the "AND" te
1b3c0 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e  xt for second an
1b3d0 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  d subsequent.** 
1b3e0 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  terms only..*/.s
1b3f0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
1b400 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20  inAppendTerm(.  
1b410 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20  StrAccum *pStr, 
1b420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b430 68 65 20 74 65 78 74 20 65 78 70 72 65 73 73 69  he text expressi
1b440 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a  on being built *
1b450 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20  /.  int iTerm,  
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73  /* Index of this
1b480 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73   term.  First is
1b490 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74   zero */.  const
1b4a0 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20   char *zColumn, 
1b4b0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1b4c0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  f the column */.
1b4d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
1b4e0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p             /*
1b4f0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
1b500 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  rator */.){.  if
1b510 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65  ( iTerm ) sqlite
1b520 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
1b530 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35  pStr, " AND ", 5
1b540 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
1b550 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
1b560 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20   zColumn, -1);. 
1b570 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1b580 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70  Append(pStr, zOp
1b590 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 1);.  sqlite3S
1b5a0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1b5b0 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a  tr, "?", 1);.}..
1b5c0 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
1b5d0 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65 73 20  Level describes 
1b5e0 61 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 73  a strategy for s
1b5f0 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54  canning table pT
1b600 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ab. This .** fun
1b610 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
1b620 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
1b630 69 6e 67 20 62 75 66 66 65 72 20 63 6f 6e 74 61  ing buffer conta
1b640 69 6e 69 6e 67 20 61 20 64 65 73 63 72 69 70 74  ining a descript
1b650 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ion.** of the su
1b660 62 73 65 74 20 6f 66 20 74 61 62 6c 65 20 72 6f  bset of table ro
1b670 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68  ws scanned by th
1b680 65 20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68  e strategy in th
1b690 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20  e form of an.** 
1b6a0 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  SQL expression. 
1b6b0 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  Or, if all rows 
1b6c0 61 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c  are scanned, NUL
1b6d0 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
1b6e0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1b6f0 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a  , if the query:.
1b700 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
1b710 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
1b720 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a  =1 AND b>2;.**.*
1b730 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65  * is run and the
1b740 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  re is an index o
1b750 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74  n (a, b), then t
1b760 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1b770 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67  urns a.** string
1b780 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   similar to:.**.
1b790 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e  **   "a=? AND b>
1b7a0 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  ?".**.** The ret
1b7b0 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  urned pointer po
1b7c0 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ints to memory o
1b7d0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1b7e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a  ite3DbMalloc()..
1b7f0 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73  ** It is the res
1b800 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
1b810 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65  he caller to fre
1b820 65 20 74 68 65 20 62 75 66 66 65 72 20 77 68 65  e the buffer whe
1b830 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f  n it is.** no lo
1b840 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a  nger required..*
1b850 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65  /.static char *e
1b860 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
1b870 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
1b880 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20  ereLoop *pLoop, 
1b890 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
1b8a0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
1b8b0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
1b8c0 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
1b8d0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1b8e0 65 2e 6e 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20  e.nEq;.  int i, 
1b8f0 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  j;.  Column *aCo
1b900 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a  l = pTab->aCol;.
1b910 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20    int *aiColumn 
1b920 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
1b930 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74  mn;.  StrAccum t
1b940 78 74 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65  xt;..  if( pInde
1b950 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  x==0 ) return 0;
1b960 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26  .  if( nEq==0 &&
1b970 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1b980 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49   & (WHERE_BTM_LI
1b990 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
1b9a0 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  MIT))==0 ){.    
1b9b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1b9c0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
1b9d0 6e 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20  nit(&txt, 0, 0, 
1b9e0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
1b9f0 48 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64  H);.  txt.db = d
1ba00 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  b;.  sqlite3StrA
1ba10 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c  ccumAppend(&txt,
1ba20 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72   " (", 2);.  for
1ba30 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b  (i=0; i<nEq; i++
1ba40 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70  ){.    explainAp
1ba50 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69  pendTerm(&txt, i
1ba60 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  , aCol[aiColumn[
1ba70 69 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b  i]].zName, "=");
1ba80 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20  .  }..  j = i;. 
1ba90 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1baa0 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ags&WHERE_BTM_LI
1bab0 4d 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  MIT ){.    char 
1bac0 2a 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d  *z = (j==pIndex-
1bad0 3e 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f  >nColumn ) ? "ro
1bae0 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
1baf0 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
1bb00 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
1bb10 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c  dTerm(&txt, i++,
1bb20 20 7a 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20   z, ">");.  }.  
1bb30 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1bb40 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  gs&WHERE_TOP_LIM
1bb50 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  IT ){.    char *
1bb60 7a 20 3d 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e  z = (j==pIndex->
1bb70 6e 43 6f 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77  nColumn ) ? "row
1bb80 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c  id" : aCol[aiCol
1bb90 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
1bba0 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
1bbb0 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c  Term(&txt, i, z,
1bbc0 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   "<");.  }.  sql
1bbd0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1bbe0 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29  nd(&txt, ")", 1)
1bbf0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1bc00 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
1bc10 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&txt);.}../*.**
1bc20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1bc30 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
1bc40 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
1bc50 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e  ssing an EXPLAIN
1bc60 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63   QUERY PLAN.** c
1bc70 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71  ommand. If the q
1bc80 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69  uery being compi
1bc90 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49  led is an EXPLAI
1bca0 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20  N QUERY PLAN, a 
1bcb0 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64  single.** record
1bcc0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
1bcd0 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72   output to descr
1bce0 69 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63  ibe the table sc
1bcf0 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a  an strategy in .
1bd00 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ** pLevel..*/.st
1bd10 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
1bd20 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73  nOneScan(.  Pars
1bd30 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1bd50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
1bd60 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
1bd70 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
1bd80 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20    /* Table list 
1bd90 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73  this loop refers
1bda0 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65   to */.  WhereLe
1bdb0 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20  vel *pLevel,    
1bdc0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e           /* Scan
1bdd0 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70   to write OP_Exp
1bde0 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20  lain opcode for 
1bdf0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be10 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
1be20 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e  r "level" column
1be30 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
1be40 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
1be50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be60 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72  /* Value for "fr
1be70 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  om" column of ou
1be80 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63  tput */.  u16 wc
1be90 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
1bea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1beb0 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  gs passed to sql
1bec0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1bed0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61   */.){.  if( pPa
1bee0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
1bef0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
1bf00 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1bf10 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
1bf20 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
1bf30 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
1bf40 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
1bf50 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63     /* VM being c
1bf60 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20  onstructed */.  
1bf70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1bf80 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
1bf90 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
1bfa0 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
1bfb0 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20  zMsg;           
1bfc0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
1bfd0 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75  to add to EQP ou
1bfe0 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tput */.    int 
1bff0 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  iId = pParse->iS
1c000 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c  electId;  /* Sel
1c010 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73  ect id (left-mos
1c020 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29  t output column)
1c030 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65   */.    int isSe
1c040 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  arch;           
1c050 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
1c060 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73  r a SEARCH. Fals
1c070 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20  e for SCAN. */. 
1c080 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c     WhereLoop *pL
1c090 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
1c0a0 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c   /* The controll
1c0b0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ing WhereLoop ob
1c0c0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20  ject */.    u32 
1c0d0 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
1c0e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1c0f0 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  gs that describe
1c100 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20   this loop */.. 
1c110 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
1c120 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66  l->pWLoop;.    f
1c130 6c 61 67 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73  lags = pLoop->ws
1c140 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 28  Flags;.    if( (
1c150 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54  flags&WHERE_MULT
1c160 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46  I_OR) || (wctrlF
1c170 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41  lags&WHERE_ONETA
1c180 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75  BLE_ONLY) ) retu
1c190 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63  rn;..    isSearc
1c1a0 68 20 3d 20 28 66 6c 61 67 73 26 28 57 48 45 52  h = (flags&(WHER
1c1b0 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
1c1c0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30  E_TOP_LIMIT))!=0
1c1d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
1c1e0 28 28 66 6c 61 67 73 26 57 48 45 52 45 5f 56 49  ((flags&WHERE_VI
1c1f0 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26  RTUALTABLE)==0 &
1c200 26 20 28 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  & (pLoop->u.btre
1c210 65 2e 6e 45 71 3e 30 29 29 0a 20 20 20 20 20 20  e.nEq>0)).      
1c220 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46        || (wctrlF
1c230 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45  lags&(WHERE_ORDE
1c240 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52  RBY_MIN|WHERE_OR
1c250 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20  DERBY_MAX));..  
1c260 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1c270 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
1c280 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45 41 52  , isSearch?"SEAR
1c290 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20  CH":"SCAN");.   
1c2a0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
1c2b0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  ect ){.      zMs
1c2c0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1c2d0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1c2e0 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20  s SUBQUERY %d", 
1c2f0 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c  zMsg,pItem->iSel
1c300 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ectId);.    }els
1c310 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  e{.      zMsg = 
1c320 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1c330 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41  db, zMsg, "%s TA
1c340 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70  BLE %s", zMsg, p
1c350 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
1c360 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74    }..    if( pIt
1c370 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
1c380 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1c390 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1c3a0 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c  Msg, "%s AS %s",
1c3b0 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41   zMsg, pItem->zA
1c3c0 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lias);.    }.   
1c3d0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 57   if( (flags & (W
1c3e0 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56  HERE_IPK|WHERE_V
1c3f0 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30  IRTUALTABLE))==0
1c400 0a 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e  .     && pLoop->
1c410 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
1c420 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63  0.    ){.      c
1c430 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78  har *zWhere = ex
1c440 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28  plainIndexRange(
1c450 64 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65 6d  db, pLoop, pItem
1c460 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a  ->pTab);.      z
1c470 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1c480 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1c490 22 25 73 20 55 53 49 4e 47 20 25 73 25 73 49 4e  "%s USING %s%sIN
1c4a0 44 45 58 25 73 25 73 25 73 22 2c 20 7a 4d 73 67  DEX%s%s%s", zMsg
1c4b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 28 66  , .          ((f
1c4c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
1c4d0 50 5f 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41  P_INDEX)?"AUTOMA
1c4e0 54 49 43 20 22 3a 22 22 29 2c 0a 20 20 20 20 20  TIC ":""),.     
1c4f0 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57       ((flags & W
1c500 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22  HERE_IDX_ONLY)?"
1c510 43 4f 56 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a  COVERING ":""),.
1c520 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
1c530 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
1c540 4e 44 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20  NDEX)?"":" "),. 
1c550 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
1c560 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
1c570 44 45 58 29 3f 22 22 3a 20 70 4c 6f 6f 70 2d 3e  DEX)?"": pLoop->
1c580 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
1c590 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
1c5a0 20 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29    zWhere.      )
1c5b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
1c5c0 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65  bFree(db, zWhere
1c5d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1c5e0 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
1c5f0 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67  IPK)!=0 && (flag
1c600 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
1c610 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  AINT)!=0 ){.    
1c620 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1c630 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1c640 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54  g, "%s USING INT
1c650 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1c660 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20  ", zMsg);..     
1c670 20 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52   if( flags&(WHER
1c680 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
1c690 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a  E_COLUMN_IN) ){.
1c6a0 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
1c6b0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1c6c0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
1c6d0 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid=?)", zMsg);.
1c6e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c6f0 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54  (flags&WHERE_BOT
1c700 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f  H_LIMIT)==WHERE_
1c710 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  BOTH_LIMIT ){.  
1c720 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1c730 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1c740 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1c750 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29  d>? AND rowid<?)
1c760 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
1c770 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26  }else if( flags&
1c780 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1c790 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
1c7a0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1c7b0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1c7c0 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67  (rowid>?)", zMsg
1c7d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1c7e0 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54  f( flags&WHERE_T
1c7f0 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
1c800 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1c810 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1c820 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c  Msg, "%s (rowid<
1c830 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
1c840 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
1c850 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1c860 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65  RTUALTABLE.    e
1c870 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
1c880 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1c890 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  BLE)!=0 ){.     
1c8a0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
1c8b0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
1c8c0 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20 54 41  , "%s VIRTUAL TA
1c8d0 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22  BLE INDEX %d:%s"
1c8e0 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20  , zMsg,.        
1c8f0 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
1c900 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
1c910 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64  pLoop->u.vtab.id
1c920 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  xStr);.    }.#en
1c930 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  dif.    zMsg = s
1c940 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1c950 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c 20 7a  b, zMsg, "%s", z
1c960 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
1c970 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1c980 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20  P_Explain, iId, 
1c990 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a  iLevel, iFrom, z
1c9a0 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
1c9b0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
1c9c0 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e  define explainOn
1c9d0 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c  eScan(u,v,w,x,y,
1c9e0 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  z).#endif /* SQL
1c9f0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
1ca00 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   */.../*.** Gene
1ca10 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
1ca20 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69  e start of the i
1ca30 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e  Level-th loop in
1ca40 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1ca50 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
1ca60 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79  ion described by
1ca70 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74   pWInfo..*/.stat
1ca80 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f  ic Bitmask codeO
1ca90 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57  neLoopStart(.  W
1caa0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1cab0 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20  ,   /* Complete 
1cac0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
1cad0 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
1cae0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  se */.  int iLev
1caf0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  el,          /* 
1cb00 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70  Which level of p
1cb10 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c  WInfo->a[] shoul
1cb20 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  d be coded */.  
1cb30 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
1cb40 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61       /* Which ta
1cb50 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74  bles are current
1cb60 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ly available */.
1cb70 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20  ){.  int j, k;  
1cb80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1cb90 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1cba0 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
1cbb0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
1cbc0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1cbd0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  table */.  int a
1cbe0 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20  ddrNxt;         
1cbf0 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
1cc00 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1cc10 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61  h the next IN ca
1cc20 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74  se */.  int omit
1cc30 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  Table;       /* 
1cc40 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74  True if we use t
1cc50 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f  he index only */
1cc60 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
1cc70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1cc80 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
1cc90 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
1cca0 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  der */.  WhereLe
1ccb0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a  vel *pLevel;  /*
1ccc0 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c   The where level
1ccd0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
1cce0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
1ccf0 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68  op;    /* The Wh
1cd00 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62  ereLoop object b
1cd10 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
1cd20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1cd30 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73  ;    /* Decompos
1cd40 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74  ition of the ent
1cd50 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ire WHERE clause
1cd60 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1cd70 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
1cd80 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45        /* A WHERE
1cd90 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
1cda0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1cdd0 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  text */.  Vdbe *
1cde0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1cdf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ce00 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75   prepared stmt u
1ce10 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1ce20 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ns */.  struct S
1ce30 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
1ce40 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20  bItem;  /* FROM 
1ce50 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e  clause term bein
1ce60 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
1ce70 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20   addrBrk;       
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ce90 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
1cea0 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ak out of the lo
1ceb0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
1cec0 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cont;           
1ced0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1cee0 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
1cef0 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65   with next cycle
1cf00 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64   */.  int iRowid
1cf10 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
1cf20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72  /* Rowid is stor
1cf30 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ed in this regis
1cf40 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f  ter, if not zero
1cf50 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61   */.  int iRelea
1cf60 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  seReg = 0;      
1cf70 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72  /* Temp register
1cf80 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20   to free before 
1cf90 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 42  returning */.  B
1cfa0 69 74 6d 61 73 6b 20 6e 65 77 4e 6f 74 52 65 61  itmask newNotRea
1cfb0 64 79 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  dy;      /* Retu
1cfc0 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 70  rn value */..  p
1cfd0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
1cfe0 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50  pParse;.  v = pP
1cff0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70  arse->pVdbe;.  p
1d000 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57  WC = &pWInfo->sW
1d010 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  C;.  pLevel = &p
1d020 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d  WInfo->a[iLevel]
1d030 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  ;.  pLoop = pLev
1d040 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54  el->pWLoop;.  pT
1d050 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f  abItem = &pWInfo
1d060 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
1d070 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
1d080 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
1d090 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76  >iCursor;.  bRev
1d0a0 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76 4d   = (pWInfo->revM
1d0b0 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b 0a  ask>>iLevel)&1;.
1d0c0 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70    omitTable = (p
1d0d0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1d0e0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
1d0f0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26  =0 .           &
1d100 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
1d110 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
1d120 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 20  RCE_TABLE)==0;. 
1d130 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1d140 28 28 76 2c 20 22 42 65 67 69 6e 20 4a 6f 69 6e  ((v, "Begin Join
1d150 20 4c 6f 6f 70 20 25 64 22 2c 20 69 4c 65 76 65   Loop %d", iLeve
1d160 6c 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  l));..  /* Creat
1d170 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65  e labels for the
1d180 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f   "break" and "co
1d190 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74  ntinue" instruct
1d1a0 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ions.  ** for th
1d1b0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20  e current loop. 
1d1c0 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b   Jump to addrBrk
1d1d0 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
1d1e0 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75   a loop..  ** Ju
1d1f0 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f  mp to cont to go
1d200 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
1d210 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
1d220 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c  on of the.  ** l
1d230 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  oop..  **.  ** W
1d240 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20  hen there is an 
1d250 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20  IN operator, we 
1d260 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64  also have a "add
1d270 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74  rNxt" label that
1d280 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63  .  ** means to c
1d290 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
1d2a0 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63   next IN value c
1d2b0 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65  ombination.  Whe
1d2c0 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65  n.  ** there are
1d2d0 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   no IN operators
1d2e0 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69   in the constrai
1d2f0 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78  nts, the "addrNx
1d300 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73  t" label.  ** is
1d310 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64   the same as "ad
1d320 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61  drBrk"..  */.  a
1d330 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  ddrBrk = pLevel-
1d340 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65  >addrBrk = pLeve
1d350 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c  l->addrNxt = sql
1d360 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1d370 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74  l(v);.  addrCont
1d380 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
1d390 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
1d3a0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
1d3b0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1d3c0 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
1d3d0 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
1d3e0 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61  JOIN, allocate a
1d3f0 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  nd.  ** initiali
1d400 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ze a memory cell
1d410 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66   that records if
1d420 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63   this table matc
1d430 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77  hes any.  ** row
1d440 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62   of the left tab
1d450 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  le of the join..
1d460 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
1d470 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  l->iFrom>0 && (p
1d480 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74  TabItem[0].joint
1d490 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
1d4a0 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  0 ){.    pLevel-
1d4b0 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70  >iLeftJoin = ++p
1d4c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1d4d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d4e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1d4f0 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 0, pLevel->iLe
1d500 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62  ftJoin);.    Vdb
1d510 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
1d520 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d  it LEFT JOIN no-
1d530 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20  match flag"));. 
1d540 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
1d550 20 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20   case of a FROM 
1d560 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20  clause subquery 
1d570 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1d580 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
1d590 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76   if( pTabItem->v
1d5a0 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  iaCoroutine ){. 
1d5b0 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20     int regYield 
1d5c0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52  = pTabItem->regR
1d5d0 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
1d5e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d5f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
1d600 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
1d610 62 2d 31 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  b-1, regYield);.
1d620 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
1d630 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d640 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
1d650 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
1d660 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1d670 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 63 6f 2d  "next row of co-
1d680 72 6f 75 74 69 6e 65 20 25 73 22 2c 20 70 54 61  routine %s", pTa
1d690 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  bItem->pTab->zNa
1d6a0 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  me));.    sqlite
1d6b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d6c0 50 5f 49 66 2c 20 72 65 67 59 69 65 6c 64 2b 31  P_If, regYield+1
1d6d0 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
1d6e0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1d6f0 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23  Goto;.  }else..#
1d700 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d710 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1d720 20 20 69 66 28 20 20 28 70 4c 6f 6f 70 2d 3e 77    if(  (pLoop->w
1d730 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
1d740 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
1d750 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31  ){.    /* Case 1
1d760 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  :  The table is 
1d770 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e  a virtual-table.
1d780 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65    Use the VFilte
1d790 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20  r and VNext.    
1d7a0 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61  **          to a
1d7b0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a  ccess the data..
1d7c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69      */.    int i
1d7d0 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c  Reg;   /* P3 Val
1d7e0 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65  ue for OP_VFilte
1d7f0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
1d800 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20 20 20 20 69  rNotFound;.    i
1d810 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  nt nConstraint =
1d820 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 3b 0a   pLoop->nLTerm;.
1d830 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1d840 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1d850 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71  );.    iReg = sq
1d860 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
1d870 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74  e(pParse, nConst
1d880 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 61 64  raint+2);.    ad
1d890 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65  drNotFound = pLe
1d8a0 76 65 6c 2d 3e 61 64 64 72 42 72 6b 3b 0a 20 20  vel->addrBrk;.  
1d8b0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
1d8c0 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
1d8d0 20 20 20 20 20 20 69 6e 74 20 69 54 61 72 67 65        int iTarge
1d8e0 74 20 3d 20 69 52 65 67 2b 6a 2b 32 3b 0a 20 20  t = iReg+j+2;.  
1d8f0 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f      pTerm = pLoo
1d900 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20  p->aLTerm[j];.  
1d910 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
1d920 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1d930 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
1d940 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
1d950 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 45  ){.        codeE
1d960 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
1d970 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
1d980 6c 2c 20 6a 2c 20 62 52 65 76 2c 20 69 54 61 72  l, j, bRev, iTar
1d990 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 61 64  get);.        ad
1d9a0 64 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 70 4c 65  drNotFound = pLe
1d9b0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
1d9c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d9d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1d9e0 64 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  de(pParse, pTerm
1d9f0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
1da00 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   iTarget);.     
1da10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1da20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1da30 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 4c  , OP_Integer, pL
1da40 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  oop->u.vtab.idxN
1da50 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73  um, iReg);.    s
1da60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1da70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1da80 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 69 52 65  nConstraint, iRe
1da90 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g+1);.    sqlite
1daa0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1dab0 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c  P_VFilter, iCur,
1dac0 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 2c 20 69   addrNotFound, i
1dad0 52 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Reg,.           
1dae0 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
1daf0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c  ->u.vtab.idxStr,
1db00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db10 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e         pLoop->u.
1db20 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3f 20  vtab.needFree ? 
1db30 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f  P4_MPRINTF : P4_
1db40 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70 4c 6f  STATIC);.    pLo
1db50 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  op->u.vtab.needF
1db60 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ree = 0;.    for
1db70 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61  (j=0; j<nConstra
1db80 69 6e 74 20 26 26 20 6a 3c 31 36 3b 20 6a 2b 2b  int && j<16; j++
1db90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c  ){.      if( (pL
1dba0 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  oop->u.vtab.omit
1dbb0 4d 61 73 6b 3e 3e 6a 29 26 31 20 29 7b 0a 20 20  Mask>>j)&1 ){.  
1dbc0 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
1dbd0 6d 28 70 4c 65 76 65 6c 2c 20 70 4c 6f 6f 70 2d  m(pLevel, pLoop-
1dbe0 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b 0a 20 20 20  >aLTerm[j]);.   
1dbf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1dc00 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56  Level->op = OP_V
1dc10 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Next;.    pLevel
1dc20 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
1dc30 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
1dc40 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1dc50 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
1dc60 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1dc70 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 65  ange(pParse, iRe
1dc80 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  g, nConstraint+2
1dc90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1dca0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1dcb0 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  e, 1);.  }else.#
1dcc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1dcd0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1dce0 45 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4c 6f  E */..  if( (pLo
1dcf0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1dd00 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 26  ERE_IPK)!=0.   &
1dd10 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
1dd20 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
1dd30 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_IN|WHERE_COLUM
1dd40 4e 5f 45 51 29 29 21 3d 30 0a 20 20 29 7b 0a 20  N_EQ))!=0.  ){. 
1dd50 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57     /* Case 2:  W
1dd60 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72  e can directly r
1dd70 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c  eference a singl
1dd80 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20  e row using an. 
1dd90 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65     **          e
1dda0 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
1ddb0 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
1ddc0 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a  OWID field.  Or.
1ddd0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1dde0 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c  we reference mul
1ddf0 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67  tiple rows using
1de00 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e   a "rowid IN (..
1de10 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  .)".    **      
1de20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
1de30 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1de40 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ( pLoop->u.btree
1de50 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 69  .nEq==1 );.    i
1de60 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c  ReleaseReg = sql
1de70 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1de80 50 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65 72  Parse);.    pTer
1de90 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
1dea0 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  m[0];.    assert
1deb0 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
1dec0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
1ded0 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  >pExpr!=0 );.   
1dee0 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
1def0 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  le==0 );.    tes
1df00 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
1df10 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1df20 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
1df30 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
1df40 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1df50 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
1df60 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
1df70 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52 65 76 2c  pLevel, 0, bRev,
1df80 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
1df90 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
1dfa0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
1dfb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dfc0 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
1dfd0 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20  Int, iRowidReg, 
1dfe0 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71  addrNxt);.    sq
1dff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1e000 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
1e010 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20   iCur, addrNxt, 
1e020 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1e030 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1e040 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1e050 50 61 72 73 65 2c 20 69 52 6f 77 69 64 52 65 67  Parse, iRowidReg
1e060 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
1e070 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
1e080 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
1e090 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1e0a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1e0b0 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c  , "pk"));.    pL
1e0c0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
1e0d0 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  op;.  }else if( 
1e0e0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1e0f0 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a  & WHERE_IPK)!=0.
1e100 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f           && (pLo
1e110 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1e120 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1e130 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  )!=0.  ){.    /*
1e140 20 43 61 73 65 20 33 3a 20 20 57 65 20 68 61 76   Case 3:  We hav
1e150 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
1e160 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
1e170 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
1e180 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ld..    */.    i
1e190 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e  nt testOp = OP_N
1e1a0 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61  oop;.    int sta
1e1b0 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45  rt;.    int memE
1e1c0 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20  ndValue = 0;.   
1e1d0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61   WhereTerm *pSta
1e1e0 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20  rt, *pEnd;..    
1e1f0 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
1e200 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a 20 3d 20  e==0 );.    j = 
1e210 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  0;.    pStart = 
1e220 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66  pEnd = 0;.    if
1e230 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1e240 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
1e250 49 54 20 29 20 70 53 74 61 72 74 20 3d 20 70 4c  IT ) pStart = pL
1e260 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d  oop->aLTerm[j++]
1e270 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
1e280 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1e290 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20 70 45 6e  _TOP_LIMIT ) pEn
1e2a0 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  d = pLoop->aLTer
1e2b0 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20  m[j++];.    if( 
1e2c0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
1e2d0 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
1e2e0 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
1e2f0 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
1e300 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
1e310 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
1e320 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
1e330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e340 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
1e350 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74  t defines the st
1e360 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  art bound */.   
1e370 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70     int r1, rTemp
1e380 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  ;        /* Regi
1e390 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e  sters for holdin
1e3a0 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  g the start boun
1e3b0 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  dary */..      /
1e3c0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1e3d0 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b  constant maps TK
1e3e0 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63  _xx codes into c
1e3f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20  orresponding .  
1e400 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f      ** seek opco
1e410 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73  des.  It depends
1e420 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
1e430 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f   ordering of TK_
1e440 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xx.      */.    
1e450 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65    const u8 aMove
1e460 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
1e470 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20      /* TK_GT */ 
1e480 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20   OP_SeekGt,.    
1e490 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20         /* TK_LE 
1e4a0 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20  */  OP_SeekLe,. 
1e4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1e4c0 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74  LT */  OP_SeekLt
1e4d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
1e4e0 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GE */  OP_See
1e4f0 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  kGe.      };.   
1e500 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
1e510 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20  ==TK_GT+1 );    
1e520 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
1e530 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f  he ordering.. */
1e540 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e550 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
1e560 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66        /*  ... of
1e570 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65   the TK_xx value
1e580 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  s... */.      as
1e590 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
1e5a0 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+3 );      /* 
1e5b0 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74   ... is correcct
1e5c0 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  . */..      test
1e5d0 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74  case( pStart->wt
1e5e0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1e5f0 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
1e600 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
1e610 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72        pX = pStar
1e620 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
1e630 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
1e640 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e650 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f  Start->leftCurso
1e660 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
1e670 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1e680 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e690 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72  , pX->pRight, &r
1e6a0 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
1e6b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1e6c0 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70  , aMoveOp[pX->op
1e6d0 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61  -TK_GT], iCur, a
1e6e0 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
1e6f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1e700 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
1e710 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1e720 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1e730 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a  pParse, r1, 1);.
1e740 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1e750 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1e760 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20  se, rTemp);.    
1e770 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1e780 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20  evel, pStart);. 
1e790 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e7a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e7b0 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
1e7c0 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
1e7d0 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
1e7e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1e7f0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
1e800 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20  r *pX;.      pX 
1e810 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20  = pEnd->pExpr;. 
1e820 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
1e830 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1e840 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  rt( pEnd->leftCu
1e850 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
1e860 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
1e870 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1e880 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
1e890 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
1e8a0 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 45  62 */.      memE
1e8b0 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
1e8c0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1e8d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1e8e0 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1e8f0 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
1e900 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
1e910 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
1e920 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
1e930 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
1e940 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
1e950 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
1e960 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
1e970 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
1e980 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
1e990 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1e9a0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
1e9b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
1e9c0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
1e9d0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1e9e0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1e9f0 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1ea00 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
1ea10 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1ea20 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1ea30 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 69 66 28  = start;.    if(
1ea40 20 70 53 74 61 72 74 3d 3d 30 20 26 26 20 70 45   pStart==0 && pE
1ea50 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nd==0 ){.      p
1ea60 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
1ea70 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
1ea80 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
1ea90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1eaa0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
1eab0 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
1eac0 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
1ead0 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52  Noop ){.      iR
1eae0 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
1eaf0 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
1eb00 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1eb10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1eb20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1eb30 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
1eb40 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1eb50 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1eb60 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1eb70 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1eb80 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1eb90 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
1eba0 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
1ebb0 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
1ebc0 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1ebd0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1ebe0 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
1ebf0 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
1ec00 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1ec10 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1ec20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1ec30 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
1ec40 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34  ){.    /* Case 4
1ec50 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61  : A scan using a
1ec60 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  n index..    **.
1ec70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1ec80 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ec90 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f  may contain zero
1eca0 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74   or more equalit
1ecb0 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
1ecc0 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72    terms ("==" or
1ecd0 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29   "IN" operators)
1ece0 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
1ecf0 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20  he N.    **     
1ed00 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f      left-most co
1ed10 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
1ed20 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20  ex. It may also 
1ed30 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20  contain.    **  
1ed40 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74         inequalit
1ed50 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e  y constraints (>
1ed60 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f  , <, >= or <=) o
1ed70 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20  n the indexed.  
1ed80 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c    **         col
1ed90 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61  umn that immedia
1eda0 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65  tely follows the
1edb0 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f   N equalities. O
1edc0 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  nly .    **     
1edd0 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f      the right-mo
1ede0 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65  st column can be
1edf0 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d   an inequality -
1ee00 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20   the rest must. 
1ee10 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73     **         us
1ee20 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22  e the "==" and "
1ee30 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46  IN" operators. F
1ee40 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1ee50 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  he .    **      
1ee60 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28     index is on (
1ee70 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65  x,y,z), then the
1ee80 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73   following claus
1ee90 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20  es are all .    
1eea0 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  **         optim
1eeb0 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ized:.    **.   
1eec0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1eed0 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  =5.    **       
1eee0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31       x=5 AND y=1
1eef0 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1ef00 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30      x=5 AND y<10
1ef10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ef20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41     x=5 AND y>5 A
1ef30 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
1ef40 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1ef50 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a  D y=5 AND z<=10.
1ef60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1ef70 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74        The z<10 t
1ef80 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  erm of the follo
1ef90 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75  wing cannot be u
1efa0 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  sed, only.    **
1efb0 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35           the x=5
1efc0 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20   term:.    **.  
1efd0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1efe0 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20  x=5 AND z<10.   
1eff0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1f000 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f     N may be zero
1f010 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
1f020 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1f030 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ints..    **    
1f040 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72       If there ar
1f050 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20  e no inequality 
1f060 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
1f070 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a  n N is at.    **
1f080 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f           least o
1f090 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
1f0a0 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
1f0b0 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
1f0c0 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
1f0d0 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
1f0e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1f0f0 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61  onstraints but a
1f100 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63  n index is selec
1f110 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f  ted anyway, in o
1f120 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20  rder.    **     
1f130 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65      to force the
1f140 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f   output order to
1f150 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f   conform to an O
1f160 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20  RDER BY..    */ 
1f170 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e   .    static con
1f180 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d  st u8 aStartOp[]
1f190 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20   = {.      0,.  
1f1a0 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f      0,.      OP_
1f1b0 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20  Rewind,         
1f1c0 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f    /* 2: (!start_
1f1d0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1f1e0 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76  tartEq &&  !bRev
1f1f0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61  ) */.      OP_La
1f200 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1f210 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
1f220 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
1f230 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
1f240 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1f250 47 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Gt,           /*
1f260 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   4: (start_const
1f270 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1f280 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
1f290 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74  .      OP_SeekLt
1f2a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35  ,           /* 5
1f2b0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1f2c0 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
1f2d0 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
1f2e0 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20       OP_SeekGe, 
1f2f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20            /* 6: 
1f300 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1f310 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1f320 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
1f330 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20     OP_SeekLe    
1f340 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73          /* 7: (s
1f350 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1f360 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
1f370 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d    bRev) */.    }
1f380 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1f390 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d  st u8 aEndOp[] =
1f3a0 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70   {.      OP_Noop
1f3b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1f3c0 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72   0: (!end_constr
1f3d0 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20  aints) */.      
1f3e0 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20  OP_IdxGE,       
1f3f0 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f       /* 1: (end_
1f400 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21  constraints && !
1f410 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1f420 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20 20  P_IdxLT         
1f430 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63      /* 2: (end_c
1f440 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62 52  onstraints && bR
1f450 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  ev) */.    };.  
1f460 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
1f470 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20  p->u.btree.nEq; 
1f480 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
1f490 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a   or IN terms */.
1f4a0 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65      int isMinQue
1f4b0 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
1f4c0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1f4d0 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45   an optimized SE
1f4e0 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f  LECT min(x).. */
1f4f0 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65  .    int regBase
1f500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f510 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
1f520 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74  er holding const
1f530 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a  raint values */.
1f540 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20      int r1;     
1f550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f560 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
1f570 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  r */.    WhereTe
1f580 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20  rm *pRangeStart 
1f590 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c  = 0;  /* Inequal
1f5a0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
1f5b0 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f  t range start */
1f5c0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1f5d0 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20  pRangeEnd = 0;  
1f5e0 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
1f5f0 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
1f600 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69  nge end */.    i
1f610 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20  nt startEq;     
1f620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f630 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61  rue if range sta
1f640 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  rt uses ==, >= o
1f650 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
1f660 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20  endEq;          
1f670 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f680 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73   if range end us
1f690 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
1f6a0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
1f6b0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20  _constraints;   
1f6c0 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
1f6d0 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61  range is constra
1f6e0 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ined */.    int 
1f6f0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
1f700 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f710 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  er of constraint
1f720 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e   terms */.    In
1f730 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
1f740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f750 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
1f760 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
1f770 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f790 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1f7a0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
1f7b0 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52  .    int nExtraR
1f7c0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
1f7d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1f7e0 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e  xtra registers n
1f7f0 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  eeded */.    int
1f800 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1f810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
1f820 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  truction opcode 
1f830 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
1f840 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20  artAff;         
1f850 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
1f860 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e  for start of ran
1f870 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ge constraint */
1f880 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41  .    char *zEndA
1f890 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
1f8a0 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
1f8b0 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63  r end of range c
1f8c0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20  onstraint */..  
1f8d0 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e    pIdx = pLoop->
1f8e0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
1f8f0 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c      iIdxCur = pL
1f900 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
1f910 20 20 20 6b 20 3d 20 28 6e 45 71 3d 3d 70 49 64     k = (nEq==pId
1f920 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20  x->nColumn ? -1 
1f930 3a 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  : pIdx->aiColumn
1f940 5b 6e 45 71 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  [nEq]);..    /* 
1f950 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74  If this loop sat
1f960 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72  isfies a sort or
1f970 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72  der (pOrderBy) r
1f980 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20  equest that .   
1f990 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74   ** was passed t
1f9a0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1f9b0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22  to implement a "
1f9c0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e  SELECT min(x) ..
1f9d0 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ." .    ** query
1f9e0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
1f9f0 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f  r will only allo
1fa00 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75  w the loop to ru
1fa10 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73  n for.    ** a s
1fa20 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e  ingle iteration.
1fa30 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1fa40 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72   the first row r
1fa50 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73  eturned.    ** s
1fa60 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61  hould not have a
1fa70 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72   NULL value stor
1fa80 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f  ed in 'x'. If co
1fa90 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20  lumn 'x' is.    
1faa0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  ** the first one
1fab0 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65   after the nEq e
1fac0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1fad0 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
1fae0 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65  ,.    ** this re
1faf0 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63  quires some spec
1fb00 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
1fb10 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57    */.    if( (pW
1fb20 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1fb30 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  &WHERE_ORDERBY_M
1fb40 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  IN)!=0.     && (
1fb50 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d  pWInfo->bOBSat!=
1fb60 30 29 0a 20 20 20 20 20 26 26 20 28 70 49 64 78  0).     && (pIdx
1fb70 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20  ->nColumn>nEq). 
1fb80 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61     ){.      /* a
1fb90 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
1fba0 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a  >nExpr==1 ); */.
1fbb0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
1fbc0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
1fbd0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
1fbe0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
1fbf0 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  Eq] ); */.      
1fc00 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a  isMinQuery = 1;.
1fc10 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
1fc20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
1fc30 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71  /* Find any ineq
1fc40 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1fc50 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
1fc60 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20  start and end . 
1fc70 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e     ** of the ran
1fc80 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ge. .    */.    
1fc90 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  j = nEq;.    if(
1fca0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1fcb0 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1fcc0 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
1fcd0 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e  eStart = pLoop->
1fce0 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20  aLTerm[j++];.   
1fcf0 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
1fd00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1fd10 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1fd20 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
1fd30 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
1fd40 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  End = pLoop->aLT
1fd50 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20  erm[j++];.      
1fd60 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
1fd70 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
1fd80 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
1fd90 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74  aluate all const
1fda0 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e  raint terms usin
1fdb0 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a  g == or IN.    *
1fdc0 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
1fdd0 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
1fde0 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61  terms in an arra
1fdf0 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  y of registers. 
1fe00 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
1fe10 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a  t regBase..    *
1fe20 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  /.    regBase = 
1fe30 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
1fe40 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c 65 76  erms(pParse,pLev
1fe50 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61 52 65  el,bRev,nExtraRe
1fe60 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  g,&zStartAff);. 
1fe70 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c     zEndAff = sql
1fe80 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
1fe90 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41  rse->db, zStartA
1fea0 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  ff);.    addrNxt
1feb0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1fec0 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  xt;..    /* If w
1fed0 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65  e are doing a re
1fee0 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e  verse order scan
1fef0 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67   on an ascending
1ff00 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a   index, or.    *
1ff10 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65  * a forward orde
1ff20 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63  r scan on a desc
1ff30 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e  ending index, in
1ff40 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20  terchange the . 
1ff50 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20     ** start and 
1ff60 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67  end terms (pRang
1ff70 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67  eStart and pRang
1ff80 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  eEnd)..    */.  
1ff90 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78 2d    if( (nEq<pIdx-
1ffa0 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76  >nColumn && bRev
1ffb0 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  ==(pIdx->aSortOr
1ffc0 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
1ffd0 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20 7c  _SO_ASC)).     |
1ffe0 7c 20 28 62 52 65 76 20 26 26 20 70 49 64 78 2d  | (bRev && pIdx-
1fff0 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6e 45 71 29 0a 20  >nColumn==nEq). 
20000 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50     ){.      SWAP
20010 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52  (WhereTerm *, pR
20020 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53  angeEnd, pRangeS
20030 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  tart);.    }..  
20040 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
20050 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67  geStart && pRang
20060 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
20070 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
20080 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
20090 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67 65  eStart && pRange
200a0 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
200b0 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
200c0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
200d0 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64  End && pRangeEnd
200e0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
200f0 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _LE );.    testc
20100 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
20110 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  & pRangeEnd->eOp
20120 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
20130 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20  ;.    startEq = 
20140 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20  !pRangeStart || 
20150 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
20160 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
20170 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45  WO_GE);.    endE
20180 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64  q =   !pRangeEnd
20190 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   || pRangeEnd->e
201a0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
201b0 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74  E|WO_GE);.    st
201c0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
201d0 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c  = pRangeStart ||
201e0 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20   nEq>0;..    /* 
201f0 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63  Seek the index c
20200 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
20210 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  rt of the range.
20220 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
20230 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
20240 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29  f( pRangeStart )
20250 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
20260 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61  ight = pRangeSta
20270 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
20280 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
20290 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
202a0 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
202b0 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
202c0 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77   (pRangeStart->w
202d0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
202e0 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
202f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20300 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
20310 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
20320 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
20330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20340 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20   zStartAff ){.  
20350 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
20360 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
20370 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
20380 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
20390 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
203a0 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
203b0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
203c0 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
203d0 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
203e0 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
203f0 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
20400 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
20410 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
20420 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
20430 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
20440 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
20450 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
20460 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
20470 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
20480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20490 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
204a0 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
204b0 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
204c0 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20  zStartAff[nEq]) 
204d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  ){.          zSt
204e0 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
204f0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
20500 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20510 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72    .      nConstr
20520 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65  aint++;.      te
20530 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
20540 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
20550 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
20560 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
20570 36 36 32 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  662 */.    }else
20580 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20   if( isMinQuery 
20590 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
205a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
205b0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
205c0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43  e+nEq);.      nC
205d0 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
205e0 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a     startEq = 0;.
205f0 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73        start_cons
20600 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20  traints = 1;.   
20610 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79   }.    codeApply
20620 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
20630 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
20640 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41 66 66  raint, zStartAff
20650 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61  );.    op = aSta
20660 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73  rtOp[(start_cons
20670 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73  traints<<2) + (s
20680 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65  tartEq<<1) + bRe
20690 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  v];.    assert( 
206a0 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  op!=0 );.    tes
206b0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65  tcase( op==OP_Re
206c0 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65 73 74  wind );.    test
206d0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73  case( op==OP_Las
206e0 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
206f0 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74  e( op==OP_SeekGt
20700 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20710 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20  ( op==OP_SeekGe 
20720 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
20730 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29   op==OP_SeekLe )
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 53 65 65 6b 4c 74 20 29 3b  op==OP_SeekLt );
20760 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
20770 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
20780 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
20790 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
207a0 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f  straint);..    /
207b0 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65  * Load the value
207c0 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c   for the inequal
207d0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
207e0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
207f0 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69  .    ** range (i
20800 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
20810 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
20820 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
20830 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20  angeEnd ){.     
20840 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
20850 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72  pRangeEnd->pExpr
20860 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
20870 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
20880 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  Remove(pParse, r
20890 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a  egBase+nEq, 1);.
208a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
208b0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
208c0 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
208d0 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  q);.      if( (p
208e0 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
208f0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
20900 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
20910 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
20920 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
20930 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  t, regBase+nEq, 
20940 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
20950 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64  }.      if( zEnd
20960 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
20970 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
20980 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
20990 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d  , zEndAff[nEq])=
209a0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
209b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
209c0 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72  Since the compar
209d0 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65  ison is to be pe
209e0 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20  rformed with no 
209f0 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20  conversions.    
20a00 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64        ** applied
20a10 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73   to the operands
20a20 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69  , set the affini
20a30 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  ty to apply to p
20a40 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20  Right to .      
20a50 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46      ** SQLITE_AF
20a60 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20  F_NONE.  */.    
20a70 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45        zEndAff[nE
20a80 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
20a90 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
20aa0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
20ab0 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
20ac0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
20ad0 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71  ght, zEndAff[nEq
20ae0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
20af0 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53  zEndAff[nEq] = S
20b00 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
20b10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20b20 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65 41 70  }  .      codeAp
20b30 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
20b40 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 71  se, regBase, nEq
20b50 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20  +1, zEndAff);.  
20b60 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
20b70 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
20b80 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  e( pRangeEnd->wt
20b90 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
20ba0 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
20bb0 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
20bc0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
20bd0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
20be0 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  db, zStartAff);.
20bf0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
20c00 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 45  e(pParse->db, zE
20c10 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20  ndAff);..    /* 
20c20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
20c30 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76  body */.    pLev
20c40 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
20c50 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
20c60 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  v);..    /* Chec
20c70 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63  k if the index c
20c80 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68  ursor is past th
20c90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  e end of the ran
20ca0 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20  ge. */.    op = 
20cb0 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e  aEndOp[(pRangeEn
20cc0 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b  d || nEq) * (1 +
20cd0 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73   bRev)];.    tes
20ce0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f  tcase( op==OP_No
20cf0 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  op );.    testca
20d00 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45  se( op==OP_IdxGE
20d10 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20d20 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  ( op==OP_IdxLT )
20d30 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50  ;.    if( op!=OP
20d40 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
20d50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20d60 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Int(v, op, iIdxC
20d70 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67  ur, addrNxt, reg
20d80 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
20d90 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
20da0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
20db0 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a   endEq!=bRev ?1:
20dc0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
20dd0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 69  * If there are i
20de0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
20df0 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61  aints, check tha
20e00 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  t the value.    
20e10 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
20e20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
20e30 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72  inequality contr
20e40 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ains is not NULL
20e50 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69  ..    ** If it i
20e60 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  s, jump to the n
20e70 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
20e80 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a   the loop..    *
20e90 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74  /.    r1 = sqlit
20ea0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
20eb0 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  rse);.    testca
20ec0 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  se( pLoop->wsFla
20ed0 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
20ee0 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74  IMIT );.    test
20ef0 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46  case( pLoop->wsF
20f00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
20f10 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66  _LIMIT );.    if
20f20 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
20f30 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c  s & (WHERE_BTM_L
20f40 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
20f50 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20  IMIT))!=0 ){.   
20f60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20f70 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
20f80 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c  n, iIdxCur, nEq,
20f90 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
20fa0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20fb0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20   OP_IsNull, r1, 
20fc0 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d  addrCont);.    }
20fd0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
20fe0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
20ff0 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  e, r1);..    /* 
21000 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63  Seek the table c
21010 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72  ursor, if requir
21020 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c  ed */.    disabl
21030 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
21040 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
21050 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
21060 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a  el, pRangeEnd);.
21070 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62      if( !omitTab
21080 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  le ){.      iRow
21090 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65  idReg = iRelease
210a0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
210b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
210c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
210d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
210e0 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72  dxRowid, iIdxCur
210f0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
21100 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21110 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
21120 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
21130 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
21140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21150 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72  v, OP_Seek, iCur
21160 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f  , iRowidReg);  /
21170 2a 20 44 65 66 65 72 72 65 64 20 73 65 65 6b 20  * Deferred seek 
21180 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
21190 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74   Record the inst
211a0 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  ruction used to 
211b0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
211c0 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20  op. Disable .   
211d0 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   ** WHERE clause
211e0 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75   terms made redu
211f0 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64  ndant by the ind
21200 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20  ex range scan.. 
21210 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
21220 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
21230 48 45 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20  HERE_ONEROW ){. 
21240 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
21250 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d  = OP_Noop;.    }
21260 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b  else if( bRev ){
21270 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
21280 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20  p = OP_Prev;.   
21290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
212a0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65  evel->op = OP_Ne
212b0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  xt;.    }.    pL
212c0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43  evel->p1 = iIdxC
212d0 75 72 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  ur;.    if( (pLo
212e0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
212f0 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d  ERE_CONSTRAINT)=
21300 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
21310 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
21320 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
21330 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65  CAN_STEP;.    }e
21340 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
21350 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30  t( pLevel->p5==0
21360 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
21370 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
21380 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
21390 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f  ZATION.  if( pLo
213a0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
213b0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a  ERE_MULTI_OR ){.
213c0 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20      /* Case 5:  
213d0 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  Two or more sepa
213e0 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74  rately indexed t
213f0 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
21400 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y OR.    **.    
21410 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
21420 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  **.    **   CREA
21430 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c  TE TABLE t1(a,b,
21440 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  c,d);.    **   C
21450 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
21460 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20  N t1(a);.    ** 
21470 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
21480 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20  2 ON t1(b);.    
21490 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
214a0 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20  X i3 ON t1(c);. 
214b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
214c0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
214d0 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37  WHERE a=5 OR b=7
214e0 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d   OR (c=11 AND d=
214f0 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  13).    **.    *
21500 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
21510 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  , there are thre
21520 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  e indexed terms 
21530 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e  connected by OR.
21540 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20  .    ** The top 
21550 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b  of the loop look
21560 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  s like this:.   
21570 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
21580 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31      Null       1
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65  # Zero the rowse
215b0 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a  t in reg 1.    *
215c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66  *.    ** Then, f
215d0 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20  or each indexed 
215e0 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  term, the follow
215f0 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ing. The argumen
21600 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77  ts to.    ** Row
21610 53 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68  SetTest are such
21620 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
21630 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
21640 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20  ow is inserted. 
21650 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52     ** into the R
21660 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20  owSet. If it is 
21670 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c  already present,
21680 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74   control skips t
21690 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20  he.    ** Gosub 
216a0 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73  opcode and jumps
216b0 20 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65   straight to the
216c0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
216d0 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20  by WhereEnd().. 
216e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
216f0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
21700 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20  Begin(<term>).  
21710 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f    **          Ro
21720 77 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20  wSetTest        
21730 20 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65            # Inse
21740 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f  rt rowid into ro
21750 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  wset.    **     
21760 20 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20       Gosub      
21770 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  2 A.    **      
21780 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
21790 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  d().    **.    *
217a0 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * Following the 
217b0 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74  above, code to t
217c0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
217d0 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20  p. Label A, the 
217e0 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66  target.    ** of
217f0 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65   the Gosub above
21800 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69  , jumps to the i
21810 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74  nstruction right
21820 20 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e   after the Goto.
21830 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
21840 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
21850 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
21860 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
21870 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
21880 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
21890 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20  oto       B     
218a0 20 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65             # The
218b0 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65   loop is finishe
218c0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
218d0 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20         A: <loop 
218e0 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20  body>           
218f0 20 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64        # Return d
21900 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20  ata, whatever.. 
21910 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
21920 20 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20        Return    
21930 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
21940 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f    # Jump back to
21950 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a   the Gosub.    *
21960 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42  *.    **       B
21970 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f  : <after the loo
21980 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f  p>.    **.    */
21990 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65  .    WhereClause
219a0 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54   *pOrWc;    /* T
219b0 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f  he OR-clause bro
219c0 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62  ken out into sub
219d0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63  terms */.    Src
219e0 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20  List *pOrTab;   
219f0 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64      /* Shortened
21a00 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f   table list or O
21a10 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74  R-clause generat
21a20 69 6f 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  ion */.    Index
21a30 20 2a 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20   *pCov = 0;     
21a40 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e          /* Poten
21a50 74 69 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e  tial covering in
21a60 64 65 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  dex (or NULL) */
21a70 0a 20 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72  .    int iCovCur
21a80 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
21a90 2b 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73  +;  /* Cursor us
21aa0 65 64 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61  ed for index sca
21ab0 6e 73 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a  ns (if any) */..
21ac0 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75 72      int regRetur
21ad0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
21ae0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  em;           /*
21af0 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20 77   Register used w
21b00 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a  ith OP_Gosub */.
21b10 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65      int regRowse
21b20 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21b40 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f   Register for Ro
21b50 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  wSet object */. 
21b60 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20     int regRowid 
21b70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
21b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b90 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
21ba0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e   rowid */.    in
21bb0 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71  t iLoopBody = sq
21bc0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
21bd0 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74  el(v);  /* Start
21be0 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f   of loop body */
21bf0 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69  .    int iRetIni
21c00 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21c20 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65 67  * Address of reg
21c30 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20  Return init */. 
21c40 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54     int untestedT
21c50 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20  erms = 0;       
21c60 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65        /* Some te
21c70 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  rms not complete
21c80 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20  ly tested */.   
21c90 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cb0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21cc0 74 65 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  ter */.    Expr 
21cd0 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20  *pAndExpr = 0;  
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21cf0 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e   An ".. AND (...
21d00 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  )" expression */
21d10 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d  .   .    pTerm =
21d20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30   pLoop->aLTerm[0
21d30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
21d40 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61  Term!=0 );.    a
21d50 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
21d60 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20  perator & WO_OR 
21d70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
21d80 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
21d90 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30   TERM_ORINFO)!=0
21da0 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20   );.    pOrWc = 
21db0 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
21dc0 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65  o->wc;.    pLeve
21dd0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72  l->op = OP_Retur
21de0 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  n;.    pLevel->p
21df0 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a  1 = regReturn;..
21e00 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20      /* Set up a 
21e10 6e 65 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70  new SrcList in p
21e20 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67  OrTab containing
21e30 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
21e40 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20   scanned.    ** 
21e50 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20  by this loop in 
21e60 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e  the a[0] slot an
21e70 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74  d all notReady t
21e80 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20  ables in a[1..] 
21e90 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68  slots..    ** Th
21ea0 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53  is becomes the S
21eb0 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65  rcList in the re
21ec0 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20  cursive call to 
21ed0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
21ee0 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n()..    */.    
21ef0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
21f00 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  el>1 ){.      in
21f10 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20  t nNotReady;    
21f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f30 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  The number of no
21f40 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f  tReady tables */
21f50 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
21f60 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67  cList_item *orig
21f70 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  Src;     /* Orig
21f80 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62  inal list of tab
21f90 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f  les */.      nNo
21fa0 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d  tReady = pWInfo-
21fb0 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c  >nLevel - iLevel
21fc0 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54   - 1;.      pOrT
21fd0 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63  ab = sqlite3Stac
21fe0 6b 41 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65  kAllocRaw(pParse
21ff0 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22010 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62    sizeof(*pOrTab
22020 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a  )+ nNotReady*siz
22030 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d  eof(pOrTab->a[0]
22040 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ));.      if( pO
22050 72 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  rTab==0 ) return
22060 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20   notReady;.     
22070 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20   pOrTab->nAlloc 
22080 3d 20 28 69 31 36 29 28 6e 4e 6f 74 52 65 61 64  = (i16)(nNotRead
22090 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f  y + 1);.      pO
220a0 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72  rTab->nSrc = pOr
220b0 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20  Tab->nAlloc;.   
220c0 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62     memcpy(pOrTab
220d0 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73  ->a, pTabItem, s
220e0 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29  izeof(*pTabItem)
220f0 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63  );.      origSrc
22100 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
22110 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f  ist->a;.      fo
22120 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65  r(k=1; k<=nNotRe
22130 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  ady; k++){.     
22140 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61     memcpy(&pOrTa
22150 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72  b->a[k], &origSr
22160 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f  c[pLevel[k].iFro
22170 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61  m], sizeof(pOrTa
22180 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20  b->a[k]));.     
22190 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
221a0 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49      pOrTab = pWI
221b0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
221c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69     }..    /* Ini
221d0 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73  tialize the rows
221e0 65 74 20 72 65 67 69 73 74 65 72 20 74 6f 20 63  et register to c
221f0 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20  ontain NULL. An 
22200 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20  SQL NULL is .   
22210 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
22220 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65  o an empty rowse
22230 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
22240 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65   Also initialize
22250 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f   regReturn to co
22260 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73  ntain the addres
22270 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63  s of the instruc
22280 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d  tion .    ** imm
22290 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
222a0 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e  ng the OP_Return
222b0 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
222c0 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73  f the loop. This
222d0 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69  .    ** is requi
222e0 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73  red in a few obs
222f0 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63  cure LEFT JOIN c
22300 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72  ases where contr
22310 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20  ol jumps.    ** 
22320 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20  over the top of 
22330 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68  the loop into th
22340 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e  e body of it. In
22350 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
22360 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72      ** correct r
22370 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20  esponse for the 
22380 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65  end-of-loop code
22390 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29   (the OP_Return)
223a0 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66   is to .    ** f
223b0 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
223c0 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
223d0 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20  ion, just as an 
223e0 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a  OP_Next does if.
223f0 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e      ** called on
22400 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   an uninitialize
22410 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f  d cursor..    */
22420 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
22430 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
22440 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
22450 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
22460 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50  regRowset = ++pP
22470 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
22480 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
22490 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
224a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
224b0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
224c0 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a   0, regRowset);.
224d0 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e      }.    iRetIn
224e0 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
224f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
22500 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75  eger, 0, regRetu
22510 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  rn);..    /* If 
22520 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  the original WHE
22530 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20 6f  RE clause is z o
22540 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78 31  f the form:  (x1
22550 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41   OR x2 OR ...) A
22560 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e  ND y.    ** Then
22570 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
22580 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73 20  xN, evaluate as 
22590 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
225a0 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20  n: xN AND z.    
225b0 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65 72  ** That way, ter
225c0 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72 65  ms in y that are
225d0 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20 74   factored into t
225e0 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77  he disjunction w
225f0 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70 69  ill.    ** be pi
22600 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20 72  cked up by the r
22610 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
22620 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
22630 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20  gin() below..   
22640 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75 61   **.    ** Actua
22650 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78 70  lly, each subexp
22660 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76 65  ression is conve
22670 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44 20  rted to "xN AND 
22680 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20 20  w" where w is.  
22690 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72 65    ** the "intere
226a0 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66 20  sting" terms of 
226b0 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20 64  z - terms that d
226c0 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
226d0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f   in the.    ** O
226e0 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
226f0 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
22700 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61 74  , and terms that
22710 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20 0a   are usable as .
22720 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 0a      ** indices..
22730 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
22740 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
22750 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70 6c 69 65  also only applie
22760 73 20 69 66 20 74 68 65 20 28 78 31 20 4f 52 20  s if the (x1 OR 
22770 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65 72 6d 0a  x2 OR ...) term.
22780 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f      ** is not co
22790 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 4f  ntained in the O
227a0 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
227b0 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20  FT JOIN..    ** 
227c0 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 3a  See ticket http:
227d0 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
227e0 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33 36 39 33  /src/info/f23693
227f0 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20 20 20 20  04e4.    */.    
22800 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31  if( pWC->nTerm>1
22810 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
22820 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  erm;.      for(i
22830 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57  Term=0; iTerm<pW
22840 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b  C->nTerm; iTerm+
22850 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
22860 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61   *pExpr = pWC->a
22870 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20  [iTerm].pExpr;. 
22880 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
22890 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
228a0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
228b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
228c0 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54     if( pWC->a[iT
228d0 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28  erm].wtFlags & (
228e0 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
228f0 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74  M_ORINFO) ) cont
22900 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
22910 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( (pWC->a[iTerm]
22920 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  .eOperator & WO_
22930 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ALL)==0 ) contin
22940 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  ue;.        pExp
22950 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
22960 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
22970 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
22980 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
22990 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
229a0 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72  se->db, pAndExpr
229b0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
229c0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
229d0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
229e0 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
229f0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
22a00 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45  TK_AND, 0, pAndE
22a10 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
22a20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
22a30 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e  ii=0; ii<pOrWc->
22a40 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
22a50 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
22a60 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d  OrTerm = &pOrWc-
22a70 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66  >a[ii];.      if
22a80 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
22a90 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28  ursor==iCur || (
22aa0 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
22ab0 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
22ac0 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
22ad0 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b  Info *pSubWInfo;
22ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
22af0 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d  o for single OR-
22b00 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20  term scan */.   
22b10 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78       Expr *pOrEx
22b20 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  pr = pOrTerm->pE
22b30 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
22b40 20 70 41 6e 64 45 78 70 72 20 26 26 20 21 45 78   pAndExpr && !Ex
22b50 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f  prHasProperty(pO
22b60 72 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rExpr, EP_FromJo
22b70 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  in) ){.         
22b80 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
22b90 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20   = pOrExpr;.    
22ba0 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20        pOrExpr = 
22bb0 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20  pAndExpr;.      
22bc0 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c    }.        /* L
22bd0 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
22be0 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
22bf0 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
22c00 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53  m. */.        pS
22c10 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  ubWInfo = sqlite
22c20 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
22c30 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45  se, pOrTab, pOrE
22c40 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  xpr, 0, 0,.     
22c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c60 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50     WHERE_OMIT_OP
22c70 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45  EN_CLOSE | WHERE
22c80 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20  _AND_ONLY |.    
22c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ca0 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f      WHERE_FORCE_
22cb0 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e  TABLE | WHERE_ON
22cc0 45 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f  ETABLE_ONLY, iCo
22cd0 76 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61  vCur);.        a
22ce0 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f  ssert( pSubWInfo
22cf0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
22d00 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
22d10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
22d20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
22d30 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  WInfo ){.       
22d40 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53     WhereLoop *pS
22d50 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  ubLoop;.        
22d60 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e    explainOneScan
22d70 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
22d80 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
22d90 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d  &pSubWInfo->a[0]
22da0 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c  , iLevel, pLevel
22db0 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20  ->iFrom, 0.     
22dc0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
22dd0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
22de0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
22df0 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
22e00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
22e10 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28     int iSet = ((
22e20 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ii==pOrWc->nTerm
22e30 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20  -1)?-1:ii);.    
22e40 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20          int r;. 
22e50 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
22e60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
22e70 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
22e80 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20  pTabItem->pTab, 
22e90 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20  -1, iCur, .     
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29      regRowid, 0)
22ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
22ee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
22ef0 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54  nt(v, OP_RowSetT
22f00 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a  est, regRowset,.
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
22f40 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c  entAddr(v)+2, r,
22f50 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20   iSet);.        
22f60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
22f70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22f80 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
22f90 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64  Return, iLoopBod
22fa0 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  y);..          /
22fb0 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d  * The pSubWInfo-
22fc0 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66  >untestedTerms f
22fd0 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74  lag means that t
22fe0 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20  his OR term.    
22ff0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
23000 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41  ed one or more A
23010 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e  ND term from a n
23020 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20  otReady table.  
23030 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  The.          **
23040 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
23050 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63  notReady table c
23060 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74  ould not be test
23070 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20  ed and will.    
23080 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
23090 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72   be tested later
230a0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
230b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
230c0 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
230d0 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64  Terms ) untested
230e0 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20  Terms = 1;..    
230f0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
23100 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63  of the OR-connec
23110 74 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70  ted terms are op
23120 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68  timized using th
23130 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20  e same.         
23140 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74   ** index, and t
23150 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  he index is open
23160 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
23170 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
23180 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20            ** by 
23190 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c  each call to sql
231a0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
231b0 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f   made by this lo
231c0 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20  op, it may.     
231d0 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69       ** be possi
231e0 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74 20  ble to use that 
231f0 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65 72  index as a cover
23200 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  ing index..     
23210 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
23220 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
23230 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
23240 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65  Begin() above re
23250 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e  sulted in a scan
23260 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
23270 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  ** uses an index
23280 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 65 69  , and this is ei
23290 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20 4f  ther the first O
232a0 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
232b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
232c0 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65 20 69  ocessed or the i
232d0 6e 64 65 78 20 69 73 20 74 68 65 20 73 61 6d 65  ndex is the same
232e0 20 61 73 20 74 68 61 74 20 75 73 65 64 20 62 79   as that used by
232f0 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20   all previous.  
23300 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
23310 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68  , set pCov to th
23320 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65  e candidate cove
23330 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65  ring index. Othe
23340 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20  rwise, set .    
23350 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f        ** pCov to
23360 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74   NULL to indicat
23370 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64  e that no candid
23380 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ate covering ind
23390 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20  ex will .       
233a0 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62     ** be availab
233b0 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  le..          */
233c0 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 4c  .          pSubL
233d0 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d  oop = pSubWInfo-
233e0 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20  >a[0].pWLoop;.  
233f0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 53 75          if( (pSu
23400 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  bLoop->wsFlags &
23410 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
23420 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
23430 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c   (pSubLoop->wsFl
23440 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
23450 5f 49 4e 44 45 58 29 3d 3d 30 0a 20 20 20 20 20  _INDEX)==0.     
23460 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20        && (ii==0 
23470 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62  || pSubLoop->u.b
23480 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f  tree.pIndex==pCo
23490 76 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  v).          ){.
234a0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
234b0 72 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61  rt( pSubWInfo->a
234c0 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f  [0].iIdxCur==iCo
234d0 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20  vCur );.        
234e0 20 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62 4c      pCov = pSubL
234f0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
23500 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  dex;.          }
23510 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23520 20 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20    pCov = 0;.    
23530 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
23540 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65     /* Finish the
23550 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   loop through ta
23560 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
23570 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
23580 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
23590 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
235a0 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20  d(pSubWInfo);.  
235b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
235c0 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
235d0 2d 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43  ->u.pCovidx = pC
235e0 6f 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76  ov;.    if( pCov
235f0 20 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   ) pLevel->iIdxC
23600 75 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20  ur = iCovCur;.  
23610 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29    if( pAndExpr )
23620 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70 72  {.      pAndExpr
23630 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  ->pLeft = 0;.   
23640 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
23650 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
23660 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20   pAndExpr);.    
23670 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
23680 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65  eChangeP1(v, iRe
23690 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64  tInit, sqlite3Vd
236a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
236b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
236c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
236d0 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
236e0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71  addrBrk);.    sq
236f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
23700 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f  Label(v, iLoopBo
23710 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57  dy);..    if( pW
23720 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29  Info->nLevel>1 )
23730 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65   sqlite3StackFre
23740 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  e(pParse->db, pO
23750 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21  rTab);.    if( !
23760 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20  untestedTerms ) 
23770 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
23780 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65  el, pTerm);.  }e
23790 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
237a0 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
237b0 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20  IMIZATION */..  
237c0 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a  {.    /* Case 6:
237d0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73    There is no us
237e0 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20  able index.  We 
237f0 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65  must do a comple
23800 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
23810 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65     scan of the e
23820 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20  ntire table..   
23830 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
23840 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20  onst u8 aStep[] 
23850 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f  = { OP_Next, OP_
23860 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74  Prev };.    stat
23870 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61  ic const u8 aSta
23880 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69  rt[] = { OP_Rewi
23890 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20  nd, OP_Last };. 
238a0 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d     assert( bRev=
238b0 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b  =0 || bRev==1 );
238c0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
238d0 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20  = aStep[bRev];. 
238e0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
238f0 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
23900 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74  ->p2 = 1 + sqlit
23910 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23920 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43  aStart[bRev], iC
23930 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
23940 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53    pLevel->p5 = S
23950 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
23960 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a  _FULLSCAN_STEP;.
23970 20 20 7d 0a 20 20 6e 65 77 4e 6f 74 52 65 61 64    }.  newNotRead
23980 79 20 3d 20 6e 6f 74 52 65 61 64 79 20 26 20 7e  y = notReady & ~
23990 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
239a0 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >sMaskSet, iCur)
239b0 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  ;..  /* Insert c
239c0 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72  ode to test ever
239d0 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  y subexpression 
239e0 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70  that can be comp
239f0 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70  letely.  ** comp
23a00 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
23a10 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
23a20 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
23a30 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
23a40 46 3a 20 52 2d 34 39 35 32 35 2d 35 30 39 33 35  F: R-49525-50935
23a50 20 54 65 72 6d 73 20 74 68 61 74 20 63 61 6e 6e   Terms that cann
23a60 6f 74 20 62 65 20 73 61 74 69 73 66 69 65 64 20  ot be satisfied 
23a70 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65  through.  ** the
23a80 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 20   use of indices 
23a90 62 65 63 6f 6d 65 20 74 65 73 74 73 20 74 68 61  become tests tha
23aa0 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  t are evaluated 
23ab0 61 67 61 69 6e 73 74 20 65 61 63 68 20 72 6f 77  against each row
23ac0 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 6c   of.  ** the rel
23ad0 65 76 61 6e 74 20 69 6e 70 75 74 20 74 61 62 6c  evant input tabl
23ae0 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  es..  */.  for(p
23af0 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70  Term=pWC->a, j=p
23b00 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20  WC->nTerm; j>0; 
23b10 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j--, pTerm++){. 
23b20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
23b30 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
23b40 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
23b50 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 49  _VIRTUAL ); /* I
23b60 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  MP: R-30575-1166
23b70 32 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73  2 */.    testcas
23b80 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
23b90 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29  s & TERM_CODED )
23ba0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
23bb0 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
23bc0 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
23bd0 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
23be0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
23bf0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65 77  >prereqAll & new
23c00 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  NotReady)!=0 ){.
23c10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23c20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
23c30 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20  Terms==0.       
23c40 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
23c50 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
23c60 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
23c70 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20  ONLY)!=0 );.    
23c80 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74    pWInfo->untest
23c90 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20  edTerms = 1;.   
23ca0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
23cb0 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72   }.    pE = pTer
23cc0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
23cd0 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
23ce0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
23cf0 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70  LeftJoin && !Exp
23d00 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
23d10 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
23d20 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
23d30 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23d40 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
23d50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f  arse, pE, addrCo
23d60 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
23d70 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72  FNULL);.    pTer
23d80 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
23d90 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20  RM_CODED;.  }.. 
23da0 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20   /* Insert code 
23db0 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70 6c  to test for impl
23dc0 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ied constraints 
23dd0 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69 74  based on transit
23de0 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68  ivity.  ** of th
23df0 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e  e "==" operator.
23e00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70  .  **.  ** Examp
23e10 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52 45  le: If the WHERE
23e20 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
23e30 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64   "t1.a=t2.b" and
23e40 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a   "t2.b=123".  **
23e50 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64 69   and we are codi
23e60 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  ng the t1 loop a
23e70 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 68  nd the t2 loop h
23e80 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64  as not yet coded
23e90 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63  ,.  ** then we c
23ea0 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22 74  annot use the "t
23eb0 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72  1.a=t2.b" constr
23ec0 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61 6e  aint, but we can
23ed0 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20 69   code.  ** the i
23ee0 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32 33  mplied "t1.a=123
23ef0 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20  " constraint..  
23f00 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  */.  for(pTerm=p
23f10 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54  WC->a, j=pWC->nT
23f20 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
23f30 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
23f40 72 20 2a 70 45 3b 0a 20 20 20 20 57 68 65 72 65  r *pE;.    Where
23f50 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20  Term *pAlt;.    
23f60 45 78 70 72 20 73 45 71 3b 0a 20 20 20 20 69 66  Expr sEq;.    if
23f70 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
23f80 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
23f90 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
23fa0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
23fb0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
23fc0 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c 57 4f 5f  r!=(WO_EQUIV|WO_
23fd0 45 51 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  EQ) ) continue;.
23fe0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
23ff0 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20  eftCursor!=iCur 
24000 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24010 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
24020 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  r;.    assert( !
24030 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
24040 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
24050 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
24060 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
24070 67 68 74 20 26 20 6e 65 77 4e 6f 74 52 65 61 64  ght & newNotRead
24080 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c  y)!=0 );.    pAl
24090 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  t = findTerm(pWC
240a0 2c 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75  , iCur, pTerm->u
240b0 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74  .leftColumn, not
240c0 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  Ready, WO_EQ|WO_
240d0 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  IN, 0);.    if( 
240e0 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pAlt==0 ) contin
240f0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74  ue;.    if( pAlt
24100 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
24110 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
24120 6e 75 65 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  nue;.    VdbeNoo
24130 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
24140 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63  gin transitive c
24150 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20  onstraint"));.  
24160 20 20 73 45 71 20 3d 20 2a 70 41 6c 74 2d 3e 70    sEq = *pAlt->p
24170 45 78 70 72 3b 0a 20 20 20 20 73 45 71 2e 70 4c  Expr;.    sEq.pL
24180 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b  eft = pE->pLeft;
24190 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
241a0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
241b0 26 73 45 71 2c 20 61 64 64 72 43 6f 6e 74 2c 20  &sEq, addrCont, 
241c0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
241d0 4c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  L);.  }..  /* Fo
241e0 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  r a LEFT OUTER J
241f0 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  OIN, generate co
24200 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63  de that will rec
24210 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
24220 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20  t.  ** at least 
24230 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
24240 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
24250 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
24260 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20  table.  .  */.  
24270 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
24280 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65  tJoin ){.    pLe
24290 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d  vel->addrFirst =
242a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
242b0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
242c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
242d0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
242e0 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
242f0 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
24300 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63  Comment((v, "rec
24310 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69  ord LEFT JOIN hi
24320 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t"));.    sqlite
24330 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
24340 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72  pParse);.    for
24350 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
24360 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d  =0; j<pWC->nTerm
24370 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
24380 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24390 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
243a0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
243b0 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35  ;  /* IMP: R-305
243c0 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
243d0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
243e0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
243f0 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20  M_CODED );.     
24400 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
24410 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
24420 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
24430 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24440 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
24450 65 72 65 71 41 6c 6c 20 26 20 6e 65 77 4e 6f 74  ereqAll & newNot
24460 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20  Ready)!=0 ){.   
24470 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
24480 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
24490 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ms );.        co
244a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
244b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
244c0 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
244d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
244e0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
244f0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64  Term->pExpr, add
24500 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
24510 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
24520 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
24530 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
24540 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
24550 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
24560 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73  (pParse, iReleas
24570 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e  eReg);..  return
24580 20 6e 65 77 4e 6f 74 52 65 61 64 79 3b 0a 7d 0a   newNotReady;.}.
24590 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
245a0 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
245b0 20 50 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f   Print a WhereLo
245c0 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65  op object for de
245d0 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73  bugging purposes
245e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
245f0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57  whereLoopPrint(W
24600 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 53 72 63  hereLoop *p, Src
24610 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 29 7b  List *pTabList){
24620 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70  .  int nb = 1+(p
24630 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29  TabList->nSrc+7)
24640 2f 38 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  /8;.  struct Src
24650 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
24660 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b   = pTabList->a +
24670 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c   p->iTab;.  Tabl
24680 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
24690 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  >pTab;.  sqlite3
246a0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63 20  DebugPrintf("%c 
246b0 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c  %2d.%0*llx.%0*ll
246c0 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20  x", p->cId,.    
246d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246e0 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d   p->iTab, nb, p-
246f0 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70  >maskSelf, nb, p
24700 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20 73 71 6c  ->prereq);.  sql
24710 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24720 22 20 25 38 73 22 2c 0a 20 20 20 20 20 20 20 20  " %8s",.        
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
24740 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74  em->zAlias ? pIt
24750 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61  em->zAlias : pTa
24760 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
24770 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
24780 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
24790 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  E)==0 ){.    if(
247a0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
247b0 65 78 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ex ){.      cons
247c0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
247d0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
247e0 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  x->zName;.      
247f0 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a  if( zName==0 ) z
24800 4e 61 6d 65 20 3d 20 22 69 70 6b 22 3b 0a 20 20  Name = "ipk";.  
24810 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
24820 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
24830 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d  utoindex_", 17)=
24840 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
24850 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t i = sqlite3Str
24860 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31  len30(zName) - 1
24870 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
24880 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29   zName[i]!='_' )
24890 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e   i--;.        zN
248a0 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20  ame += i;.      
248b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
248c0 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31  ebugPrintf(".%-1
248d0 32 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20  2s %2d", zName, 
248e0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b  p->u.btree.nEq);
248f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24900 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24910 69 6e 74 66 28 22 25 31 36 73 22 2c 22 22 29 3b  intf("%16s","");
24920 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
24930 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
24940 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69   if( p->u.vtab.i
24950 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a  dxStr ){.      z
24960 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
24970 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25  tf("(%d,\"%s\",%
24980 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x)",.           
24990 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
249a0 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
249b0 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74  .idxStr, p->u.vt
249c0 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
249d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
249e0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
249f0 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d  tf("(%d,%x)", p-
24a00 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
24a10 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
24a20 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sk);.    }.    s
24a30 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24a40 66 28 22 20 25 2d 31 35 73 22 2c 20 7a 29 3b 0a  f(" %-15s", z);.
24a50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24a60 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (z);.  }.  sqlit
24a70 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
24a80 66 67 20 25 30 35 78 20 4e 20 25 64 22 2c 20 70  fg %05x N %d", p
24a90 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c  ->wsFlags, p->nL
24aa0 54 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  Term);.  sqlite3
24ab0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f  DebugPrintf(" co
24ac0 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20  st %d,%d,%d\n", 
24ad0 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52  p->rSetup, p->rR
24ae0 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 7d 0a  un, p->nOut);.}.
24af0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
24b00 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72  nvert bulk memor
24b10 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57  y into a valid W
24b20 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61  hereLoop that ca
24b30 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74  n be passed.** t
24b40 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  o whereLoopClear
24b50 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a   harmlessly..*/.
24b60 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
24b70 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c  eLoopInit(WhereL
24b80 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c  oop *p){.  p->aL
24b90 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d  Term = p->aLTerm
24ba0 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65  Space;.  p->nLTe
24bb0 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53  rm = 0;.  p->nLS
24bc0 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
24bd0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b  p->aLTermSpace);
24be0 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  .  p->wsFlags = 
24bf0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
24c00 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  r the WhereLoop.
24c10 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20  u union.  Leave 
24c20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d  WhereLoop.pLTerm
24c30 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74   intact..*/.stat
24c40 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
24c50 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69  pClearUnion(sqli
24c60 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
24c70 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
24c80 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
24c90 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57  E_VIRTUALTABLE|W
24ca0 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
24cb0 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
24cc0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
24cd0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
24ce0 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65   && p->u.vtab.ne
24cf0 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
24d00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
24d10 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
24d20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
24d30 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
24d40 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
24d50 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xStr = 0;.    }e
24d60 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  lse if( (p->wsFl
24d70 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
24d80 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d  _INDEX)!=0 && p-
24d90 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
24da0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
24db0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
24dc0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
24dd0 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
24de0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24df0 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
24e00 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
24e10 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
24e20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
24e30 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
24e40 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72  e internal memor
24e50 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72  y used by a Wher
24e60 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
24e70 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
24e80 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74  eLoopClear(sqlit
24e90 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
24ea0 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
24eb0 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
24ec0 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
24ed0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
24ee0 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f  Term);.  whereLo
24ef0 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
24f00 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70   p);.  whereLoop
24f10 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Init(p);.}../*.*
24f20 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d  * Increase the m
24f30 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
24f40 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   for pLoop->aLTe
24f50 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65  rm[] to be at le
24f60 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ast n..*/.static
24f70 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
24f80 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62  size(sqlite3 *db
24f90 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  , WhereLoop *p, 
24fa0 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54  int n){.  WhereT
24fb0 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69  erm **paNew;.  i
24fc0 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20  f( p->nLSlot>=n 
24fd0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
24fe0 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26  OK;.  n = (n+7)&
24ff0 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71  ~7;.  paNew = sq
25000 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
25010 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  (db, sizeof(p->a
25020 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20  LTerm[0])*n);.  
25030 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72  if( paNew==0 ) r
25040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
25050 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e  EM;.  memcpy(paN
25060 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73  ew, p->aLTerm, s
25070 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
25080 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a  0])*p->nLSlot);.
25090 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
250a0 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
250b0 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
250c0 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
250d0 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61    p->aLTerm = pa
250e0 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74  New;.  p->nLSlot
250f0 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53   = n;.  return S
25100 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
25110 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74  ** Transfer cont
25120 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63  ent from the sec
25130 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74  ond pLoop into t
25140 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61  he first..*/.sta
25150 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
25160 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64  pXfer(sqlite3 *d
25170 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  b, WhereLoop *pT
25180 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46  o, WhereLoop *pF
25190 72 6f 6d 29 7b 0a 20 20 69 66 28 20 77 68 65 72  rom){.  if( wher
251a0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
251b0 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65  pTo, pFrom->nLTe
251c0 72 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rm) ) return SQL
251d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 77 68 65  ITE_NOMEM;.  whe
251e0 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
251f0 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 6d 65 6d  (db, pTo);.  mem
25200 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20  cpy(pTo, pFrom, 
25210 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f  WHERE_LOOP_XFER_
25220 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  SZ);.  memcpy(pT
25230 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d  o->aLTerm, pFrom
25240 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e  ->aLTerm, pTo->n
25250 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f  LTerm*sizeof(pTo
25260 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20  ->aLTerm[0]));. 
25270 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c   if( pFrom->wsFl
25280 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
25290 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
252a0 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65  pFrom->u.vtab.ne
252b0 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  edFree = 0;.  }e
252c0 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e  lse if( (pFrom->
252d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
252e0 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20 29  TEMP_INDEX)!=0 )
252f0 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62  {.    pFrom->u.b
25300 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
25310 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
25320 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25330 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72 65  * Delete a Where
25340 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  Loop object.*/.s
25350 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
25360 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74  LoopDelete(sqlit
25370 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
25380 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f  p *p){.  whereLo
25390 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a  opClear(db, p);.
253a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
253b0 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
253c0 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
253d0 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
253e0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
253f0 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
25400 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
25410 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
25420 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
25430 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
25440 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e  eClear(&pWInfo->
25450 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  sWC);.    while(
25460 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
25470 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  ){.      WhereLo
25480 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  op *p = pWInfo->
25490 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57  pLoops;.      pW
254a0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70  Info->pLoops = p
254b0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
254c0 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
254d0 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  te(db, p);.    }
254e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
254f0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
25500 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
25510 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61  ert or replace a
25520 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
25530 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c   using the templ
25540 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a  ate supplied..**
25550 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20  .** An existing 
25560 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20  WhereLoop entry 
25570 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72 69  might be overwri
25580 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20  tten if the new 
25590 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62  template.** is b
255a0 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66 65  etter and has fe
255b0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
255c0 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61  .  Or the templa
255d0 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  te will be ignor
255e0 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73  ed.** and no ins
255f0 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69  ert will occur i
25600 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68  f an existing Wh
25610 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65  ereLoop is faste
25620 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77  r and has.** few
25630 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  er dependencies 
25640 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  than the templat
25650 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 20  e.  Otherwise a 
25660 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  new WhereLoop is
25670 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64 20  .** added based 
25680 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  on the template.
25690 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64  .**.** If pBuild
256a0 65 72 2d 3e 70 42 65 73 74 20 69 73 20 6e 6f 74  er->pBest is not
256b0 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 6f 6e   NULL then we on
256c0 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
256d0 65 20 76 65 72 79 0a 2a 2a 20 62 65 73 74 20 74  e very.** best t
256e0 65 6d 70 6c 61 74 65 20 61 6e 64 20 74 68 61 74  emplate and that
256f0 20 74 65 6d 70 6c 61 74 65 20 73 68 6f 75 6c 64   template should
25700 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 42   be stored in pB
25710 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 2e 0a 2a  uilder->pBest..*
25720 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70  * If pBuilder->p
25730 42 65 73 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  Best is NULL the
25740 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 20  n a list of the 
25750 62 65 73 74 20 74 65 6d 70 6c 61 74 65 73 20 61  best templates a
25760 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
25770 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
25780 2d 3e 70 4c 6f 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20  ->pLoops..**.** 
25790 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e  When accumulatin
257a0 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73  g multiple loops
257b0 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72 2d   (when pBuilder-
257c0 3e 70 42 65 73 74 20 69 73 20 4e 55 4c 4c 29 20  >pBest is NULL) 
257d0 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68  we.** still migh
257e0 74 20 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69  t overwrite simi
257f0 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74  lar loops with t
25800 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20  he new template 
25810 69 66 20 74 68 65 0a 2a 2a 20 74 65 6d 70 6c 61  if the.** templa
25820 74 65 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c  te is better.  L
25830 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72  oops may be over
25840 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 66  written if the f
25850 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e  ollowing .** con
25860 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a  ditions are met:
25870 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
25880 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
25890 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32  e iTab..**    (2
258a0 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65  )  They have the
258b0 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a   same iSortIdx..
258c0 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65 20 74  **    (3)  The t
258d0 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65  emplate has same
258e0 20 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e 64   or fewer depend
258f0 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20  encies than the 
25900 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20  current loop.** 
25910 20 20 20 28 34 29 20 20 54 68 65 20 74 65 6d 70     (4)  The temp
25920 6c 61 74 65 20 68 61 73 20 74 68 65 20 73 61 6d  late has the sam
25930 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20  e or lower cost 
25940 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
25950 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 35 29 20   loop.**    (5) 
25960 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 75 73   The template us
25970 65 73 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66  es more terms of
25980 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20   the same index 
25990 62 75 74 20 68 61 73 20 6e 6f 20 61 64 64 69 74  but has no addit
259a0 69 6f 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ional.**        
259b0 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 20 20   dependencies   
259c0 20 20 20 20 20 20 20 0a 2a 2f 0a 73 74 61 74 69         .*/.stati
259d0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49  c int whereLoopI
259e0 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42  nsert(WhereLoopB
259f0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
25a00 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
25a10 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65  mplate){.  Where
25a20 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a  Loop **ppPrev, *
25a30 70 2c 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20  p, *pNext = 0;. 
25a40 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
25a50 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
25a60 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33  WInfo;.  sqlite3
25a70 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
25a80 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
25a90 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 42   If pBuilder->pB
25aa0 65 73 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20  est is defined, 
25ab0 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74  then only keep t
25ac0 72 61 63 6b 20 6f 66 20 74 68 65 20 73 69 6e 67  rack of the sing
25ad0 6c 65 0a 20 20 2a 2a 20 62 65 73 74 20 57 68 65  le.  ** best Whe
25ae0 72 65 4c 6f 6f 70 2e 20 20 70 42 75 69 6c 64 65  reLoop.  pBuilde
25af0 72 2d 3e 70 42 65 73 74 2d 3e 6d 61 73 6b 53 65  r->pBest->maskSe
25b00 6c 66 3d 3d 30 20 69 6e 64 69 63 61 74 65 73 20  lf==0 indicates 
25b10 74 68 61 74 20 6e 6f 0a 20 20 2a 2a 20 70 72 69  that no.  ** pri
25b20 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 68 61  or WhereLoops ha
25b30 76 65 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65  ve been evaluate
25b40 64 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 63  d and that the c
25b50 75 72 72 65 6e 74 20 70 54 65 6d 70 6c 61 74 65  urrent pTemplate
25b60 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65 66 6f  .  ** is therefo
25b70 72 65 20 74 68 65 20 66 69 72 73 74 20 61 6e 64  re the first and
25b80 20 68 65 6e 63 65 20 74 68 65 20 62 65 73 74 20   hence the best 
25b90 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 72 65  and should be re
25ba0 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  tained..  */.  i
25bb0 66 28 20 28 70 20 3d 20 70 42 75 69 6c 64 65 72  f( (p = pBuilder
25bc0 2d 3e 70 42 65 73 74 29 21 3d 30 20 29 7b 0a 20  ->pBest)!=0 ){. 
25bd0 20 20 20 69 66 28 20 70 2d 3e 6d 61 73 6b 53 65     if( p->maskSe
25be0 6c 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  lf!=0 ){.      W
25bf0 68 65 72 65 43 6f 73 74 20 72 43 6f 73 74 20 3d  hereCost rCost =
25c00 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 70 2d   whereCostAdd(p-
25c10 3e 72 52 75 6e 2c 70 2d 3e 72 53 65 74 75 70 29  >rRun,p->rSetup)
25c20 3b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6f 73  ;.      WhereCos
25c30 74 20 72 54 65 6d 70 6c 61 74 65 20 3d 20 77 68  t rTemplate = wh
25c40 65 72 65 43 6f 73 74 41 64 64 28 70 54 65 6d 70  ereCostAdd(pTemp
25c50 6c 61 74 65 2d 3e 72 52 75 6e 2c 70 54 65 6d 70  late->rRun,pTemp
25c60 6c 61 74 65 2d 3e 72 53 65 74 75 70 29 3b 0a 20  late->rSetup);. 
25c70 20 20 20 20 20 69 66 28 20 72 43 6f 73 74 20 3c       if( rCost <
25c80 20 72 54 65 6d 70 6c 61 74 65 20 29 7b 0a 20 20   rTemplate ){.  
25c90 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
25ca0 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b  LoopInsert_noop;
25cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25cc0 66 28 20 72 43 6f 73 74 20 3d 3d 20 72 54 65 6d  f( rCost == rTem
25cd0 70 6c 61 74 65 20 26 26 20 70 2d 3e 70 72 65 72  plate && p->prer
25ce0 65 71 20 3c 3d 20 70 54 65 6d 70 6c 61 74 65 2d  eq <= pTemplate-
25cf0 3e 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20  >prereq ){.     
25d00 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f     goto whereLoo
25d10 70 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20  pInsert_noop;.  
25d20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20      }.    }.#if 
25d30 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
25d40 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
25d50 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
25d60 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  x8 ){.      sqli
25d70 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 70  te3DebugPrintf(p
25d80 2d 3e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 3f 20  ->maskSelf==0 ? 
25d90 22 69 6e 73 2d 69 6e 69 74 3a 20 22 20 3a 20 22  "ins-init: " : "
25da0 69 6e 73 2d 62 65 73 74 3a 20 22 29 3b 0a 20 20  ins-best: ");.  
25db0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
25dc0 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57  nt(pTemplate, pW
25dd0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b  Info->pTabList);
25de0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
25df0 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28    whereLoopXfer(
25e00 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65  db, p, pTemplate
25e10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
25e20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
25e30 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
25e40 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
25e50 6f 6f 70 20 74 6f 20 6f 76 65 72 77 72 69 74 65  oop to overwrite
25e60 2c 20 6f 72 20 77 68 69 63 68 20 74 61 6b 65 73  , or which takes
25e70 0a 20 20 2a 2a 20 70 72 69 6f 72 69 74 79 20 6f  .  ** priority o
25e80 76 65 72 20 70 54 65 6d 70 6c 61 74 65 2e 0a 20  ver pTemplate.. 
25e90 20 2a 2f 0a 20 20 66 6f 72 28 70 70 50 72 65 76   */.  for(ppPrev
25ea0 3d 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  =&pWInfo->pLoops
25eb0 2c 20 70 3d 2a 70 70 50 72 65 76 3b 20 70 3b 20  , p=*ppPrev; p; 
25ec0 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74  ppPrev=&p->pNext
25ed0 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29  Loop, p=*ppPrev)
25ee0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
25ef0 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
25f00 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64  ab || p->iSortId
25f10 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53  x!=pTemplate->iS
25f20 6f 72 74 49 64 78 20 29 20 63 6f 6e 74 69 6e 75  ortIdx ) continu
25f30 65 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  e;.    if( (p->p
25f40 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
25f50 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70  e->prereq)==p->p
25f60 72 65 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d  rereq.     && p-
25f70 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61  >rSetup<=pTempla
25f80 74 65 2d 3e 72 53 65 74 75 70 0a 20 20 20 20 20  te->rSetup.     
25f90 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d  && p->rRun<=pTem
25fa0 70 6c 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20  plate->rRun.    
25fb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 20 69 73  ){.      /* p is
25fc0 20 65 71 75 61 6c 20 6f 72 20 62 65 74 74 65 72   equal or better
25fd0 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 20   than pTemplate 
25fe0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
25ff0 6e 4c 54 65 72 6d 3c 70 54 65 6d 70 6c 61 74 65  nLTerm<pTemplate
26000 2d 3e 6e 4c 54 65 72 6d 0a 20 20 20 20 20 20 20  ->nLTerm.       
26010 26 26 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  && (p->wsFlags &
26020 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
26030 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 54  =0.       && (pT
26040 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
26050 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
26060 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )!=0.       && p
26070 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
26080 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 75 2e 62  ==pTemplate->u.b
26090 74 72 65 65 2e 70 49 6e 64 65 78 0a 20 20 20 20  tree.pIndex.    
260a0 20 20 20 26 26 20 70 2d 3e 70 72 65 72 65 71 3d     && p->prereq=
260b0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72  =pTemplate->prer
260c0 65 71 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  eq.      ){.    
260d0 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
260e0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
260f0 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 73  reLoop with an s
26100 69 6d 69 6c 61 72 20 6f 6e 65 20 74 68 61 74 20  imilar one that 
26110 75 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  uses.        ** 
26120 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68  more terms of th
26130 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  e index */.     
26140 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
26150 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  extLoop;.       
26160 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
26170 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 75 74 3e  lse if( p->nOut>
26180 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 0a  pTemplate->nOut.
26190 20 20 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65         && p->rSe
261a0 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
261b0 72 53 65 74 75 70 0a 20 20 20 20 20 20 20 26 26  rSetup.       &&
261c0 20 70 2d 3e 72 52 75 6e 3d 3d 70 54 65 6d 70 6c   p->rRun==pTempl
261d0 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 20 20  ate->rRun.      
261e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 76  ){.        /* Ov
261f0 65 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74  erwrite an exist
26200 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  ing WhereLoop wi
26210 74 68 20 74 68 65 20 73 61 6d 65 20 63 6f 73 74  th the same cost
26220 20 62 75 74 20 6d 6f 72 65 0a 20 20 20 20 20 20   but more.      
26230 20 20 2a 2a 20 6f 75 74 70 75 74 73 20 2a 2f 0a    ** outputs */.
26240 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
26250 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
26260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26280 20 20 2f 2a 20 70 54 65 6d 70 6c 61 74 65 20 69    /* pTemplate i
26290 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a 20  s not helpful.. 
262a0 20 20 20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e         ** Return
262b0 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
262c0 67 20 6f 72 20 61 64 64 69 6e 67 20 61 6e 79 74  g or adding anyt
262d0 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  hing */.        
262e0 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e  goto whereLoopIn
262f0 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20  sert_noop;.     
26300 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
26310 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
26320 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
26330 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
26340 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72  req.     && p->r
26350 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65  Setup>=pTemplate
26360 2d 3e 72 53 65 74 75 70 0a 20 20 20 20 20 26 26  ->rSetup.     &&
26370 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c   p->rRun>=pTempl
26380 61 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 29 7b  ate->rRun.    ){
26390 0a 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  .      /* Overwr
263a0 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ite an existing 
263b0 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
263c0 20 62 65 74 74 65 72 20 6f 6e 65 20 2a 2f 0a 20   better one */. 
263d0 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
263e0 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20  pNextLoop;.     
263f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
26400 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
26410 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69  ach this point i
26420 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74  t means that eit
26430 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62  her p[] should b
26440 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20  e overwritten.  
26450 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ** with pTemplat
26460 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73 74  e[] if p[] exist
26470 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c  s, or if p==NULL
26480 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
26490 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c   new.  ** WhereL
264a0 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20 69  oop and insert i
264b0 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45 52  t..  */.#if WHER
264c0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
264d0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
264e0 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
264f0 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a      if( p!=0 ){.
26500 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26510 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 64 65  ugPrintf("ins-de
26520 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20 77 68  l:  ");.      wh
26530 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
26540 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
26550 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
26560 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26570 22 69 6e 73 2d 6e 65 77 3a 20 20 22 29 3b 0a 20  "ins-new:  ");. 
26580 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
26590 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57 49  t(pTemplate, pWI
265a0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b 0a  nfo->pTabList);.
265b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
265c0 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d   p==0 ){.    p =
265d0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
265e0 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  Raw(db, sizeof(W
265f0 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20  hereLoop));.    
26600 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
26610 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
26620 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69      whereLoopIni
26630 74 28 70 29 3b 0a 20 20 7d 0a 20 20 77 68 65 72  t(p);.  }.  wher
26640 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c  eLoopXfer(db, p,
26650 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70   pTemplate);.  p
26660 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 70 4e  ->pNextLoop = pN
26670 65 78 74 3b 0a 20 20 2a 70 70 50 72 65 76 20 3d  ext;.  *ppPrev =
26680 20 70 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73   p;.  if( (p->ws
26690 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
266a0 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
266b0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e  {.    Index *pIn
266c0 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  dex = p->u.btree
266d0 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  .pIndex;.    if(
266e0 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65   pIndex && pInde
266f0 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20  x->tnum==0 ){.  
26700 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
26710 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
26720 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
26730 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
26740 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
26750 69 6e 73 65 72 74 20 69 73 20 61 20 6e 6f 2d 6f  insert is a no-o
26760 70 20 2a 2f 0a 77 68 65 72 65 4c 6f 6f 70 49 6e  p */.whereLoopIn
26770 73 65 72 74 5f 6e 6f 6f 70 3a 0a 23 69 66 20 57  sert_noop:.#if W
26780 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
26790 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  D.  if( sqlite3W
267a0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
267b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
267c0 62 75 67 50 72 69 6e 74 66 28 70 42 75 69 6c 64  bugPrintf(pBuild
267d0 65 72 2d 3e 70 42 65 73 74 20 3f 20 22 69 6e 73  er->pBest ? "ins
267e0 2d 73 6b 69 70 3a 20 22 20 3a 20 22 69 6e 73 2d  -skip: " : "ins-
267f0 6e 6f 6f 70 3a 20 22 29 3b 0a 20 20 20 20 77 68  noop: ");.    wh
26800 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
26810 6d 70 6c 61 74 65 2c 20 70 57 49 6e 66 6f 2d 3e  mplate, pWInfo->
26820 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 7d 0a 23  pTabList);.  }.#
26830 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
26840 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f  QLITE_OK;  .}../
26850 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20  *.** We have so 
26860 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69  far matched pBui
26870 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
26880 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66  ree.nEq terms of
26890 20 74 68 65 20 69 6e 64 65 78 20 70 49 6e 64 65   the index pInde
268a0 78 2e 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 61 74  x..** Try to mat
268b0 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a  ch one more..**.
268c0 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e  ** If pProbe->tn
268d0 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e  um==0, that mean
268e0 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66 61  s pIndex is a fa
268f0 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f  ke index used fo
26900 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  r the.** INTEGER
26910 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f   PRIMARY KEY..*/
26920 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
26930 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
26940 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ex(.  WhereLoopB
26950 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
26960 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
26970 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a  reLoop factory *
26980 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
26990 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
269a0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
269b0 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e  se term being an
269c0 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65  alyzed */.  Inde
269d0 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20  x *pProbe,      
269e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
269f0 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20  n index on pSrc 
26a00 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e  */.  WhereCost n
26a10 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20  InMul           
26a20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62       /* log(Numb
26a30 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
26a40 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29   due to IN) */.)
26a50 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
26a60 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
26a70 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48  ->pWInfo;  /* WH
26a80 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74  ERE analyse cont
26a90 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
26aa0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
26ab0 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  >pParse;        
26ac0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
26ad0 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
26ae0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
26af0 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
26b00 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  ase connection m
26b10 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f  alloc context */
26b20 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
26b30 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
26b40 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57     /* Template W
26b50 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63  hereLoop under c
26b60 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
26b70 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
26b80 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
26b90 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20   /* A WhereTerm 
26ba0 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74  under considerat
26bb0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d  ion */.  int opM
26bc0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
26bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69           /* Vali
26be0 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  d operators for 
26bf0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
26c00 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b   WhereScan scan;
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
26c30 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a   WHERE terms */.
26c40 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f    Bitmask saved_
26c50 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20 20  prereq;         
26c60 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
26c70 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65  lue of pNew->pre
26c80 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  req */.  u16 sav
26c90 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20  ed_nLTerm;      
26ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
26cb0 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
26cc0 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20  ew->nLTerm */.  
26cd0 69 6e 74 20 73 61 76 65 64 5f 6e 45 71 3b 20 20  int saved_nEq;  
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cf0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
26d00 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72  e of pNew->u.btr
26d10 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 33 32 20  ee.nEq */.  u32 
26d20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20  saved_wsFlags;  
26d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
26d40 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
26d50 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a   pNew->wsFlags *
26d60 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 73 61  /.  WhereCost sa
26d70 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20  ved_nOut;       
26d80 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
26d90 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
26da0 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Out */.  int iCo
26db0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
26dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
26dd0 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
26de0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
26df0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26e00 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
26e10 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
26e20 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
26e30 6e 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20 20  nRowEst;        
26e40 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
26e50 65 64 20 69 6e 64 65 78 20 73 65 6c 65 63 74 69  ed index selecti
26e60 76 69 74 79 20 2a 2f 0a 20 20 57 68 65 72 65 43  vity */.  WhereC
26e70 6f 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  ost rLogSize;   
26e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
26e90 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20  arithm of table 
26ea0 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  size */.  WhereT
26eb0 65 72 6d 20 2a 70 54 6f 70 2c 20 2a 70 42 74 6d  erm *pTop, *pBtm
26ec0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70  ;         /* Top
26ed0 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67   and bottom rang
26ee0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
26ef0 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ..  pNew = pBuil
26f00 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28  der->pNew;.  if(
26f10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
26f20 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
26f30 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65  E_NOMEM;..  asse
26f40 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
26f50 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
26f60 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20  ALTABLE)==0 );. 
26f70 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75   assert( pNew->u
26f80 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f  .btree.nEq<=pPro
26f90 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  be->nColumn );. 
26fa0 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
26fb0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26fc0 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b  TOP_LIMIT)==0 );
26fd0 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46  .  if( pNew->wsF
26fe0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
26ff0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70  _LIMIT ){.    op
27000 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f  Mask = WO_LT|WO_
27010 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
27020 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
27030 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  || (pSrc->jointy
27040 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
27050 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
27060 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
27070 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
27080 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  O_LE;.  }else{. 
27090 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
270a0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c  Q|WO_IN|WO_ISNUL
270b0 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  L|WO_GT|WO_GE|WO
270c0 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20  _LT|WO_LE;.  }. 
270d0 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e   if( pProbe->bUn
270e0 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b  ordered ) opMask
270f0 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47   &= ~(WO_GT|WO_G
27100 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a  E|WO_LT|WO_LE);.
27110 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62  .  if( pNew->u.b
27120 74 72 65 65 2e 6e 45 71 20 3c 20 70 50 72 6f 62  tree.nEq < pProb
27130 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  e->nColumn ){.  
27140 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d    iCol = pProbe-
27150 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e  >aiColumn[pNew->
27160 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 20 20  u.btree.nEq];.  
27170 20 20 6e 52 6f 77 45 73 74 20 3d 20 77 68 65 72    nRowEst = wher
27180 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61 69  eCost(pProbe->ai
27190 52 6f 77 45 73 74 5b 70 4e 65 77 2d 3e 75 2e 62  RowEst[pNew->u.b
271a0 74 72 65 65 2e 6e 45 71 2b 31 5d 29 3b 0a 20 20  tree.nEq+1]);.  
271b0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 6f 6c 20  }else{.    iCol 
271c0 3d 20 2d 31 3b 0a 20 20 20 20 6e 52 6f 77 45 73  = -1;.    nRowEs
271d0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 54 65  t = 0;.  }.  pTe
271e0 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e  rm = whereScanIn
271f0 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69 6c 64  it(&scan, pBuild
27200 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69  er->pWC, pSrc->i
27210 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20  Cursor, iCol,.  
27220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27230 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50        opMask, pP
27240 72 6f 62 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e  robe);.  saved_n
27250 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  Eq = pNew->u.btr
27260 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f  ee.nEq;.  saved_
27270 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e  nLTerm = pNew->n
27280 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77  LTerm;.  saved_w
27290 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77  sFlags = pNew->w
272a0 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f  sFlags;.  saved_
272b0 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70  prereq = pNew->p
272c0 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e  rereq;.  saved_n
272d0 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out = pNew->nOut
272e0 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
272f0 20 3d 20 30 3b 0a 20 20 72 4c 6f 67 53 69 7a 65   = 0;.  rLogSize
27300 20 3d 20 65 73 74 4c 6f 67 28 77 68 65 72 65 43   = estLog(whereC
27310 6f 73 74 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f  ost(pProbe->aiRo
27320 77 45 73 74 5b 30 5d 29 29 3b 0a 20 20 66 6f 72  wEst[0]));.  for
27330 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
27340 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54   && pTerm!=0; pT
27350 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e  erm = whereScanN
27360 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20  ext(&scan)){.   
27370 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 20 20   int nIn = 0;.  
27380 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
27390 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
273a0 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
273b0 69 6e 75 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  inue;.    pNew->
273c0 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
273d0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65  wsFlags;.    pNe
273e0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
273f0 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
27400 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
27410 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20  aved_nLTerm;.   
27420 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
27430 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
27440 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
27450 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
27460 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65  /.    pNew->aLTe
27470 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
27480 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
27490 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28  pNew->prereq = (
274a0 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70  saved_prereq | p
274b0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
274c0 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b  t) & ~pNew->mask
274d0 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Self;.    pNew->
274e0 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a 65 3b  rRun = rLogSize;
274f0 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 63 6f 73   /* Baseline cos
27500 74 20 69 73 20 6c 6f 67 32 28 4e 29 2e 20 20 41  t is log2(N).  A
27510 64 6a 75 73 74 6d 65 6e 74 73 20 62 65 6c 6f 77  djustments below
27520 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
27530 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
27540 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  O_IN ){.      Ex
27550 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
27560 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
27570 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
27580 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
27590 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
275a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
275b0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
275c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
275d0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
275e0 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65  )":  TUNING: the
275f0 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
27600 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
27610 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73     nIn = 46;  as
27620 73 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65 43  sert( 46==whereC
27630 6f 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20  ost(25) );.     
27640 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
27650 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
27660 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
27670 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
27680 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
27690 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
276a0 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  .)" */.        n
276b0 49 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 28 70  In = whereCost(p
276c0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
276d0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
276e0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
276f0 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 70 4e  += nIn;.      pN
27700 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
27710 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  +;.      pNew->n
27720 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20  Out = nRowEst + 
27730 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
27740 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
27750 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
27760 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20 20 20  WO_EQ) ){.      
27770 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
27780 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
27790 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52  COLUMN_NULL|WHER
277a0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21 3d 30  E_COLUMN_IN))!=0
277b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
277c0 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d 30 20     || nInMul==0 
277d0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
277e0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
277f0 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
27800 20 69 66 28 20 69 43 6f 6c 3c 30 20 20 0a 20 20   if( iCol<0  .  
27810 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 62 65 2d       || (pProbe-
27820 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
27830 65 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20  e && nInMul==0. 
27840 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65            && pNe
27850 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d  w->u.btree.nEq==
27860 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 2d  pProbe->nColumn-
27870 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1).      ){.    
27880 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e      testcase( pN
27890 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
278a0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b  ERE_COLUMN_IN );
278b0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
278c0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
278d0 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a  ONEROW;.      }.
278e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
278f0 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20  ree.nEq++;.     
27900 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52   pNew->nOut = nR
27910 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b 0a  owEst + nInMul;.
27920 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
27930 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
27940 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a   (WO_ISNULL) ){.
27950 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
27960 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
27970 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  UMN_NULL;.      
27980 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
27990 71 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  q++;.      /* TU
279a0 4e 49 4e 47 3a 20 49 53 20 4e 55 4c 4c 20 73 65  NING: IS NULL se
279b0 6c 65 63 74 73 20 32 20 72 6f 77 73 20 2a 2f 0a  lects 2 rows */.
279c0 20 20 20 20 20 20 6e 49 6e 20 3d 20 31 30 3b 20        nIn = 10; 
279d0 20 61 73 73 65 72 74 28 20 31 30 3d 3d 77 68 65   assert( 10==whe
279e0 72 65 43 6f 73 74 28 32 29 20 29 3b 0a 20 20 20  reCost(2) );.   
279f0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
27a00 6e 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c  nRowEst + nInMul
27a10 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73   + nIn;.    }els
27a20 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
27a30 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
27a40 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20  WO_GE) ){.      
27a50 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
27a60 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
27a70 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49  NGE|WHERE_BTM_LI
27a80 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  MIT;.      pBtm 
27a90 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
27aa0 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Top = 0;.    }el
27ab0 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f  se if( pTerm->eO
27ac0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54  perator & (WO_LT
27ad0 7c 57 4f 5f 4c 45 29 20 29 7b 0a 20 20 20 20 20  |WO_LE) ){.     
27ae0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
27af0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
27b00 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  ANGE|WHERE_TOP_L
27b10 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70  IMIT;.      pTop
27b20 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
27b30 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73  pBtm = (pNew->ws
27b40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
27b50 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20  M_LIMIT)!=0 ?.  
27b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b70 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
27b80 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20  pNew->nLTerm-2] 
27b90 3a 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  : 0;.    }.    i
27ba0 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
27bb0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
27bc0 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f  RANGE ){.      /
27bd0 2a 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 61 6e  * Adjust nOut an
27be0 64 20 72 52 75 6e 20 66 6f 72 20 53 54 41 54 33  d rRun for STAT3
27bf0 20 72 61 6e 67 65 20 76 61 6c 75 65 73 20 2a 2f   range values */
27c00 0a 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74  .      WhereCost
27c10 20 72 44 69 76 3b 0a 20 20 20 20 20 20 77 68 65   rDiv;.      whe
27c20 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70  reRangeScanEst(p
27c30 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70  Parse, pProbe, p
27c40 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27c50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27c60 20 20 20 20 20 20 20 20 20 20 70 42 74 6d 2c 20            pBtm, 
27c70 70 54 6f 70 2c 20 26 72 44 69 76 29 3b 0a 20 20  pTop, &rDiv);.  
27c80 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
27c90 20 73 61 76 65 64 5f 6e 4f 75 74 3e 72 44 69 76   saved_nOut>rDiv
27ca0 2b 31 30 20 3f 20 73 61 76 65 64 5f 6e 4f 75 74  +10 ? saved_nOut
27cb0 20 2d 20 72 44 69 76 20 3a 20 31 30 3b 0a 20 20   - rDiv : 10;.  
27cc0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
27cd0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
27ce0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 62     if( pNew->u.b
27cf0 74 72 65 65 2e 6e 45 71 3d 3d 31 20 26 26 20 70  tree.nEq==1 && p
27d00 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 29  Probe->nSample )
27d10 7b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  {.      tRowcnt 
27d20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  nOut = 0;.      
27d30 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
27d40 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
27d50 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b  O_ISNULL))!=0 ){
27d60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
27d70 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
27d80 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20  pParse, pProbe, 
27d90 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
27da0 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  ight, &nOut);.  
27db0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
27dc0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
27dd0 26 20 57 4f 5f 49 4e 29 0a 20 20 20 20 20 20 20  & WO_IN).       
27de0 20 20 20 20 20 20 26 26 20 20 21 45 78 70 72 48        &&  !ExprH
27df0 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
27e00 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
27e10 65 6c 65 63 74 29 20 20 29 7b 0a 20 20 20 20 20  elect)  ){.     
27e20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53     rc = whereInS
27e30 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
27e40 50 72 6f 62 65 2c 20 70 54 65 72 6d 2d 3e 70 45  Probe, pTerm->pE
27e50 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  xpr->x.pList, &n
27e60 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Out);.      }.  
27e70 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
27e80 20 77 68 65 72 65 43 6f 73 74 28 6e 4f 75 74 29   whereCost(nOut)
27e90 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
27ea0 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73     if( (pNew->ws
27eb0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
27ec0 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50  DX_ONLY|WHERE_IP
27ed0 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  K))==0 ){.      
27ee0 2f 2a 20 45 61 63 68 20 72 6f 77 20 69 6e 76 6f  /* Each row invo
27ef0 6c 76 65 73 20 61 20 73 74 65 70 20 6f 66 20 74  lves a step of t
27f00 68 65 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 61  he index, then a
27f10 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f   binary search o
27f20 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d  f.      ** the m
27f30 61 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ain table */.   
27f40 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
27f50 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 70 4e   whereCostAdd(pN
27f60 65 77 2d 3e 72 52 75 6e 2c 20 72 4c 6f 67 53 69  ew->rRun, rLogSi
27f70 7a 65 3e 32 37 20 3f 20 72 4c 6f 67 53 69 7a 65  ze>27 ? rLogSize
27f80 2d 31 37 20 3a 20 31 30 29 3b 0a 20 20 20 20 7d  -17 : 10);.    }
27f90 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 63 6f 73  .    /* Step cos
27fa0 74 20 66 6f 72 20 65 61 63 68 20 6f 75 74 70 75  t for each outpu
27fb0 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 70 4e 65  t row */.    pNe
27fc0 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43  w->rRun = whereC
27fd0 6f 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  ostAdd(pNew->rRu
27fe0 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a  n, pNew->nOut);.
27ff0 20 20 20 20 2f 2a 20 54 42 44 3a 20 41 64 6a 75      /* TBD: Adju
28000 73 74 20 6e 4f 75 74 20 66 6f 72 20 61 64 64 69  st nOut for addi
28010 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e  tional constrain
28020 74 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77  ts */.    rc = w
28030 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
28040 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
28050 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
28060 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
28070 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20  OP_LIMIT)==0.   
28080 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
28090 65 65 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e  ee.nEq<(pProbe->
280a0 6e 43 6f 6c 75 6d 6e 20 2b 20 28 70 50 72 6f 62  nColumn + (pProb
280b0 65 2d 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20  e->zName!=0)).  
280c0 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65    ){.      where
280d0 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
280e0 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
280f0 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c  , pProbe, nInMul
28100 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  +nIn);.    }.  }
28110 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
28120 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
28130 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
28140 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
28150 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
28160 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
28170 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  ;.  pNew->nOut =
28180 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70   saved_nOut;.  p
28190 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61  New->nLTerm = sa
281a0 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65  ved_nLTerm;.  re
281b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
281c0 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66  * Return True if
281d0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
281e0 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68  that pIndex migh
281f0 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a  t be useful in.*
28200 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  * implementing t
28210 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
28220 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a  se in pBuilder..
28230 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c  **.** Return Fal
28240 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64  se if pBuilder d
28250 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
28260 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
28270 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72  se or.** if ther
28280 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20  e is no way for 
28290 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65  pIndex to be use
282a0 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74  ful in implement
282b0 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45  ing that.** ORDE
282c0 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  R BY clause..*/.
282d0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78  static int index
282e0 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
282f0 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f  erBy(.  WhereLoo
28300 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
28310 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  er,.  Index *pIn
28320 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73  dex,.  int iCurs
28330 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  or.){.  ExprList
28340 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c   *pOB;.  int ii,
28350 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64   jj;..  if( pInd
28360 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  ex->bUnordered )
28370 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
28380 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72   (pOB = pBuilder
28390 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ->pWInfo->pOrder
283a0 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  By)==0 ) return 
283b0 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
283c0 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69  i<pOB->nExpr; ii
283d0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
283e0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
283f0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
28400 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b  B->a[ii].pExpr);
28410 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
28420 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
28430 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
28440 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
28450 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
28460 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70    for(jj=0; jj<p
28470 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
28480 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  jj++){.        i
28490 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
284a0 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  n==pIndex->aiCol
284b0 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e  umn[jj] ) return
284c0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
284d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
284e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
284f0 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72  n a bitmask wher
28500 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68  e 1s indicate th
28510 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  at the correspon
28520 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  ding column of.*
28530 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75  * the table is u
28540 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e  sed by an index.
28550 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
28560 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20   63 columns are 
28570 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73  considered..*/.s
28580 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
28590 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64  lumnsInIndex(Ind
285a0 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
285b0 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
285c0 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64  t j;.  for(j=pId
285d0 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e  x->nColumn-1; j>
285e0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; j--){.    in
285f0 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
28600 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  lumn[j];.    if(
28610 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20   x<BMS-1 ) m |= 
28620 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 7d 0a  MASKBIT(x);.  }.
28630 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 0a    return m;.}...
28640 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
28650 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
28660 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f  a single table o
28670 66 20 74 68 65 20 6a 6f 69 6e 20 77 65 72 65 20  f the join were 
28680 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  the table.** is 
28690 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75 69  idenfied by pBui
286a0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
286b0 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
286c0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
286d0 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61  e.** a b-tree ta
286e0 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75  ble, not a virtu
286f0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
28700 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
28710 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
28720 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
28730 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
28740 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
28750 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
28760 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
28770 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
28780 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
28790 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
287a0 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
287b0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
287c0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
287d0 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
287e0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
287f0 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
28800 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
28810 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
28820 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28840 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
28850 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
28860 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
28870 74 52 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74  tRowcnt aiRowEst
28880 50 6b 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54  Pk[2];      /* T
28890 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61  he aiRowEst[] va
288a0 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
288b0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  index */.  int a
288c0 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20  iColumnPk = -1; 
288d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43         /* The aC
288e0 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f  olumn[] value fo
288f0 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
28900 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
28910 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
28920 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
28930 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
28940 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
28950 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc;  /* The FROM
28960 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65   clause btree te
28970 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57  rm to add */.  W
28980 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
28990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
289a0 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
289b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
289c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
289d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
289e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
289f0 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20   iSortIdx = 1;  
28a00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
28a10 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  x number */.  in
28a20 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  t b;            
28a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62            /* A b
28a40 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a  oolean value */.
28a50 20 20 57 68 65 72 65 43 6f 73 74 20 72 53 69 7a    WhereCost rSiz
28a60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
28a70 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
28a80 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
28a90 20 20 57 68 65 72 65 43 6f 73 74 20 72 4c 6f 67    WhereCost rLog
28aa0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Size;         /*
28ab0 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   Logarithm of th
28ac0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
28ad0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
28ae0 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  .  .  pNew = pBu
28af0 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
28b00 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
28b10 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62  ->pWInfo;.  pTab
28b20 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
28b30 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20  TabList;.  pSrc 
28b40 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  = pTabList->a + 
28b50 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 61 73  pNew->iTab;.  as
28b60 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c  sert( !IsVirtual
28b70 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a  (pSrc->pTab) );.
28b80 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e  .  if( pSrc->pIn
28b90 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
28ba0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
28bb0 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
28bc0 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
28bd0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50  to use */.    pP
28be0 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e  robe = pSrc->pIn
28bf0 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
28c00 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
28c10 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
28c20 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
28c30 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
28c40 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
28c50 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
28c60 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
28c70 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
28c80 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
28c90 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
28ca0 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
28cb0 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
28cc0 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
28cd0 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
28ce0 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
28cf0 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
28d00 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
28d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d20 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
28d30 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
28d40 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
28d50 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
28d60 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
28d70 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b  sPk.nColumn = 1;
28d80 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d  .    sPk.aiColum
28d90 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b  n = &aiColumnPk;
28da0 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73  .    sPk.aiRowEs
28db0 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
28dc0 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
28dd0 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
28de0 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
28df0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  Src->pTab;.    a
28e00 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
28e10 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45  Src->pTab->nRowE
28e20 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  st;.    aiRowEst
28e30 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70  Pk[1] = 1;.    p
28e40 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54  First = pSrc->pT
28e50 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
28e60 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
28e70 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  exed==0 ){.     
28e80 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64   /* The real ind
28e90 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ices of the tabl
28ea0 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69  e are only consi
28eb0 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20  dered if the.   
28ec0 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45     ** NOT INDEXE
28ed0 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f  D qualifier is o
28ee0 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
28ef0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
28f00 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d       sPk.pNext =
28f10 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20   pFirst;.    }. 
28f20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b     pProbe = &sPk
28f30 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20  ;.  }.  rSize = 
28f40 77 68 65 72 65 43 6f 73 74 28 70 53 72 63 2d 3e  whereCost(pSrc->
28f50 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a  pTab->nRowEst);.
28f60 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
28f70 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  Log(rSize);..  /
28f80 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
28f90 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42  xes */.  if( !pB
28fa0 75 69 6c 64 65 72 2d 3e 70 42 65 73 74 0a 20 20  uilder->pBest.  
28fb0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61   && (pWInfo->pPa
28fc0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
28fd0 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
28fe0 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72 63  x)!=0.   && pSrc
28ff0 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26  ->pIndex==0.   &
29000 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f  & !pSrc->viaCoro
29010 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53 72  utine.   && !pSr
29020 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20  c->notIndexed.  
29030 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f 72   && !pSrc->isCor
29040 72 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20 20  related.  ){.   
29050 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74   /* Generate aut
29060 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f  o-index WhereLoo
29070 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43  ps */.    WhereC
29080 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75  lause *pWC = pBu
29090 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 20 20  ilder->pWC;.    
290a0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
290b0 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
290c0 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
290d0 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
290e0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
290f0 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
29100 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
29110 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
29120 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
29130 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
29140 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
29150 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
29160 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
29170 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
29180 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
29190 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
291a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
291b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
291c0 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
291d0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
291e0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
291f0 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
29200 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  m;.        /* TU
29210 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63  NING: One-time c
29220 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e  ost for computin
29230 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  g the automatic 
29240 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20  index is.       
29250 20 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74 65 6c   ** approximatel
29260 79 20 36 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68  y 6*N*log2(N) wh
29270 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
29280 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20  ber of rows in. 
29290 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61         ** the ta
292a0 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
292b0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  d. */.        pN
292c0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f  ew->rSetup = rLo
292d0 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20  gSize + rSize + 
292e0 32 36 3b 20 20 61 73 73 65 72 74 28 20 32 36 3d  26;  assert( 26=
292f0 3d 77 68 65 72 65 43 6f 73 74 28 36 29 20 29 3b  =whereCost(6) );
29300 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
29310 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c  NG: Each index l
29320 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 31 30 20  ookup yields 10 
29330 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
29340 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  e */.        pNe
29350 77 2d 3e 6e 4f 75 74 20 3d 20 33 33 3b 20 20 61  w->nOut = 33;  a
29360 73 73 65 72 74 28 20 33 33 3d 3d 77 68 65 72 65  ssert( 33==where
29370 43 6f 73 74 28 31 30 29 20 29 3b 0a 20 20 20 20  Cost(10) );.    
29380 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
29390 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 4c   whereCostAdd(rL
293a0 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75  ogSize,pNew->nOu
293b0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  t);.        pNew
293c0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
293d0 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
293e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
293f0 65 71 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54  eq = mExtra | pT
29400 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
29410 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
29420 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
29430 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
29440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29450 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  }..  /* Loop ove
29460 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20  r all indices.  
29470 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53  */.  for(; rc==S
29480 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f  QLITE_OK && pPro
29490 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62  be; pProbe=pProb
294a0 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49  e->pNext, iSortI
294b0 64 78 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d  dx++){.    pNew-
294c0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 30  >u.btree.nEq = 0
294d0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
294e0 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  rm = 0;.    pNew
294f0 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
29500 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
29510 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
29520 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b  prereq = mExtra;
29530 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
29540 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
29550 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
29560 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
29570 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
29580 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
29590 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54  ursor);.    /* T
295a0 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  he ONEPASS_DESIR
295b0 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f  ED flags never o
295c0 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77  ccurs together w
295d0 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ith ORDER BY */.
295e0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49      assert( (pWI
295f0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
29600 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
29610 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62  DESIRED)==0 || b
29620 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
29630 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29  Probe->tnum<=0 )
29640 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
29650 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
29660 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
29670 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
29680 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
29690 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
296a0 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
296b0 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
296c0 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
296d0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
296e0 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 2f  = rSize;.      /
296f0 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
29700 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  f full table sca
29710 6e 20 69 73 20 33 2a 28 4e 20 2b 20 6c 6f 67 32  n is 3*(N + log2
29720 28 4e 29 29 2e 0a 20 20 20 20 20 20 2a 2a 20 20  (N))..      **  
29730 2b 20 20 54 68 65 20 65 78 74 72 61 20 33 20 66  +  The extra 3 f
29740 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63 6f  actor is to enco
29750 75 72 61 67 65 20 74 68 65 20 75 73 65 20 6f 66  urage the use of
29760 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70 73   indexed lookups
29770 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 76  .      **     ov
29780 65 72 20 66 75 6c 6c 20 73 63 61 6e 73 2e 20 20  er full scans.  
29790 41 20 73 6d 61 6c 6c 65 72 20 63 6f 6e 73 74 61  A smaller consta
297a0 6e 74 20 32 20 69 73 20 75 73 65 64 20 66 6f 72  nt 2 is used for
297b0 20 63 6f 76 65 72 69 6e 67 0a 20 20 20 20 20 20   covering.      
297c0 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 73 63 61  **     index sca
297d0 6e 73 20 73 6f 20 74 68 61 74 20 61 20 63 6f 76  ns so that a cov
297e0 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
297f0 20 77 69 6c 6c 20 62 65 20 66 61 76 6f 72 65 64   will be favored
29800 20 6f 76 65 72 0a 20 20 20 20 20 20 2a 2a 20 20   over.      **  
29810 20 20 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e     a table scan.
29820 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
29830 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73 74  rRun = whereCost
29840 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69  Add(rSize,rLogSi
29850 7a 65 29 20 2b 20 31 36 3b 0a 20 20 20 20 20 20  ze) + 16;.      
29860 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
29870 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
29880 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  New);.      if( 
29890 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
298a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74  }else{.      Bit
298b0 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63  mask m = pSrc->c
298c0 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
298d0 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62 65 29  sInIndex(pProbe)
298e0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
298f0 46 6c 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f  Flags = (m==0) ?
29900 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
29910 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20  |WHERE_INDEXED) 
29920 3a 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b  : WHERE_INDEXED;
29930 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  ..      /* Full 
29940 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a  scan via index *
29950 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20 20  /.      if( b.  
29960 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20       || ( m==0. 
29970 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
29980 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  e->bUnordered==0
29990 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
299a0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
299b0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
299c0 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20  _DESIRED)==0.   
299d0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
299e0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
299f0 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26  eCis.         &&
29a00 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
29a10 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61  bled(pWInfo->pPa
29a20 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
29a30 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
29a40 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
29a50 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
29a60 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
29a70 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
29a80 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
29a90 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20   = rSize;.      
29aa0 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20    if( m==0 ){.  
29ab0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
29ac0 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 63 6f 76  G: Cost of a cov
29ad0 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
29ae0 20 69 73 20 32 2a 28 4e 20 2b 20 6c 6f 67 32 28   is 2*(N + log2(
29af0 4e 29 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  N))..          *
29b00 2a 20 20 2b 20 20 54 68 65 20 65 78 74 72 61 20  *  +  The extra 
29b10 32 20 66 61 63 74 6f 72 20 69 73 20 74 6f 20 65  2 factor is to e
29b20 6e 63 6f 75 72 61 67 65 20 74 68 65 20 75 73 65  ncourage the use
29b30 20 6f 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b   of indexed look
29b40 75 70 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ups.          **
29b50 20 20 20 20 20 6f 76 65 72 20 69 6e 64 65 78 20       over index 
29b60 73 63 61 6e 73 2e 20 20 41 20 74 61 62 6c 65 20  scans.  A table 
29b70 73 63 61 6e 20 75 73 65 73 20 61 20 66 61 63 74  scan uses a fact
29b80 6f 72 20 6f 66 20 33 20 73 6f 20 74 68 61 74 0a  or of 3 so that.
29b90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
29ba0 20 69 6e 64 65 78 20 73 63 61 6e 73 20 61 72 65   index scans are
29bb0 20 66 61 76 6f 72 65 64 20 6f 76 65 72 20 74 61   favored over ta
29bc0 62 6c 65 20 73 63 61 6e 73 2e 0a 20 20 20 20 20  ble scans..     
29bd0 20 20 20 20 20 2a 2a 20 20 2b 20 20 49 66 20 74       **  +  If t
29be0 68 69 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  his covering ind
29bf0 65 78 20 6d 69 67 68 74 20 61 6c 73 6f 20 68 65  ex might also he
29c00 6c 70 20 73 61 74 69 73 66 79 20 74 68 65 20 4f  lp satisfy the O
29c10 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 20 20  RDER BY.        
29c20 20 20 2a 2a 20 20 20 20 20 63 6c 61 75 73 65 2c    **     clause,
29c30 20 74 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69   then the cost i
29c40 73 20 66 75 64 67 65 64 20 64 6f 77 6e 20 73 6c  s fudged down sl
29c50 69 67 68 74 6c 79 20 73 6f 20 74 68 61 74 20 74  ightly so that t
29c60 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
29c70 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 66 61       index is fa
29c80 76 6f 72 65 64 20 61 62 6f 76 65 20 6f 74 68 65  vored above othe
29c90 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 68  r indices that h
29ca0 61 76 65 20 6e 6f 20 68 6f 70 65 20 6f 66 0a 20  ave no hope of. 
29cb0 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20           **     
29cc0 68 65 6c 70 69 6e 67 20 77 69 74 68 20 74 68 65  helping with the
29cd0 20 4f 52 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20   ORDER BY. */.  
29ce0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
29cf0 75 6e 20 3d 20 31 30 20 2b 20 77 68 65 72 65 43  un = 10 + whereC
29d00 6f 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f  ostAdd(rSize,rLo
29d10 67 53 69 7a 65 29 20 2d 20 62 3b 0a 20 20 20 20  gSize) - b;.    
29d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29d30 20 20 20 20 20 61 73 73 65 72 74 28 20 62 21 3d       assert( b!=
29d40 30 20 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ); .          
29d50 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
29d60 6f 66 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f  of scanning a no
29d70 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
29d80 20 69 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e   is (N+1)*log2(N
29d90 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77  ).          ** w
29da0 68 69 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d  hich we will sim
29db0 70 6c 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a  plify to just N*
29dc0 6c 6f 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20  log2(N) */.     
29dd0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
29de0 3d 20 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69  = rSize + rLogSi
29df0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ze;.        }.  
29e00 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
29e10 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
29e20 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
29e30 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
29e40 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
29e50 7d 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  }.    rc = where
29e60 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65  LoopAddBtreeInde
29e70 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63  x(pBuilder, pSrc
29e80 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 0a 20  , pProbe, 0);.. 
29e90 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
29ea0 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
29eb0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e   clause, then on
29ec0 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65  ly that one inde
29ed0 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  x is.    ** cons
29ee0 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  idered. */.    i
29ef0 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  f( pSrc->pIndex 
29f00 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
29f10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
29f20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29f30 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
29f40 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
29f50 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
29f60 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  r a table of the
29f70 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64   join identified
29f80 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d   by.** pBuilder-
29f90 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
29fa0 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
29fb0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76  anteed to be a v
29fc0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
29fd0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
29fe0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
29ff0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2a000 64 65 72 20 2a 70 42 75 69 6c 64 65 72 20 20 20  der *pBuilder   
2a010 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
2a020 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29  information */.)
2a030 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
2a040 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
2a050 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
2a060 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
2a070 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a090 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
2a0a0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
2a0b0 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
2a0c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
2a0d0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
2a0e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2a0f0 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54  em *pSrc;   /* T
2a100 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
2a110 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
2a120 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
2a130 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2a140 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
2a150 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
2a160 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
2a170 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
2a180 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
2a190 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2a1a0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
2a1b0 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
2a1c0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
2a1d0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
2a1e0 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d  nt iTerm, mxTerm
2a1f0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
2a200 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49  int;.  int seenI
2a210 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
2a220 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2a230 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  n IN operator is
2a240 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73   seen */.  int s
2a250 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20  eenVar = 0;     
2a260 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a270 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  if a non-constan
2a280 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  t constraint is 
2a290 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50  seen */.  int iP
2a2a0 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  hase;           
2a2b0 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e         /* 0: con
2a2c0 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f  st w/o IN, 1: co
2a2d0 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20  nst, 2: no IN,  
2a2e0 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65  2: IN */.  Where
2a2f0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Loop *pNew;.  in
2a300 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a310 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  ;..  pWInfo = pB
2a320 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
2a330 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
2a340 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
2a350 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2a360 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
2a370 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  pWC;.  pNew = pB
2a380 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
2a390 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  pSrc = &pWInfo->
2a3a0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77  pTabList->a[pNew
2a3b0 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20  ->iTab];.  pTab 
2a3c0 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
2a3d0 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
2a3e0 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64  l(pTab) );.  pId
2a3f0 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
2a400 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65  IndexInfo(pParse
2a410 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75  , pWC, pSrc, pBu
2a420 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29  ilder->pOrderBy)
2a430 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
2a440 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2a450 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65  ITE_NOMEM;.  pNe
2a460 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20  w->prereq = 0;. 
2a470 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2a480 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  0;.  pNew->wsFla
2a490 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
2a4a0 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d  ALTABLE;.  pNew-
2a4b0 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
2a4c0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
2a4d0 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61  Free = 0;.  pUsa
2a4e0 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  ge = pIdxInfo->a
2a4f0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
2a500 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  .  nConstraint =
2a510 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73   pIdxInfo->nCons
2a520 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68  traint;.  if( wh
2a530 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
2a540 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61  , pNew, nConstra
2a550 69 6e 74 29 20 29 20 72 65 74 75 72 6e 20 53 51  int) ) return SQ
2a560 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 66  LITE_NOMEM;..  f
2a570 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68  or(iPhase=0; iPh
2a580 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b  ase<=3; iPhase++
2a590 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e  ){.    if( !seen
2a5a0 49 6e 20 26 26 20 28 69 50 68 61 73 65 26 31 29  In && (iPhase&1)
2a5b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68  !=0 ){.      iPh
2a5c0 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ase++;.      if(
2a5d0 20 69 50 68 61 73 65 3e 33 20 29 20 62 72 65 61   iPhase>3 ) brea
2a5e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
2a5f0 20 21 73 65 65 6e 56 61 72 20 26 26 20 69 50 68   !seenVar && iPh
2a600 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20  ase>1 ) break;. 
2a610 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28     pIdxCons = *(
2a620 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
2a630 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
2a640 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
2a650 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f  nstraint;.    fo
2a660 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
2a670 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
2a680 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
2a690 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78  {.      j = pIdx
2a6a0 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
2a6b0 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  t;.      pTerm =
2a6c0 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
2a6d0 20 20 20 73 77 69 74 63 68 28 20 69 50 68 61 73     switch( iPhas
2a6e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
2a6f0 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74  e 0:    /* Const
2a700 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20  ants without IN 
2a710 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
2a720 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2a730 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  usable = 0;.    
2a740 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
2a750 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2a760 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  _IN)!=0 ){.     
2a770 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20         seenIn = 
2a780 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
2a790 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72  se if( pTerm->pr
2a7a0 65 72 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a  ereqRight!=0 ){.
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
2a7c0 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Var = 1;.       
2a7d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a7e0 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2a7f0 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
2a800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a810 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2a820 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20 43   case 1:    /* C
2a830 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49 4e  onstants with IN
2a840 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
2a850 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2a860 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20 20  seenIn );.      
2a870 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
2a880 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70  able = (pTerm->p
2a890 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29 3b 0a  rereqRight==0);.
2a8a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2a8b0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a  .        case 2:
2a8c0 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73      /* Variables
2a8d0 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a 20   without IN */. 
2a8e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2a8f0 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20 20   seenVar );.    
2a900 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2a910 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
2a920 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2a930 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  IN)==0;.        
2a940 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2a950 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20 56   default:   /* V
2a960 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49 4e  ariables with IN
2a970 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
2a980 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26 26  sert( seenVar &&
2a990 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20   seenIn );.     
2a9a0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
2a9b0 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  sable = 1;.     
2a9c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a9d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65    }.    }.    me
2a9e0 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
2a9f0 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
2aa00 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )*pIdxInfo->nCon
2aa10 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69 66  straint);.    if
2aa20 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
2aa30 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73  ToFreeIdxStr ) s
2aa40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78  qlite3_free(pIdx
2aa50 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20  Info->idxStr);. 
2aa60 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
2aa70 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
2aa80 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
2aa90 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
2aaa0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2aab0 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  r = 0;.    pIdxI
2aac0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
2aad0 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49  umed = 0;.    pI
2aae0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
2aaf0 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  dCost = SQLITE_B
2ab00 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65  IG_DBL / (double
2ab10 29 32 3b 0a 20 20 20 20 72 63 20 3d 20 76 74 61  )2;.    rc = vta
2ab20 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
2ab30 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66  e, pTab, pIdxInf
2ab40 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
2ab50 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41   goto whereLoopA
2ab60 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20  ddVtab_exit;.   
2ab70 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
2ab80 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2ab90 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
2aba0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
2abb0 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77  traint;.    pNew
2abc0 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20  ->prereq = 0;.  
2abd0 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20    mxTerm = -1;. 
2abe0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2abf0 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72  >nLSlot>=nConstr
2ac00 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28  aint );.    for(
2ac10 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
2ac20 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61  nt; i++) pNew->a
2ac30 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20  LTerm[i] = 0;.  
2ac40 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
2ac50 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  mitMask = 0;.   
2ac60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
2ac70 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
2ac80 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20  dxCons++){.     
2ac90 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55   if( (iTerm = pU
2aca0 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
2acb0 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20  x - 1)>=0 ){.   
2acc0 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e       j = pIdxCon
2acd0 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
2ace0 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
2acf0 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20  m>=nConstraint. 
2ad00 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20          || j<0. 
2ad10 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57          || j>=pW
2ad20 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  C->nTerm.       
2ad30 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72    || pNew->aLTer
2ad40 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20  m[iTerm]!=0.    
2ad50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2ad60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2ad70 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  OR;.          sq
2ad80 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2ad90 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49  arse, "%s.xBestI
2ada0 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69  ndex() malfuncti
2adb0 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  on", pTab->zName
2adc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
2add0 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  o whereLoopAddVt
2ade0 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ab_exit;.       
2adf0 20 7d 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d   }.        pTerm
2ae00 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
2ae10 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
2ae20 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72  req |= pTerm->pr
2ae30 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
2ae40 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72 6d     assert( iTerm
2ae50 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b  <pNew->nLSlot );
2ae60 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
2ae70 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70  LTerm[iTerm] = p
2ae80 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
2ae90 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29  ( iTerm>mxTerm )
2aea0 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b   mxTerm = iTerm;
2aeb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
2aec0 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b  rm<16 && pUsage[
2aed0 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e  i].omit ) pNew->
2aee0 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
2aef0 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20  |= 1<<iTerm;.   
2af00 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2af10 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
2af20 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
2af30 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69      if( pUsage[i
2af40 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  ].omit==0 ){.   
2af50 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2af60 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ot attempt to us
2af70 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  e an IN constrai
2af80 6e 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61  nt if the virtua
2af90 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  l table.        
2afa0 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74      ** says that
2afb0 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
2afc0 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EQ constraint ca
2afd0 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f  nnot be safely o
2afe0 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20  mitted..        
2aff0 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20      ** If we do 
2b000 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73  attempt to use s
2b010 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  uch a constraint
2b020 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68  , some rows migh
2b030 74 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20  t be.           
2b040 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20   ** repeated in 
2b050 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20  the output. */. 
2b060 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2b070 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b080 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72          /* A vir
2b090 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
2b0a0 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
2b0b0 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d  y an IN clause m
2b0c0 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20  ay not.         
2b0d0 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20   ** consume the 
2b0e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2b0f0 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20  because (1) the 
2b100 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d  order of IN term
2b110 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
2b120 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
2b130 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
2b140 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74   order of output
2b150 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20   terms and.     
2b160 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74       ** (2) Mult
2b170 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f  iple outputs fro
2b180 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61  m a single IN va
2b190 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72  lue will not mer
2b1a0 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ge.          ** 
2b1b0 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20  together.  */.  
2b1c0 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
2b1d0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
2b1e0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  d = 0;.        }
2b1f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b200 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74     if( i>=nConst
2b210 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70  raint ){.      p
2b220 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78  New->nLTerm = mx
2b230 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73  Term+1;.      as
2b240 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65  sert( pNew->nLTe
2b250 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rm<=pNew->nLSlot
2b260 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
2b270 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20  u.vtab.idxNum = 
2b280 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
2b290 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
2b2a0 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
2b2b0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
2b2c0 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20  FreeIdxStr;.    
2b2d0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
2b2e0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
2b2f0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
2b300 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49  vtab.idxStr = pI
2b310 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a  dxInfo->idxStr;.
2b320 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
2b330 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28  ab.isOrdered = (
2b340 75 38 29 28 28 70 49 64 78 49 6e 66 6f 2d 3e 6e  u8)((pIdxInfo->n
2b350 4f 72 64 65 72 42 79 21 3d 30 29 0a 20 20 20 20  OrderBy!=0).    
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b380 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72   && pIdxInfo->or
2b390 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
2b3a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
2b3b0 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  up = 0;.      pN
2b3c0 65 77 2d 3e 72 52 75 6e 20 3d 20 77 68 65 72 65  ew->rRun = where
2b3d0 43 6f 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70  CostFromDouble(p
2b3e0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
2b3f0 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 2f  edCost);.      /
2b400 2a 20 54 55 4e 49 4e 47 3a 20 45 76 65 72 79 20  * TUNING: Every 
2b410 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 71 75  virtual table qu
2b420 65 72 79 20 72 65 74 75 72 6e 73 20 32 35 20 72  ery returns 25 r
2b430 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ows */.      pNe
2b440 77 2d 3e 6e 4f 75 74 20 3d 20 34 36 3b 20 20 61  w->nOut = 46;  a
2b450 73 73 65 72 74 28 20 34 36 3d 3d 77 68 65 72 65  ssert( 46==where
2b460 43 6f 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20  Cost(25) );.    
2b470 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72    whereLoopInser
2b480 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
2b490 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2b4a0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
2b4b0 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ee ){.        sq
2b4c0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
2b4d0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
2b4e0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
2b4f0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
2b500 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2b510 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f  }.  }  ..whereLo
2b520 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a  opAddVtab_exit:.
2b530 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
2b540 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2b550 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
2b560 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2b570 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2b580 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
2b590 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2b5a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2b5b0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2b5c0 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  BLE */../*.** Ad
2b5d0 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  d WhereLoop entr
2b5e0 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52  ies to handle OR
2b5f0 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f   terms.  This wo
2b600 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a  rks for either.*
2b610 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74  * btrees or virt
2b620 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  ual tables..*/.s
2b630 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2b640 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f  oopAddOr(WhereLo
2b650 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
2b660 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78  der, Bitmask mEx
2b670 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  tra){.  WhereInf
2b680 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
2b690 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
2b6a0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2b6b0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
2b6c0 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  New;.  WhereTerm
2b6d0 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64   *pTerm, *pWCEnd
2b6e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2b6f0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
2b700 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ur;.  WhereClaus
2b710 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72  e tempWC;.  Wher
2b720 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75  eLoopBuilder sSu
2b730 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4c  bBuild;.  WhereL
2b740 6f 6f 70 20 73 42 65 73 74 3b 0a 20 20 73 74 72  oop sBest;.  str
2b750 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2b760 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57   *pItem;.  .  pW
2b770 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
2b780 43 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  C;.  if( pWInfo-
2b790 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2b7a0 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72  ERE_AND_ONLY ) r
2b7b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b7c0 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43 2d  .  pWCEnd = pWC-
2b7d0 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  >a + pWC->nTerm;
2b7e0 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
2b7f0 65 72 2d 3e 70 4e 65 77 3b 0a 0a 20 20 66 6f 72  er->pNew;..  for
2b800 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
2b810 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72  Term<pWCEnd && r
2b820 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54  c==SQLITE_OK; pT
2b830 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
2b840 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2b850 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20  r & WO_OR)!=0.  
2b860 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e     && (pTerm->u.
2b870 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
2b880 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  le & pNew->maskS
2b890 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  elf)!=0 .    ){.
2b8a0 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
2b8b0 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20  e * const pOrWC 
2b8c0 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
2b8d0 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57  nfo->wc;.      W
2b8e0 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74  hereTerm * const
2b8f0 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72   pOrWCEnd = &pOr
2b900 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65  WC->a[pOrWC->nTe
2b910 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65  rm];.      Where
2b920 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20  Term *pOrTerm;. 
2b930 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 72       WhereCost r
2b940 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  Total = 0;.     
2b950 20 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 20   WhereCost nRow 
2b960 3d 20 30 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  = 0;.      Bitma
2b970 73 6b 20 70 72 65 72 65 71 20 3d 20 6d 45 78 74  sk prereq = mExt
2b980 72 61 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 77  ra;.    .      w
2b990 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 26 73 42  hereLoopInit(&sB
2b9a0 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
2b9b0 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
2b9c0 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
2b9d0 69 54 61 62 3b 0a 20 20 20 20 20 20 69 43 75 72  iTab;.      iCur
2b9e0 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
2b9f0 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69  r;.      sSubBui
2ba00 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a  ld = *pBuilder;.
2ba10 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
2ba20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2ba30 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 42      sSubBuild.pB
2ba40 65 73 74 20 3d 20 26 73 42 65 73 74 3b 0a 0a 20  est = &sBest;.. 
2ba50 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d       for(pOrTerm
2ba60 3d 70 4f 72 57 43 2d 3e 61 3b 20 72 63 3d 3d 53  =pOrWC->a; rc==S
2ba70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4f 72 54  QLITE_OK && pOrT
2ba80 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f  erm<pOrWCEnd; pO
2ba90 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
2baa0 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
2bab0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
2bac0 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ND)!=0 ){.      
2bad0 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57      sSubBuild.pW
2bae0 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e  C = &pOrTerm->u.
2baf0 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
2bb00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2bb10 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
2bb20 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20  sor==iCur ){.   
2bb30 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 57         tempWC.pW
2bb40 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e  Info = pWC->pWIn
2bb50 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  fo;.          te
2bb60 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70 57  mpWC.pOuter = pW
2bb70 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  C;.          tem
2bb80 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  pWC.op = TK_AND;
2bb90 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
2bba0 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  C.nTerm = 1;.   
2bbb0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20         tempWC.a 
2bbc0 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20  = pOrTerm;.     
2bbd0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
2bbe0 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20  WC = &tempWC;.  
2bbf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2bc00 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2bc10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bc20 20 20 20 73 42 65 73 74 2e 6d 61 73 6b 53 65 6c     sBest.maskSel
2bc30 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  f = 0;.        s
2bc40 42 65 73 74 2e 72 53 65 74 75 70 20 3d 20 30 3b  Best.rSetup = 0;
2bc50 0a 20 20 20 20 20 20 20 20 73 42 65 73 74 2e 72  .        sBest.r
2bc60 52 75 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  Run = 0;.#ifndef
2bc70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2bc80 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
2bc90 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
2bca0 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  pItem->pTab) ){.
2bcb0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
2bcc0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
2bcd0 61 6c 28 26 73 53 75 62 42 75 69 6c 64 29 3b 0a  al(&sSubBuild);.
2bce0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
2bcf0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
2bd00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
2bd10 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
2bd20 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74  &sSubBuild, mExt
2bd30 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ra);.        }. 
2bd40 20 20 20 20 20 20 20 69 66 28 20 73 42 65 73 74         if( sBest
2bd50 2e 6d 61 73 6b 53 65 6c 66 3d 3d 30 20 29 20 62  .maskSelf==0 ) b
2bd60 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73  reak;.        as
2bd70 73 65 72 74 28 20 73 42 65 73 74 2e 72 53 65 74  sert( sBest.rSet
2bd80 75 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  up==0 );.       
2bd90 20 72 54 6f 74 61 6c 20 3d 20 77 68 65 72 65 43   rTotal = whereC
2bda0 6f 73 74 41 64 64 28 72 54 6f 74 61 6c 2c 20 73  ostAdd(rTotal, s
2bdb0 42 65 73 74 2e 72 52 75 6e 29 3b 0a 20 20 20 20  Best.rRun);.    
2bdc0 20 20 20 20 6e 52 6f 77 20 3d 20 77 68 65 72 65      nRow = where
2bdd0 43 6f 73 74 41 64 64 28 6e 52 6f 77 2c 20 73 42  CostAdd(nRow, sB
2bde0 65 73 74 2e 6e 4f 75 74 29 3b 0a 20 20 20 20 20  est.nOut);.     
2bdf0 20 20 20 70 72 65 72 65 71 20 7c 3d 20 73 42 65     prereq |= sBe
2be00 73 74 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20  st.prereq;.     
2be10 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2be20 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 31   pNew->nLSlot>=1
2be30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 42   );.      if( sB
2be40 65 73 74 2e 6d 61 73 6b 53 65 6c 66 20 29 7b 0a  est.maskSelf ){.
2be50 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c          pNew->nL
2be60 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
2be70 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30    pNew->aLTerm[0
2be80 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
2be90 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2bea0 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
2beb0 52 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  R;.        pNew-
2bec0 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
2bed0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2bee0 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20  = rTotal;.      
2bef0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
2bf00 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Row;.        pNe
2bf10 77 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65 72  w->prereq = prer
2bf20 65 71 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  eq;.        mems
2bf30 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20  et(&pNew->u, 0, 
2bf40 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29  sizeof(pNew->u))
2bf50 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
2bf60 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2bf70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2bf80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
2bf90 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 70 57 49  ereLoopClear(pWI
2bfa0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nfo->pParse->db,
2bfb0 20 26 73 42 65 73 74 29 3b 0a 20 20 20 20 7d 0a   &sBest);.    }.
2bfc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2bfd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  .}../*.** Add al
2bfe0 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
2bff0 63 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  cts for all tabl
2c000 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es .*/.static in
2c010 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c  t whereLoopAddAl
2c020 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  l(WhereLoopBuild
2c030 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20  er *pBuilder){. 
2c040 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2c050 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2c060 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b  WInfo;.  Bitmask
2c070 20 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42   mExtra = 0;.  B
2c080 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20  itmask mPrior = 
2c090 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
2c0a0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2c0b0 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
2c0c0 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
2c0d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2c0e0 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
2c0f0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
2c100 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
2c110 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
2c120 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20  ->nLevel;.  int 
2c130 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c140 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79    u8 priorJoinTy
2c150 70 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c  pe = 0;.  WhereL
2c160 6f 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a  oop *pNew;..  /*
2c170 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
2c180 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
2c190 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
2c1a0 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
2c1b0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2c1c0 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
2c1d0 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
2c1e0 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
2c1f0 62 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e  bList->a; iTab<n
2c200 54 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c  TabList; iTab++,
2c210 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70   pItem++){.    p
2c220 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62  New->iTab = iTab
2c230 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b  ;.    pNew->mask
2c240 53 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26  Self = getMask(&
2c250 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
2c260 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2c270 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74  );.    if( ((pIt
2c280 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69  em->jointype|pri
2c290 6f 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28 4a  orJoinType) & (J
2c2a0 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
2c2b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45  )!=0 ){.      mE
2c2c0 78 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20  xtra = mPrior;. 
2c2d0 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f     }.    priorJo
2c2e0 69 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e  inType = pItem->
2c2f0 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66  jointype;.    if
2c300 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
2c310 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
2c320 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2c330 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c  AddVirtual(pBuil
2c340 64 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  der);.    }else{
2c350 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
2c360 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42  eLoopAddBtree(pB
2c370 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
2c380 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2c390 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c3a0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2c3b0 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64  LoopAddOr(pBuild
2c3c0 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
2c3d0 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d   }.    mPrior |=
2c3e0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b   pNew->maskSelf;
2c3f0 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64  .    if( rc || d
2c400 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2c410 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77  ) break;.  }.  w
2c420 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62  hereLoopClear(db
2c430 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
2c440 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
2c450 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61  xamine a WherePa
2c460 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64  th (with the add
2c470 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74  ition of the ext
2c480 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20  ra WhereLoop of 
2c490 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d  the 5th.** param
2c4a0 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66  eters) to see if
2c4b0 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73   it outputs rows
2c4c0 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
2c4d0 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f  d ORDER BY.** (o
2c4e0 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68  r GROUP BY) with
2c4f0 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20  out requiring a 
2c500 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65 20  separate source 
2c510 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75  operation.  Retu
2c520 72 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a  rn:.** .**    0:
2c530 20 20 4f 52 44 45 52 20 42 59 20 69 73 20 6e 6f    ORDER BY is no
2c540 74 20 73 61 74 69 73 66 69 65 64 2e 20 20 53 6f  t satisfied.  So
2c550 72 74 69 6e 67 20 72 65 71 75 69 72 65 64 0a 2a  rting required.*
2c560 2a 20 20 20 20 31 3a 20 20 4f 52 44 45 52 20 42  *    1:  ORDER B
2c570 59 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 20  Y is satisfied. 
2c580 20 20 20 20 20 4f 6d 69 74 20 73 6f 72 74 69 6e       Omit sortin
2c590 67 0a 2a 2a 20 20 20 2d 31 3a 20 20 55 6e 6b 6e  g.**   -1:  Unkn
2c5a0 6f 77 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65  own at this time
2c5b0 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
2c5c0 74 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  t wherePathSatis
2c5d0 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57  fiesOrderBy(.  W
2c5e0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2c5f0 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52  ,    /* The WHER
2c600 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
2c610 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2c620 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ,   /* ORDER BY 
2c630 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44  or GROUP BY or D
2c640 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74  ISTINCT clause t
2c650 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65  o check */.  Whe
2c660 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20  rePath *pPath,  
2c670 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50     /* The WhereP
2c680 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ath to check */.
2c690 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
2c6a0 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74  ,       /* Might
2c6b0 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47   contain WHERE_G
2c6c0 52 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f  ROUPBY or WHERE_
2c6d0 44 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20  DISTINCTBY */.  
2c6e0 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20  u16 nLoop,      
2c6f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c700 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50  of entries in pP
2c710 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
2c720 20 20 75 38 20 69 73 4c 61 73 74 4c 6f 6f 70 2c    u8 isLastLoop,
2c730 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2c740 69 66 20 70 4c 61 73 74 20 69 73 20 74 68 65 20  if pLast is the 
2c750 69 6e 6e 65 72 2d 6d 6f 73 74 20 6c 6f 6f 70 20  inner-most loop 
2c760 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
2c770 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64  pLast,     /* Ad
2c780 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  d this WhereLoop
2c790 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70   to the end of p
2c7a0 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f  Path->aLoop[] */
2c7b0 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76  .  Bitmask *pRev
2c7c0 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a  Mask     /* OUT:
2c7d0 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f   Mask of WhereLo
2c7e0 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65  ops to run in re
2c7f0 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29  verse order */.)
2c800 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20  {.  u8 revSet;  
2c810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2c820 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77  e if rev is know
2c830 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20  n */.  u8 rev;  
2c840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c850 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f  Composite sort o
2c860 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76  rder */.  u8 rev
2c870 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
2c880 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72  /* Index sort or
2c890 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72  der */.  u8 isOr
2c8a0 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f  derDistinct;   /
2c8b0 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72  * All prior Wher
2c8c0 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72  eLoops are order
2c8d0 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75  -distinct */.  u
2c8e0 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  8 distinctColumn
2c8f0 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  s;   /* True if 
2c900 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49  the loop has UNI
2c910 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  QUE NOT NULL col
2c920 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d  umns */.  u8 isM
2c930 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
2c940 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68  /* iColumn match
2c950 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  es a term of the
2c960 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2c970 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d   */.  u16 nColum
2c980 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  n;          /* N
2c990 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
2c9a0 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20   in pIndex */.  
2c9b0 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  u16 nOrderBy;   
2c9c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c9d0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
2c9e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2c9f0 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
2ca00 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2ca10 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e   of WhereLoop in
2ca20 20 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f   pPath being pro
2ca30 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  cessed */.  int 
2ca40 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
2ca50 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2ca60 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
2ca70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2ca80 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
2ca90 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65  or current Where
2caa0 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43  Loop */.  int iC
2cab0 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
2cac0 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  /* A column numb
2cad0 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20  er within table 
2cae0 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  iCur */.  WhereL
2caf0 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
2cb00 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65  /* Current Where
2cb10 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65  Loop being proce
2cb20 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65  ssed. */.  Where
2cb30 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
2cb40 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
2cb50 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
2cb60 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
2cb70 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20  *pOBExpr;       
2cb80 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
2cb90 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52  n from the ORDER
2cba0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2cbb0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
2cbc0 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45        /* COLLATE
2cbd0 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61   function from a
2cbe0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2cbf0 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65  e term */.  Inde
2cc00 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
2cc10 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61    /* The index a
2cc20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2cc30 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Loop */.  sqlite
2cc40 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
2cc50 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
2cc60 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
2cc70 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
2cc80 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f   obSat = 0;    /
2cc90 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20  * Mask of ORDER 
2cca0 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69  BY terms satisfi
2ccb0 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42  ed so far */.  B
2ccc0 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20  itmask obDone;  
2ccd0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2cce0 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72  all ORDER BY ter
2ccf0 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
2cd00 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
2cd10 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61  k;  /* Mask of a
2cd20 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20  ll well-ordered 
2cd30 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61  loops */.  Bitma
2cd40 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20  sk ready;       
2cd50 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2cd60 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f  f inner loops */
2cd70 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  /*.  ** We s
2cd80 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
2cd90 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66   is "one-row" if
2cda0 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f   it generates no
2cdb0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20   more than one. 
2cdc0 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75   ** row of outpu
2cdd0 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  t.  A WhereLoop 
2cde0 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c  is one-row if al
2cdf0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
2ce00 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a  ng are true:.  *
2ce10 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78  *  (a) All index
2ce20 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77   columns match w
2ce30 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ith WHERE_COLUMN
2ce40 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54  _EQ..  **  (b) T
2ce50 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71  he index is uniq
2ce60 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72  ue.  ** Any Wher
2ce70 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48  eLoop with an WH
2ce80 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f  ERE_COLUMN_EQ co
2ce90 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
2cea0 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77  rowid is one-row
2ceb0 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65  ..  ** Every one
2cec0 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77  -row WhereLoop w
2ced0 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45  ill have the WHE
2cee0 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65  RE_ONEROW bit se
2cef0 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20  t in wsFlags..  
2cf00 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  **.  ** We say t
2cf10 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
2cf20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22  "order-distinct"
2cf30 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63   if the set of c
2cf40 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a  olumns from.  **
2cf50 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20   that WhereLoop 
2cf60 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20  that are in the 
2cf70 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2cf80 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f  are different fo
2cf90 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77  r every.  ** row
2cfa0 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
2cfb0 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f  p.  Every one-ro
2cfc0 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61  w WhereLoop is a
2cfd0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a  utomatically.  *
2cfe0 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  * order-distinct
2cff0 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  .   A WhereLoop 
2d000 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75  that has no colu
2d010 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  mns in the ORDER
2d020 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   BY clause.  ** 
2d030 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73  is not order-dis
2d040 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64  tinct. To be ord
2d050 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e  er-distinct is n
2d060 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d  ot quite the sam
2d070 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20  e as being.  ** 
2d080 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55  UNIQUE since a U
2d090 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20  NIQUE column or 
2d0a0 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d  index can have m
2d0b0 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61  ultiple rows tha
2d0c0 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  t .  ** are NULL
2d0d0 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73   and NULL values
2d0e0 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20   are equivalent 
2d0f0 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20  for the purpose 
2d100 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  of order-distinc
2d110 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72  t..  ** To be or
2d120 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68  der-distinct, th
2d130 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62  e columns must b
2d140 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54  e UNIQUE and NOT
2d150 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   NULL..  **.  **
2d160 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61   The rowid for a
2d170 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73   table is always
2d180 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
2d190 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72  NULL so whenever
2d1a0 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20   the.  ** rowid 
2d1b0 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f  appears in the O
2d1c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2d1d0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2d1e0 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20  g WhereLoop is. 
2d1f0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
2d200 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  y order-distinct
2d210 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ..  */..  assert
2d220 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ( pOrderBy!=0 );
2d230 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69 6c 69  ..  /* Sortabili
2d240 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61  ty of virtual ta
2d250 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d 69 6e  bles is determin
2d260 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
2d270 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20 2a 2a  ndex method.  **
2d280 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
2d290 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a 2f 0a  table itself */.
2d2a0 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77 73 46    if( pLast->wsF
2d2b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2d2c0 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
2d2d0 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f 6f 70   testcase( nLoop
2d2e0 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65 20 77  >0 );  /* True w
2d2f0 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20  hen outer loops 
2d300 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e 64 20  are one-row and 
2d310 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20 20 20  match .         
2d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d330 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   ** no ORDER BY 
2d340 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72 65 74  terms */.    ret
2d350 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76 74 61  urn pLast->u.vta
2d360 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 7d  b.isOrdered;.  }
2d370 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20  .  if( nLoop && 
2d380 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
2d390 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2d3a0 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20  OrderByIdxJoin) 
2d3b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e  ) return 0;..  n
2d3c0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
2d3d0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28  By->nExpr;.  if(
2d3e0 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20   nOrderBy>BMS-1 
2d3f0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
2d400 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20  Cannot optimize 
2d410 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44  overly large ORD
2d420 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72  ER BYs */.  isOr
2d430 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b  derDistinct = 1;
2d440 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b  .  obDone = MASK
2d450 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b  BIT(nOrderBy)-1;
2d460 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74  .  orderDistinct
2d470 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64  Mask = 0;.  read
2d480 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f  y = 0;.  for(iLo
2d490 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73  op=0; isOrderDis
2d4a0 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f  tinct && obSat<o
2d4b0 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d  bDone && iLoop<=
2d4c0 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
2d4d0 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30  .    if( iLoop>0
2d4e0 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f   ) ready |= pLoo
2d4f0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
2d500 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e   pLoop = iLoop<n
2d510 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c  Loop ? pPath->aL
2d520 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61  oop[iLoop] : pLa
2d530 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
2d540 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2d550 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
2d560 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ABLE)==0 );.    
2d570 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
2d580 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
2d590 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
2d5a0 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
2d5b0 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
2d5c0 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
2d5d0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
2d5e0 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
2d5f0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
2d600 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
2d610 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
2d620 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
2d630 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
2d640 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
2d650 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
2d660 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
2d670 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
2d680 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
2d690 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
2d6a0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
2d6b0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
2d6c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
2d6d0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
2d6e0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
2d6f0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2d700 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
2d710 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
2d720 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
2d730 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
2d740 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
2d750 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d760 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
2d770 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  erm(&pWInfo->sWC
2d780 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d  , iCur, pOBExpr-
2d790 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >iColumn,.      
2d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7b0 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57   ~ready, WO_EQ|W
2d7c0 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  O_ISNULL, 0);.  
2d7d0 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
2d7e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d7f0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
2d800 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
2d810 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2d820 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20   *z1, *z2;.     
2d830 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2d840 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2d850 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
2d860 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2d870 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
2d880 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
2d890 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
2d8a0 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43  .        z1 = pC
2d8b0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
2d8c0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2d8d0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2d8e0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2d8f0 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Term->pExpr);.  
2d900 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2d910 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
2d920 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2d930 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z2 = pColl->zN
2d940 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
2d950 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2d960 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e  z1, z2)!=0 ) con
2d970 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
2d980 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
2d990 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
2d9a0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
2d9b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2d9c0 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20  _ONEROW)==0 ){. 
2d9d0 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
2d9e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2d9f0 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  IPK ){.        p
2da00 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
2da10 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a     nColumn = 0;.
2da20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2da30 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d  (pIndex = pLoop-
2da40 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
2da50 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62  ==0 || pIndex->b
2da60 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  Unordered ){.   
2da70 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2da80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2da90 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49      nColumn = pI
2daa0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  ndex->nColumn;. 
2dab0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2dac0 73 74 69 6e 63 74 20 3d 20 70 49 6e 64 65 78 2d  stinct = pIndex-
2dad0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
2dae0 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
2daf0 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 74    /* For every t
2db00 65 72 6d 20 6f 66 20 74 68 65 20 69 6e 64 65 78  erm of the index
2db10 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61   that is constra
2db20 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 53  ined by == or IS
2db30 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 2a 2a 20   NULL,.      ** 
2db40 6d 61 72 6b 20 6f 66 66 20 63 6f 72 72 65 73 70  mark off corresp
2db50 6f 6e 64 69 6e 67 20 4f 52 44 45 52 20 42 59 20  onding ORDER BY 
2db60 74 65 72 6d 73 20 77 68 65 72 65 76 65 72 20 74  terms wherever t
2db70 68 65 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20  hey occur.      
2db80 2a 2a 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ** in the ORDER 
2db90 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20  BY clause..     
2dba0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
2dbb0 30 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74  0; i<pLoop->u.bt
2dbc0 72 65 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20  ree.nEq; i++){. 
2dbd0 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70         pTerm = p
2dbe0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3b  Loop->aLTerm[i];
2dbf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
2dc00 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
2dc10 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
2dc20 4c 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  L))==0 ) continu
2dc30 65 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75  e;.        iColu
2dc40 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  mn = pTerm->u.le
2dc50 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
2dc60 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 4f 72    for(j=0; j<nOr
2dc70 64 65 72 42 79 3b 20 6a 2b 2b 29 7b 0a 20 20 20  derBy; j++){.   
2dc80 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
2dc90 49 54 28 6a 29 20 26 20 6f 62 53 61 74 20 29 20  IT(j) & obSat ) 
2dca0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2dcb0 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71      pOBExpr = sq
2dcc0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
2dcd0 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
2dce0 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [j].pExpr);.    
2dcf0 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
2dd00 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
2dd10 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2dd20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
2dd30 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
2dd40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2dd50 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
2dd60 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f  pr->iColumn!=iCo
2dd70 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
2dd80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2dd90 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
2dda0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
2ddb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2ddc0 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
2ddd0 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
2dde0 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  j].pExpr);.     
2ddf0 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
2de00 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
2de10 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2de20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2de30 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
2de40 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e  >zName, pIndex->
2de50 61 7a 43 6f 6c 6c 5b 69 5d 29 21 3d 30 20 29 20  azColl[i])!=0 ) 
2de60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2de70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2de80 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
2de90 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (j);.        }. 
2dea0 20 20 20 20 20 20 20 69 66 28 20 6f 62 53 61 74         if( obSat
2deb0 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72  ==obDone ) retur
2dec0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  n 1;.      }..  
2ded0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
2dee0 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ugh all columns 
2def0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
2df00 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f   deal with the o
2df10 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nes.      ** tha
2df20 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72  t are not constr
2df30 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49  ained by == or I
2df40 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  N..      */.    
2df50 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d    rev = revSet =
2df60 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e   0;.      distin
2df70 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20  ctColumns = 0;. 
2df80 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2df90 3d 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  =nColumn; j++){.
2dfa0 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65          u8 bOnce
2dfb0 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72  ;   /* True to r
2dfc0 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  un the ORDER BY 
2dfd0 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a  search loop */..
2dfe0 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
2dff0 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e  over == and IS N
2e000 55 4c 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  ULL terms */.   
2e010 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70       if( j<pLoop
2e020 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
2e030 20 20 20 20 20 20 20 26 26 20 28 28 69 20 3d 20         && ((i = 
2e040 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
2e050 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28  ->eOperator) & (
2e060 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_EQ|WO_ISNULL)
2e070 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )!=0.        ){.
2e080 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 20            if( i 
2e090 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 20 69 73  & WO_ISNULL ) is
2e0a0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2e0b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  0;.          con
2e0c0 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20  tinue;  .       
2e0d0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   }..        /* G
2e0e0 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  et the column nu
2e0f0 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c  mber in the tabl
2e100 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20  e (iColumn) and 
2e110 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20  sort order.     
2e120 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66     ** (revIdx) f
2e130 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  or the j-th colu
2e140 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
2e150 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2e160 20 20 20 20 69 66 28 20 6a 3c 6e 43 6f 6c 75 6d      if( j<nColum
2e170 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  n ){.          /
2e180 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64 65 78 20 63  * Normal index c
2e190 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
2e1a0 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49      iColumn = pI
2e1b0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
2e1c0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  ];.          rev
2e1d0 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53  Idx = pIndex->aS
2e1e0 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20  ortOrder[j];.   
2e1f0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
2e200 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62  mn==pIndex->pTab
2e210 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c  le->iPKey ) iCol
2e220 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
2e230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e240 20 20 20 2f 2a 20 54 68 65 20 52 4f 57 49 44 20     /* The ROWID 
2e250 63 6f 6c 75 6d 6e 20 61 74 20 74 68 65 20 65 6e  column at the en
2e260 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  d */.          i
2e270 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
2e280 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
2e290 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
2e2a0 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f        /* An unco
2e2b0 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e  nstrained column
2e2c0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e   that might be N
2e2d0 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
2e2e0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  his.        ** W
2e2f0 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20  hereLoop is not 
2e300 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 0a 20 20  well-ordered .  
2e310 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2e320 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
2e330 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26  inct.         &&
2e340 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20   iColumn>=0.    
2e350 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70       && j>=pLoop
2e360 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
2e370 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78         && pIndex
2e380 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
2e390 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
2e3a0 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
2e3b0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
2e3c0 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
2e3d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2e3e0 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45  /* Find the ORDE
2e3f0 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63  R BY term that c
2e400 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
2e410 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20  e j-th column.  
2e420 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
2e430 69 6e 64 65 78 20 61 6e 64 20 61 6e 64 20 6d 61  index and and ma
2e440 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59  rk that ORDER BY
2e450 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20   term off .     
2e460 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f     */.        bO
2e470 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nce = 1;.       
2e480 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
2e490 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
2e4a0 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
2e4b0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
2e4c0 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2e4d0 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2e4e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2e4f0 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
2e500 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
2e510 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
2e520 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
2e530 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
2e540 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55  gs & (WHERE_GROU
2e550 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e  PBY|WHERE_DISTIN
2e560 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63  CTBY))==0 ) bOnc
2e570 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2e580 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
2e590 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
2e5a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2e5b0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
2e5c0 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
2e5d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2e5e0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
2e5f0 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
2e600 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2e610 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
2e620 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
2e630 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2e640 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2e650 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2e660 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2e670 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
2e680 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
2e690 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
2e6a0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
2e6b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2e6c0 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
2e6d0 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  e, pIndex->azCol
2e6e0 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69  l[j])!=0 ) conti
2e6f0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
2e700 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74  .          isMat
2e710 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ch = 1;.        
2e720 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2e730 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
2e740 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  sMatch ){.      
2e750 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c      if( iColumn<
2e760 30 20 29 20 64 69 73 74 69 6e 63 74 43 6f 6c 75  0 ) distinctColu
2e770 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
2e780 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
2e790 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
2e7a0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
2e7b0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2e7c0 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b  E_GROUPBY)==0 ){
2e7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2e7e0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f  Make sure the so
2e7f0 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70  rt order is comp
2e800 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44  atible in an ORD
2e810 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
2e820 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72            ** Sor
2e830 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c  t order is irrel
2e840 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55  evant for a GROU
2e850 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a  P BY clause. */.
2e860 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e870 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20  revSet ){.      
2e880 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76          if( (rev
2e890 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64   ^ revIdx)!=pOrd
2e8a0 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
2e8b0 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rder ) return 0;
2e8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
2e8d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2e8e0 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e    rev = revIdx ^
2e8f0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2e900 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  sortOrder;.     
2e910 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
2e920 20 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20   ) *pRevMask |= 
2e930 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a  MASKBIT(iLoop);.
2e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2e950 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  vSet = 1;.      
2e960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e970 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2e980 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2e990 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
2e9a0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2e9b0 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 43 6f 6c 75 6d  j==0 || j<nColum
2e9c0 6e 20 29 20 69 73 4f 72 64 65 72 44 69 73 74 69  n ) isOrderDisti
2e9d0 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
2e9e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2e9f0 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65    }.      } /* e
2ea00 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  nd Loop over all
2ea10 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a   index columns *
2ea20 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73 74  /.      if( dist
2ea30 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 20 69 73  inctColumns ) is
2ea40 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
2ea50 31 3b 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d  1;.    } /* end-
2ea60 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a  if not one-row *
2ea70 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  /..    /* Mark o
2ea80 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44  ff any other ORD
2ea90 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
2eaa0 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70   reference pLoop
2eab0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72   */.    if( isOr
2eac0 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  derDistinct ){. 
2ead0 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e       orderDistin
2eae0 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d  ctMask |= pLoop-
2eaf0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
2eb00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
2eb10 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
2eb20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
2eb30 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
2eb40 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
2eb50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2eb60 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  p = pOrderBy->a[
2eb70 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
2eb80 20 20 69 66 28 20 28 65 78 70 72 54 61 62 6c 65    if( (exprTable
2eb90 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73  Usage(&pWInfo->s
2eba0 4d 61 73 6b 53 65 74 2c 20 70 29 26 7e 6f 72 64  MaskSet, p)&~ord
2ebb0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d  erDistinctMask)=
2ebc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2ebd0 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
2ebe0 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
2ebf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2ec00 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70   /* End the loop
2ec10 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c   over all WhereL
2ec20 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d  oops from outer-
2ec30 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e  most down to inn
2ec40 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28  er-most */.  if(
2ec50 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29   obSat==obDone )
2ec60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
2ec70 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63   !isOrderDistinc
2ec80 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  t ) return 0;.  
2ec90 69 66 28 20 69 73 4c 61 73 74 4c 6f 6f 70 20 29  if( isLastLoop )
2eca0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
2ecb0 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65  urn -1;.}..#ifde
2ecc0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
2ecd0 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75  BLED./* For debu
2ece0 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20  gging use only: 
2ecf0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2ed00 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e  char *wherePathN
2ed10 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70  ame(WherePath *p
2ed20 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c  Path, int nLoop,
2ed30 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
2ed40 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  t){.  static cha
2ed50 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69  r zName[65];.  i
2ed60 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
2ed70 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20   i<nLoop; i++){ 
2ed80 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68  zName[i] = pPath
2ed90 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b  ->aLoop[i]->cId;
2eda0 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29   }.  if( pLast )
2edb0 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c   zName[i++] = pL
2edc0 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d  ast->cId;.  zNam
2edd0 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  e[i] = 0;.  retu
2ede0 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  rn zName;.}.#end
2edf0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  if.../*.** Given
2ee00 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
2ee10 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 6f  reLoop objects o
2ee20 6e 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  n pWInfo->pLoops
2ee30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
2ee40 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  * attempts to fi
2ee50 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
2ee60 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73  st path that vis
2ee70 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f  its each WhereLo
2ee80 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69  op.** once.  Thi
2ee90 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c  s path is then l
2eea0 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70  oaded into the p
2eeb0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f  WInfo->a[].pWLoo
2eec0 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  p fields..**.** 
2eed0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2eee0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
2eef0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
2ef00 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2ef10 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
2ef20 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
2ef30 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
2ef40 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
2ef50 6e 66 6f 2c 20 57 68 65 72 65 43 6f 73 74 20 6e  nfo, WhereCost n
2ef60 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d  RowEst){.  int m
2ef70 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20  xChoice;        
2ef80 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2ef90 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74  number of simult
2efa0 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61  aneous paths tra
2efb0 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  cked */.  int nL
2efc0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
2efd0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2efe0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f   terms in the jo
2eff0 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  in */.  Parse *p
2f000 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
2f010 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
2f020 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
2f030 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2f040 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2f050 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2f060 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
2f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f080 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76   Loop counter ov
2f090 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
2f0a0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e  the join */.  in
2f0b0 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20  t ii, jj;       
2f0c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2f0d0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
2f0e0 65 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20  ereCost rCost;  
2f0f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2f100 73 74 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a  st of a path */.
2f110 20 20 57 68 65 72 65 43 6f 73 74 20 6d 78 43 6f    WhereCost mxCo
2f120 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
2f130 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f  * Maximum cost o
2f140 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73  f a set of paths
2f150 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
2f160 72 53 6f 72 74 43 6f 73 74 3b 20 20 20 20 20 20  rSortCost;      
2f170 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20 64 6f     /* Cost to do
2f180 20 61 20 73 6f 72 74 20 2a 2f 0a 20 20 69 6e 74   a sort */.  int
2f190 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20   nTo, nFrom;    
2f1a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f1b0 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65   of valid entrie
2f1c0 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61  s in aTo[] and a
2f1d0 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  From[] */.  Wher
2f1e0 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20  ePath *aFrom;   
2f1f0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72        /* All nFr
2f200 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20  om paths at the 
2f210 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a  previous level *
2f220 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
2f230 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
2f240 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61   The nTo best pa
2f250 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65  ths at the curre
2f260 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  nt level */.  Wh
2f270 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20  erePath *pFrom; 
2f280 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
2f290 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d  ement of aFrom[]
2f2a0 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
2f2b0 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
2f2c0 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20  rePath *pTo;    
2f2d0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
2f2e0 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68  ment of aTo[] th
2f2f0 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
2f300 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  g on */.  WhereL
2f310 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20  oop *pWLoop;    
2f320 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
2f330 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
2f340 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  cts */.  WhereLo
2f350 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20  op **pX;        
2f360 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69     /* Used to di
2f370 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65  vy up the pSpace
2f380 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68 61   memory */.  cha
2f390 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  r *pSpace;      
2f3a0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
2f3b0 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ary memory used 
2f3c0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
2f3d0 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
2f3e0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
2f3f0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2f400 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e  ;.  nLoop = pWIn
2f410 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a  fo->nLevel;.  /*
2f420 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d   TUNING: For sim
2f430 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c  ple queries, onl
2f440 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68 20  y the best path 
2f450 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a  is tracked..  **
2f460 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73   For 2-way joins
2f470 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61 74  , the 5 best pat
2f480 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e  hs are followed.
2f490 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20  .  ** For joins 
2f4a0 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62  of 3 or more tab
2f4b0 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31  les, track the 1
2f4c0 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a  0 best paths */.
2f4d0 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c    mxChoice = (nL
2f4e0 6f 6f 70 3d 3d 31 29 20 3f 20 31 20 3a 20 28 6e  oop==1) ? 1 : (n
2f4f0 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30  Loop==2 ? 5 : 10
2f500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  );.  assert( nLo
2f510 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62  op<=pWInfo->pTab
2f520 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
2f530 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32  WHERETRACE(0x002
2f540 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73  , ("---- begin s
2f550 6f 6c 76 65 72 5c 6e 22 29 29 3b 0a 0a 20 20 2f  olver\n"));..  /
2f560 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2f570 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20  nitialize space 
2f580 66 6f 72 20 61 54 6f 20 61 6e 64 20 61 46 72 6f  for aTo and aFro
2f590 6d 20 2a 2f 0a 20 20 69 69 20 3d 20 28 73 69 7a  m */.  ii = (siz
2f5a0 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b 73  eof(WherePath)+s
2f5b0 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a  izeof(WhereLoop*
2f5c0 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63  )*nLoop)*mxChoic
2f5d0 65 2a 32 3b 0a 20 20 70 53 70 61 63 65 20 3d 20  e*2;.  pSpace = 
2f5e0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
2f5f0 61 77 28 64 62 2c 20 69 69 29 3b 0a 20 20 69 66  aw(db, ii);.  if
2f600 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  ( pSpace==0 ) re
2f610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2f620 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72  M;.  aTo = (Wher
2f630 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20  ePath*)pSpace;. 
2f640 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43   aFrom = aTo+mxC
2f650 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28  hoice;.  memset(
2f660 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  aFrom, 0, sizeof
2f670 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70  (aFrom[0]));.  p
2f680 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a  X = (WhereLoop**
2f690 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65  )(aFrom+mxChoice
2f6a0 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68  );.  for(ii=mxCh
2f6b0 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54  oice*2, pFrom=aT
2f6c0 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70  o; ii>0; ii--, p
2f6d0 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c  From++, pX += nL
2f6e0 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  oop){.    pFrom-
2f6f0 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d  >aLoop = pX;.  }
2f700 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20  ..  /* Seed the 
2f710 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69  search with a si
2f720 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63  ngle WherePath c
2f730 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57  ontaining zero W
2f740 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a  hereLoops..  **.
2f750 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20    ** TUNING: Do 
2f760 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62  not let the numb
2f770 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73  er of iterations
2f780 20 67 6f 20 61 62 6f 76 65 20 32 35 2e 20 20 49   go above 25.  I
2f790 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20  f the cost.  ** 
2f7a0 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20  of computing an 
2f7b0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
2f7c0 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b  is not paid back
2f7d0 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
2f7e0 74 20 32 35 0a 20 20 2a 2a 20 72 6f 77 73 2c 20  t 25.  ** rows, 
2f7f0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20  then do not use 
2f800 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
2f810 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b  dex. */.  aFrom[
2f820 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50  0].nRow = MIN(pP
2f830 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
2f840 2c 20 34 36 29 3b 20 20 61 73 73 65 72 74 28 20  , 46);  assert( 
2f850 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35  46==whereCost(25
2f860 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31  ) );.  nFrom = 1
2f870 3b 0a 0a 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75  ;..  /* Precompu
2f880 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  te the cost of s
2f890 6f 72 74 69 6e 67 20 74 68 65 20 66 69 6e 61 6c  orting the final
2f8a0 20 72 65 73 75 6c 74 20 73 65 74 2c 20 69 66 20   result set, if 
2f8b0 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20  the caller.  ** 
2f8c0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
2f8d0 65 67 69 6e 28 29 20 77 61 73 20 63 6f 6e 63 65  egin() was conce
2f8e0 72 6e 65 64 20 61 62 6f 75 74 20 73 6f 72 74 69  rned about sorti
2f8f0 6e 67 20 2a 2f 0a 20 20 72 53 6f 72 74 43 6f 73  ng */.  rSortCos
2f900 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 49  t = 0;.  if( pWI
2f910 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
2f920 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29   || nRowEst==0 )
2f930 7b 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69  {.    aFrom[0].i
2f940 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20  sOrderedValid = 
2f950 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
2f960 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d  /* TUNING: Estim
2f970 61 74 65 64 20 63 6f 73 74 20 6f 66 20 73 6f 72  ated cost of sor
2f980 74 69 6e 67 20 69 73 20 4e 2a 6c 6f 67 32 28 4e  ting is N*log2(N
2f990 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  ) where N is the
2f9a0 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  .    ** number o
2f9b0 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 20 2a  f output rows. *
2f9c0 2f 0a 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20  /.    rSortCost 
2f9d0 3d 20 6e 52 6f 77 45 73 74 20 2b 20 65 73 74 4c  = nRowEst + estL
2f9e0 6f 67 28 6e 52 6f 77 45 73 74 29 3b 0a 20 20 20  og(nRowEst);.   
2f9f0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30   WHERETRACE(0x00
2fa00 32 2c 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f  2,("---- sort co
2fa10 73 74 3d 25 2d 33 64 5c 6e 22 2c 20 72 53 6f 72  st=%-3d\n", rSor
2fa20 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20  tCost));.  }..  
2fa30 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65  /* Compute succe
2fa40 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57  ssively longer W
2fa50 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20  herePaths using 
2fa60 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e  the previous gen
2fa70 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20  eration.  ** of 
2fa80 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68  WherePaths as th
2fa90 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20  e basis for the 
2faa0 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63  next.  Keep trac
2fab0 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  k of the mxChoic
2fac0 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68  e.  ** best path
2fad0 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61  s at each genera
2fae0 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  tion */.  for(iL
2faf0 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
2fb00 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
2fb10 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66    nTo = 0;.    f
2fb20 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61  or(ii=0, pFrom=a
2fb30 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  From; ii<nFrom; 
2fb40 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a  ii++, pFrom++){.
2fb50 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70        for(pWLoop
2fb60 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b  =pWInfo->pLoops;
2fb70 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d   pWLoop; pWLoop=
2fb80 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f  pWLoop->pNextLoo
2fb90 70 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  p){.        Bitm
2fba0 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 0a 20 20 20  ask maskNew;.   
2fbb0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
2fbc0 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mask = 0;.      
2fbd0 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 56 61    u8 isOrderedVa
2fbe0 6c 69 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  lid = pFrom->isO
2fbf0 72 64 65 72 65 64 56 61 6c 69 64 3b 0a 20 20 20  rderedValid;.   
2fc00 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72 65       u8 isOrdere
2fc10 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  d = pFrom->isOrd
2fc20 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  ered;.        if
2fc30 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65  ( (pWLoop->prere
2fc40 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b  q & ~pFrom->mask
2fc50 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69  Loop)!=0 ) conti
2fc60 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
2fc70 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65   (pWLoop->maskSe
2fc80 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  lf & pFrom->mask
2fc90 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69  Loop)!=0 ) conti
2fca0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  nue;.        /* 
2fcb0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70  At this point, p
2fcc0 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69  WLoop is a candi
2fcd0 64 61 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e  date to be the n
2fce0 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20  ext loop. .     
2fcf0 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74     ** Compute it
2fd00 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20  s cost */.      
2fd10 20 20 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43    rCost = whereC
2fd20 6f 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72  ostAdd(pWLoop->r
2fd30 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52  Setup,pWLoop->rR
2fd40 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  un + pFrom->nRow
2fd50 29 3b 0a 20 20 20 20 20 20 20 20 72 43 6f 73 74  );.        rCost
2fd60 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
2fd70 72 43 6f 73 74 2c 20 70 46 72 6f 6d 2d 3e 72 43  rCost, pFrom->rC
2fd80 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 61  ost);.        ma
2fd90 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d  skNew = pFrom->m
2fda0 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70  askLoop | pWLoop
2fdb0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
2fdc0 20 20 20 20 69 66 28 20 21 69 73 4f 72 64 65 72      if( !isOrder
2fdd0 65 64 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  edValid ){.     
2fde0 20 20 20 20 20 73 77 69 74 63 68 28 20 77 68 65       switch( whe
2fdf0 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
2fe00 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20  rderBy(pWInfo,. 
2fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
2fe30 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70  rderBy, pFrom, p
2fe40 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2fe50 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2fe60 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c            iLoop,
2fe70 20 69 4c 6f 6f 70 3d 3d 6e 4c 6f 6f 70 2d 31 2c   iLoop==nLoop-1,
2fe80 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73   pWLoop, &revMas
2fe90 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
2fea0 20 20 63 61 73 65 20 31 3a 20 20 2f 2a 20 59 65    case 1:  /* Ye
2feb0 73 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  s.  pFrom+pWLoop
2fec0 20 64 6f 65 73 20 73 61 74 69 73 66 79 20 74 68   does satisfy th
2fed0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2fee0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
2fef0 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 31     isOrdered = 1
2ff00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ff10 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
2ff20 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2ff30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2ff40 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 2f 2a       case 0:  /*
2ff50 20 4e 6f 2e 20 20 70 46 72 6f 6d 2b 70 57 4c 6f   No.  pFrom+pWLo
2ff60 6f 70 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  op will require 
2ff70 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20  a separate sort 
2ff80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2ff90 20 69 73 4f 72 64 65 72 65 64 20 3d 20 30 3b 0a   isOrdered = 0;.
2ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2ffb0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d 20 31  OrderedValid = 1
2ffc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ffd0 72 43 6f 73 74 20 3d 20 77 68 65 72 65 43 6f 73  rCost = whereCos
2ffe0 74 41 64 64 28 72 43 6f 73 74 2c 20 72 53 6f 72  tAdd(rCost, rSor
2fff0 74 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  tCost);.        
30000 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
30010 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
30020 3a 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c  : /* Cannot tell
30030 20 79 65 74 2e 20 20 54 72 79 20 61 67 61 69 6e   yet.  Try again
30040 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 74 65   on the next ite
30050 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
30060 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
30070 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30090 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46      revMask = pF
300a0 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
300b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
300c0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
300d0 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64  if pWLoop should
300e0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
300f0 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 20 73   mxChoice best s
30100 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
30110 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61   for(jj=0, pTo=a
30120 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b  To; jj<nTo; jj++
30130 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
30140 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73      if( pTo->mas
30150 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 20 26  kLoop==maskNew &
30160 26 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  & pTo->isOrdered
30170 56 61 6c 69 64 3d 3d 69 73 4f 72 64 65 72 65 64  Valid==isOrdered
30180 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Valid ){.       
30190 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
301a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
301b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a  }.        if( jj
301c0 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20  >=nTo ){.       
301d0 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
301e0 6f 69 63 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d  oice && rCost>=m
301f0 78 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20  xCost ){.#ifdef 
30200 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
30210 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ED.            i
30220 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
30230 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
30240 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30250 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b  3DebugPrintf("Sk
30260 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 33 64  ip   %s cost=%3d
30270 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
30280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30290 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
302a0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
302b0 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20  op), rCost,.    
302c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
302d0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28  OrderedValid ? (
302e0 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
302f0 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
30300 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
30310 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
30320 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
30330 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30340 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 50 61 74  /* Add a new Pat
30350 68 20 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73  h to the aTo[] s
30360 65 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  et */.          
30370 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65  if( nTo<mxChoice
30380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30390 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  /* Increase the 
303a0 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20  size of the aTo 
303b0 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20  set by one */.  
303c0 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e            jj = n
303d0 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  To++;.          
303e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
303f0 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72     /* New path r
30400 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f  eplaces the prio
30410 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20  r worst to keep 
30420 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68  count below mxCh
30430 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  oice */.        
30440 20 20 20 20 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31      for(jj=nTo-1
30450 3b 20 61 54 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c  ; aTo[jj].rCost<
30460 6d 78 43 6f 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61  mxCost; jj--){ a
30470 73 73 65 72 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20  ssert(jj>0); }. 
30480 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30490 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b       pTo = &aTo[
304a0 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52  jj];.#ifdef WHER
304b0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
304c0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
304d0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
304e0 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
304f0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
30500 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20  intf("New    %s 
30510 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d  cost=%-3d order=
30520 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
30530 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
30540 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
30550 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
30560 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
30570 20 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69     isOrderedVali
30580 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f  d ? (isOrdered ?
30590 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
305a0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
305b0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
305c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
305d0 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d  if( pTo->rCost<=
305e0 72 43 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20  rCost ){.#ifdef 
305f0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
30600 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ED.            i
30610 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
30620 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
30630 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30640 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
30650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30660 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
30670 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  %-3d order=%c",.
30680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30690 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
306a0 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
306b0 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20  Loop), rCost,.  
306c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306d0 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
306e0 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59   (isOrdered ? 'Y
306f0 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
30700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
30710 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
30720 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74  f("   vs %s cost
30730 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  =%-3d order=%c\n
30740 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
30750 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
30760 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
30770 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
30780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30790 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
307a0 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69  dValid ? (pTo->i
307b0 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
307c0 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
307d0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
307e0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  if.            c
307f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
30800 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f     }.          /
30810 2a 20 41 20 6e 65 77 20 61 6e 64 20 62 65 74 74  * A new and bett
30820 65 72 20 73 63 6f 72 65 20 66 6f 72 20 61 20 70  er score for a p
30830 72 65 76 69 6f 75 73 6c 79 20 63 72 65 61 74 65  reviously create
30840 64 20 65 71 75 69 76 61 6c 65 6e 74 20 70 61 74  d equivalent pat
30850 68 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  h */.#ifdef WHER
30860 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
30870 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
30880 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
30890 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
308a0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
308b0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
308c0 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73        "Update %s
308d0 20 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72   cost=%-3d order
308e0 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
308f0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
30900 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
30910 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
30920 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30930 20 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64    isOrderedValid
30940 20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20   ? (isOrdered ? 
30950 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27  'Y' : 'N') : '?'
30960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
30970 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
30980 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74  f("  was %s cost
30990 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  =%-3d order=%c\n
309a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
309b0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
309c0 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
309d0 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20  ), pTo->rCost,. 
309e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
309f0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
30a00 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  id ? (pTo->isOrd
30a10 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
30a20 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
30a30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
30a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
30a50 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69  * pWLoop is a wi
30a60 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f  nner.  Add it to
30a70 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
30a80 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
30a90 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70     pTo->maskLoop
30aa0 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
30ab0 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
30ac0 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70  kSelf;.        p
30ad0 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65  To->revLoop = re
30ae0 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  vMask;.        p
30af0 54 6f 2d 3e 6e 52 6f 77 20 3d 20 70 46 72 6f 6d  To->nRow = pFrom
30b00 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d  ->nRow + pWLoop-
30b10 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70  >nOut;.        p
30b20 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  To->rCost = rCos
30b30 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
30b40 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
30b50 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b   isOrderedValid;
30b60 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73  .        pTo->is
30b70 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65  Ordered = isOrde
30b80 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  red;.        mem
30b90 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20  cpy(pTo->aLoop, 
30ba0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69  pFrom->aLoop, si
30bb0 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
30bc0 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  *iLoop);.       
30bd0 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f   pTo->aLoop[iLoo
30be0 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20  p] = pWLoop;.   
30bf0 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
30c00 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
30c10 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f      mxCost = aTo
30c20 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20  [0].rCost;.     
30c30 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70       for(jj=1, p
30c40 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d  To=&aTo[1]; jj<m
30c50 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70  xChoice; jj++, p
30c60 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
30c70 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73     if( pTo->rCos
30c80 74 3e 6d 78 43 6f 73 74 20 29 20 6d 78 43 6f 73  t>mxCost ) mxCos
30c90 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a  t = pTo->rCost;.
30ca0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30cc0 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52    }..#ifdef WHER
30cd0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
30ce0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
30cf0 65 72 65 54 72 61 63 65 3e 3d 32 20 29 7b 0a 20  ereTrace>=2 ){. 
30d00 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
30d10 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66  gPrintf("---- af
30d20 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d  ter round %d ---
30d30 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20  -\n", iLoop);.  
30d40 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54      for(ii=0, pT
30d50 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69  o=aTo; ii<nTo; i
30d60 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  i++, pTo++){.   
30d70 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
30d80 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73  gPrintf(" %s cos
30d90 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64  t=%-3d nrow=%-3d
30da0 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
30db0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
30dc0 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
30dd0 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
30de0 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
30df0 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
30e00 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28  OrderedValid ? (
30e10 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f  pTo->isOrdered ?
30e20 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f   'Y' : 'N') : '?
30e30 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ');.        if( 
30e40 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61  pTo->isOrderedVa
30e50 6c 69 64 20 26 26 20 70 54 6f 2d 3e 69 73 4f 72  lid && pTo->isOr
30e60 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
30e70 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
30e80 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25 6c  rintf(" rev=0x%l
30e90 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c  lx\n", pTo->revL
30ea0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oop);.        }e
30eb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
30ec0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
30ed0 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  f("\n");.       
30ee0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
30ef0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
30f00 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20 6f  Swap the roles o
30f10 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20  f aFrom and aTo 
30f20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65 6e  for the next gen
30f30 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70  eration */.    p
30f40 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20  From = aTo;.    
30f50 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20  aTo = aFrom;.   
30f60 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a   aFrom = pFrom;.
30f70 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b      nFrom = nTo;
30f80 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f  .  }..  if( nFro
30f90 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
30fa0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
30fb0 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73 6f  se, "no query so
30fc0 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71  lution");.    sq
30fd0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
30fe0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74  pSpace);.    ret
30ff0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
31000 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
31010 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
31020 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20  st path.  pFrom 
31030 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
31040 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61  nting to that pa
31050 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20  th */.  pFrom = 
31060 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d  aFrom;.  for(ii=
31070 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  1; ii<nFrom; ii+
31080 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  +){.    if( pFro
31090 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69  m->rCost>aFrom[i
310a0 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d  i].rCost ) pFrom
310b0 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20   = &aFrom[ii];. 
310c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49   }.  assert( pWI
310d0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f  nfo->nLevel==nLo
310e0 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20  op );.  /* Load 
310f0 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
31100 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f  path into pWInfo
31110 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d   */.  for(iLoop=
31120 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20  0; iLoop<nLoop; 
31130 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68  iLoop++){.    Wh
31140 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
31150 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69   = pWInfo->a + i
31160 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Loop;.    pLevel
31170 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f  ->pWLoop = pWLoo
31180 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  p = pFrom->aLoop
31190 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65  [iLoop];.    pLe
311a0 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c  vel->iFrom = pWL
311b0 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70  oop->iTab;.    p
311c0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
311d0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
311e0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
311f0 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d  om].iCursor;.  }
31200 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e  .  if( (pWInfo->
31210 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
31220 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d  RE_DISTINCTBY)==
31230 30 20 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  0 .   && pWInfo-
31240 3e 70 44 69 73 74 69 6e 63 74 0a 20 20 20 26 26  >pDistinct.   &&
31250 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20   nRowEst.  ){.  
31260 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65    Bitmask notUse
31270 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  d;.    int rc = 
31280 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
31290 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
312a0 2c 20 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69  , pWInfo->pDisti
312b0 6e 63 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20  nct, pFrom,.    
312c0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
312d0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e  RE_DISTINCTBY, n
312e0 4c 6f 6f 70 2d 31 2c 20 31 2c 20 70 46 72 6f 6d  Loop-1, 1, pFrom
312f0 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
31300 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
31310 20 69 66 28 20 72 63 3d 3d 31 20 29 20 70 57 49   if( rc==1 ) pWI
31320 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
31330 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
31340 4f 52 44 45 52 45 44 3b 0a 20 20 7d 0a 20 20 69  ORDERED;.  }.  i
31350 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65  f( pFrom->isOrde
31360 72 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70  red ){.    if( p
31370 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
31380 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
31390 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 70 57  CTBY ){.      pW
313a0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
313b0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
313c0 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 65  _ORDERED;.    }e
313d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  lse{.      pWInf
313e0 6f 2d 3e 62 4f 42 53 61 74 20 3d 20 31 3b 0a 20  o->bOBSat = 1;. 
313f0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
31400 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
31410 76 4c 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  vLoop;.    }.  }
31420 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
31430 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
31440 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d  ;..  /* Free tem
31450 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e  porary memory an
31460 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  d return success
31470 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
31480 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b  ree(db, pSpace);
31490 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
314a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  _OK;.}../*.** Mo
314b0 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f  st queries use o
314c0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
314d0 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74  le (they are not
314e0 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65   joins) and have
314f0 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f  .** simple == co
31500 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73  nstraints agains
31510 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73  t indexed fields
31520 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
31530 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70  attempts.** to p
31540 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65  lan those simple
31550 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63   cases using muc
31560 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20  h less ceremony 
31570 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65  than the.** gene
31580 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
31590 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74  y planner, and t
315a0 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73  hereby yield fas
315b0 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ter sqlite3_prep
315c0 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66  are().** times f
315d0 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
315e0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  se..**.** Return
315f0 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63   non-zero on suc
31600 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75  cess, if this qu
31610 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c  ery can be handl
31620 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f  ed by this.** no
31630 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c  -frills query pl
31640 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a  anner.  Return z
31650 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72  ero if this quer
31660 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20  y needs the .** 
31670 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
31680 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a  query planner..*
31690 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
316a0 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65  reShortCut(Where
316b0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
316c0 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49  ilder){.  WhereI
316d0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73  nfo *pWInfo;.  s
316e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
316f0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65  em *pItem;.  Whe
31700 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
31710 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
31720 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  m;.  WhereLoop *
31730 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75  pLoop;.  int iCu
31740 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61  r;.  int j;.  Ta
31750 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
31760 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20 20 70  ex *pIdx;.  .  p
31770 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
31780 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20  ->pWInfo;.  if( 
31790 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
317a0 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45  gs & WHERE_FORCE
317b0 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72 6e 20  _TABLE ) return 
317c0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  0;.  assert( pWI
317d0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
317e0 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65  Src>=1 );.  pIte
317f0 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
31800 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20  List->a;.  pTab 
31810 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
31820 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
31830 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
31840 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 49  .  if( pItem->zI
31850 6e 64 65 78 20 29 20 72 65 74 75 72 6e 20 30 3b  ndex ) return 0;
31860 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d  .  iCur = pItem-
31870 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20  >iCursor;.  pWC 
31880 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
31890 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64    pLoop = pBuild
318a0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f  er->pNew;.  pLoo
318b0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a  p->wsFlags = 0;.
318c0 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
318d0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
318e0 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a  , 0, WO_EQ, 0);.
318f0 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
31900 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
31910 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
31920 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48  _EQ|WHERE_IPK|WH
31930 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20  ERE_ONEROW;.    
31940 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
31950 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c   = pTerm;.    pL
31960 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  oop->nLTerm = 1;
31970 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  .    pLoop->u.bt
31980 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
31990 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
319a0 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b   of a rowid look
319b0 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20  up is 10 */.    
319c0 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33  pLoop->rRun = 33
319d0 3b 20 20 2f 2a 20 33 33 3d 3d 77 68 65 72 65 43  ;  /* 33==whereC
319e0 6f 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c  ost(10) */.  }el
319f0 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  se{.    for(pIdx
31a00 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
31a10 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
31a20 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
31a30 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
31a40 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69  =OE_None ) conti
31a50 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nue;.      for(j
31a60 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
31a70 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
31a80 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
31a90 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70  erm(pWC, iCur, p
31aa0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
31ab0 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78  , 0, WO_EQ, pIdx
31ac0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
31ad0 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
31ae0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
31af0 6f 70 52 65 73 69 7a 65 28 70 57 49 6e 66 6f 2d  opResize(pWInfo-
31b00 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  >pParse->db, pLo
31b10 6f 70 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20  op, j);.        
31b20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
31b30 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
31b40 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70  }.      if( j!=p
31b50 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63  Idx->nColumn ) c
31b60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
31b70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
31b80 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
31b90 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45  WHERE_ONEROW|WHE
31ba0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
31bb0 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 63 6f    if( (pItem->co
31bc0 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
31bd0 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d  InIndex(pIdx))==
31be0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  0 ){.        pLo
31bf0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
31c00 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
31c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f       }.      pLo
31c20 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a  op->nLTerm = j;.
31c30 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
31c40 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20  tree.nEq = j;.  
31c50 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
31c60 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
31c70 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
31c80 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69  G: Cost of a uni
31c90 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  que index lookup
31ca0 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20   is 15 */.      
31cb0 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39  pLoop->rRun = 39
31cc0 3b 20 20 2f 2a 20 33 39 3d 3d 77 68 65 72 65 43  ;  /* 39==whereC
31cd0 6f 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20  ost(15) */.     
31ce0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
31cf0 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
31d00 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c  sFlags ){.    pL
31d10 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 57 68 65  oop->nOut = (Whe
31d20 72 65 43 6f 73 74 29 31 3b 0a 20 20 20 20 70 57  reCost)1;.    pW
31d30 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
31d40 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70  p = pLoop;.    p
31d50 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  Loop->maskSelf =
31d60 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f   getMask(&pWInfo
31d70 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
31d80 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  );.    pWInfo->a
31d90 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43  [0].iTabCur = iC
31da0 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ur;.    pWInfo->
31db0 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20  nRowOut = 1;.   
31dc0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
31dd0 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
31de0 62 4f 42 53 61 74 20 3d 20 20 31 3b 0a 20 20 20  bOBSat =  1;.   
31df0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 44 69   if( pWInfo->pDi
31e00 73 74 69 6e 63 74 20 29 20 70 57 49 6e 66 6f 2d  stinct ) pWInfo-
31e10 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
31e20 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
31e30 55 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  UE;.#ifdef SQLIT
31e40 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f  E_DEBUG.    pLoo
31e50 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65  p->cId = '0';.#e
31e60 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
31e70 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
31e80 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
31e90 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
31ea0 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
31eb0 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
31ec0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
31ed0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
31ee0 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
31ef0 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
31f00 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
31f10 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
31f20 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
31f30 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
31f40 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
31f50 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
31f60 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
31f70 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
31f80 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
31f90 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
31fa0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
31fb0 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
31fc0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
31fd0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
31fe0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
31ff0 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
32000 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
32010 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
32020 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
32030 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
32040 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
32050 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
32060 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
32070 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
32080 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
32090 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
320a0 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
320b0 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
320c0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
320d0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
320e0 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
320f0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
32100 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
32110 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
32120 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
32130 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
32140 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
32150 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
32160 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
32170 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
32180 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
32190 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
321a0 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
321b0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
321c0 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
321d0 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
321e0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
321f0 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
32200 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
32210 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
32220 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
32230 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
32240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32250 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
32260 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
32270 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
32280 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
32290 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
322a0 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
322b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322c0 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
322d0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
322e0 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
322f0 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
32300 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
32310 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
32320 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
32330 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
32340 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
32350 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
32360 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
32370 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
32380 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
32390 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
323a0 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
323b0 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
323c0 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
323d0 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
323e0 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
323f0 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
32400 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
32410 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
32420 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
32430 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
32440 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
32450 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
32460 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
32470 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
32480 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
32490 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
324a0 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
324b0 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
324c0 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
324d0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
324e0 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
324f0 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
32500 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
32510 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
32520 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
32530 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
32540 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
32550 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
32560 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
32570 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
32580 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
32590 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
325a0 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
325b0 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
325c0 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
325d0 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
325e0 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
325f0 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
32600 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
32610 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
32620 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
32630 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
32640 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
32650 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
32660 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
32670 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
32680 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
32690 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
326a0 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
326b0 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
326c0 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
326d0 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
326e0 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
326f0 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
32700 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
32710 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
32720 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
32730 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
32740 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
32750 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
32760 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
32770 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
32780 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
32790 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
327a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
327b0 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
327c0 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
327d0 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
327e0 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
327f0 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
32800 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
32810 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
32820 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
32830 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
32840 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
32850 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
32860 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
32870 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
32880 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
32890 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
328a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
328b0 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
328c0 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
328d0 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
328e0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
328f0 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
32900 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
32910 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
32920 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
32930 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
32940 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
32950 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
32960 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
32970 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
32980 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
32990 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
329a0 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
329b0 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
329c0 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
329d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
329e0 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
329f0 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
32a00 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
32a10 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
32a20 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
32a30 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
32a40 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
32a50 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
32a60 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
32a70 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
32a80 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
32a90 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
32aa0 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
32ab0 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
32ac0 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
32ad0 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
32ae0 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
32af0 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  NG.**.** pOrderB
32b00 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
32b10 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
32b20 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
32b30 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
32b40 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
32b50 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
32b60 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
32b70 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
32b80 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
32b90 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
32ba0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
32bb0 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72  ent, then pOrder
32bc0 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 57  By is NULL..*/.W
32bd0 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
32be0 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
32bf0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
32c00 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
32c10 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
32c20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
32c30 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  t,    /* A list 
32c40 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  of all tables to
32c50 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
32c60 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
32c70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
32c80 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
32c90 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
32ca0 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45  By,   /* An ORDE
32cb0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20  R BY clause, or 
32cc0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
32cd0 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 20  st *pDistinct,  
32ce0 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 2d 6c 69  /* The select-li
32cf0 73 74 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  st for DISTINCT 
32d00 71 75 65 72 69 65 73 20 2d 20 6f 72 20 4e 55 4c  queries - or NUL
32d10 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  L */.  u16 wctrl
32d20 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
32d30 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
32d40 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64  _* flags defined
32d50 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
32d60 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72  */.  int iIdxCur
32d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
32d80 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
32d90 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e 64  ONLY is set, ind
32da0 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ex cursor number
32db0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
32dc0 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  teWInfo;        
32dd0 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65      /* Num. byte
32de0 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
32df0 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
32e00 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69   */.  int nTabLi
32e10 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
32e20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
32e30 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69  ements in pTabLi
32e40 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  st */.  WhereInf
32e50 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
32e60 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d     /* Will becom
32e70 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
32e80 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
32e90 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
32ea0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
32eb0 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75  ;   /* The virtu
32ec0 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  al database engi
32ed0 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ne */.  Bitmask 
32ee0 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
32ef0 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68     /* Cursors th
32f00 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70  at are not yet p
32f10 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57  ositioned */.  W
32f20 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
32f30 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65  sWLB;     /* The
32f40 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64   WhereLoop build
32f50 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  er */.  WhereMas
32f60 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
32f70 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
32f80 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f  sion mask set */
32f90 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
32fa0 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a  Level;        /*
32fb0 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
32fc0 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a  in pWInfo->a[] *
32fd0 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
32fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32ff0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
33000 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
33010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33020 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
33030 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
33040 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
33050 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
33060 63 6f 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56  code */...  /* V
33070 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69  ariable initiali
33080 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 6d 65 6d 73  zation */.  mems
33090 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a  et(&sWLB, 0, siz
330a0 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20 73 57  eof(sWLB));.  sW
330b0 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  LB.pOrderBy = pO
330c0 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 68  rderBy;..  /* Th
330d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  e number of tabl
330e0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
330f0 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
33100 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
33110 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61  f.  ** bits in a
33120 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20   Bitmask .  */. 
33130 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c   testcase( pTabL
33140 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29  ist->nSrc==BMS )
33150 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  ;.  if( pTabList
33160 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
33170 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
33180 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
33190 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
331a0 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
331b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
331c0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
331d0 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65  tion normally ge
331e0 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64  nerates a nested
331f0 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61   loop for all ta
33200 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54  bles in .  ** pT
33210 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20  abList.  But if 
33220 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  the WHERE_ONETAB
33230 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
33240 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f  set, then we sho
33250 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65  uld.  ** only ge
33260 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
33270 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
33280 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  in pTabList and 
33290 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a  assume that.  **
332a0 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73   any cursors ass
332b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62  ociated with sub
332c0 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61  sequent tables a
332d0 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  re uninitialized
332e0 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73  ..  */.  nTabLis
332f0 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20  t = (wctrlFlags 
33300 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
33310 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61  _ONLY) ? 1 : pTa
33320 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20  bList->nSrc;..  
33330 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
33340 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
33350 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
33360 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
33370 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
33380 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e  urn value. A sin
33390 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  gle allocation i
333a0 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
333b0 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20  the WhereInfo.  
333c0 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63  ** struct, the c
333d0 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65  ontents of Where
333e0 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68  Info.a[], the Wh
333f0 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
33400 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ure.  ** and the
33410 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
33420 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57  ructure. Since W
33430 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61  hereClause conta
33440 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20  ins an 8-byte.  
33450 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42  ** field (type B
33460 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20  itmask) it must 
33470 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e  be aligned on an
33480 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
33490 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72   on.  ** some ar
334a0 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e  chitectures. Hen
334b0 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20  ce the ROUND8() 
334c0 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 64 62  below..  */.  db
334d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
334e0 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f   nByteWInfo = RO
334f0 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72  UND8(sizeof(Wher
33500 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74  eInfo)+(nTabList
33510 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65  -1)*sizeof(Where
33520 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66  Level));.  pWInf
33530 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
33540 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
33550 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28  eWInfo + sizeof(
33560 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69  WhereLoop));.  i
33570 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
33580 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
33590 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
335a0 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  nfo);.    pWInfo
335b0 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77   = 0;.    goto w
335c0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
335d0 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c    }.  pWInfo->nL
335e0 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b  evel = nTabList;
335f0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  .  pWInfo->pPars
33600 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
33610 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d  Info->pTabList =
33620 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   pTabList;.  pWI
33630 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  nfo->pOrderBy = 
33640 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e  pOrderBy;.  pWIn
33650 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74 20 3d 20  fo->pDistinct = 
33660 70 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 57 49  pDistinct;.  pWI
33670 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71  nfo->iBreak = sq
33680 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
33690 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d  el(v);.  pWInfo-
336a0 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63  >wctrlFlags = wc
336b0 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e  trlFlags;.  pWIn
336c0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
336d0 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
336e0 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73  ueryLoop;.  pMas
336f0 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  kSet = &pWInfo->
33700 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42  sMaskSet;.  sWLB
33710 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  .pWInfo = pWInfo
33720 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20 26  ;.  sWLB.pWC = &
33730 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73  pWInfo->sWC;.  s
33740 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65 72  WLB.pNew = (Wher
33750 65 4c 6f 6f 70 2a 29 26 70 57 49 6e 66 6f 2d 3e  eLoop*)&pWInfo->
33760 61 5b 6e 54 61 62 4c 69 73 74 5d 3b 0a 20 20 77  a[nTabList];.  w
33770 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c  hereLoopInit(sWL
33780 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20  B.pNew);.#ifdef 
33790 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
337a0 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20  WLB.pNew->cId = 
337b0 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  '*';.#endif..  /
337c0 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
337d0 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
337e0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
337f0 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
33800 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
33810 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
33820 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
33830 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
33840 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
33850 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
33860 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
33870 4f 70 74 29 20 29 20 70 44 69 73 74 69 6e 63 74  Opt) ) pDistinct
33880 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69   = 0;..  /* Spli
33890 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
338a0 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
338b0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
338c0 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
338d0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
338e0 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
338f0 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
33900 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
33910 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77  t(pMaskSet);.  w
33920 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
33930 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49  pWInfo->sWC, pWI
33940 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  nfo);.  sqlite3E
33950 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73  xprCodeConstants
33960 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 29  (pParse, pWhere)
33970 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26  ;.  whereSplit(&
33980 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68  pWInfo->sWC, pWh
33990 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20  ere, TK_AND);   
339a0 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d  /* IMP: R-15842-
339b0 35 33 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20  53296 */.    .  
339c0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
339d0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
339e0 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  that is constant
339f0 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a  .  Evaluate the.
33a00 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
33a10 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20  and either jump 
33a20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
33a30 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  code or fall thr
33a40 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  u..  */.  if( pW
33a50 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73  here && (nTabLis
33a60 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  t==0 || sqlite3E
33a70 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
33a80 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b  Join(pWhere)) ){
33a90 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
33aa0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
33ab0 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e  pWhere, pWInfo->
33ac0 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a  iBreak, SQLITE_J
33ad0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
33ae0 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
33af0 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
33b00 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75  se: No FROM clau
33b10 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54  se.  */.  if( nT
33b20 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  abList==0 ){.   
33b30 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
33b40 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d  pWInfo->bOBSat =
33b50 20 31 3b 0a 20 20 20 20 69 66 28 20 70 44 69 73   1;.    if( pDis
33b60 74 69 6e 63 74 20 29 20 70 57 49 6e 66 6f 2d 3e  tinct ) pWInfo->
33b70 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
33b80 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
33b90 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73  E;.  }..  /* Ass
33ba0 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
33bb0 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
33bc0 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
33bd0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
33be0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69  *.  ** When assi
33bf0 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61  gning bitmask va
33c00 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61  lues to FROM cla
33c10 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  use cursors, it 
33c20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65  must be.  ** the
33c30 20 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20   case that if X 
33c40 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
33c50 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d  or the N-th FROM
33c60 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65   clause term the
33c70 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61  n.  ** the bitma
33c80 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20  sk for all FROM 
33c90 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20  clause terms to 
33ca0 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
33cb0 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69  N-th term.  ** i
33cc0 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78  s (X-1).   An ex
33cd0 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
33ce0 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
33cf0 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75   LEFT JOIN can u
33d00 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72  se.  ** its Expr
33d10 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
33d20 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74   value to find t
33d30 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68  he bitmask of th
33d40 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20  e right table.  
33d50 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
33d60 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65   Subtracting one
33d70 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20   from the right 
33d80 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69  table bitmask gi
33d90 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61  ves a.  ** bitma
33da0 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  sk for all table
33db0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
33dc0 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77   the join.  Know
33dd0 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a  ing the bitmask.
33de0 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62    ** for all tab
33df0 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
33e00 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
33e10 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  s important.  Ti
33e20 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a  cket #3015..  **
33e30 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
33e40 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65  bitmasks are cre
33e50 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61  ated for all pTa
33e60 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c  bList->nSrc tabl
33e70 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c  es in.  ** pTabL
33e80 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ist, not just th
33e90 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74  e first nTabList
33ea0 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69   tables.  nTabLi
33eb0 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20  st is normally. 
33ec0 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61   ** equal to pTa
33ed0 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20  bList->nSrc but 
33ee0 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e  might be shorten
33ef0 65 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20  ed to 1 if the. 
33f00 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42   ** WHERE_ONETAB
33f10 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20  LE_ONLY flag is 
33f20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  set..  */.  for(
33f30 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
33f40 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
33f50 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
33f60 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
33f70 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
33f80 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  );.  }.#ifndef N
33f90 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69  DEBUG.  {.    Bi
33fa0 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20  tmask toTheLeft 
33fb0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
33fc0 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
33fd0 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
33fe0 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67     Bitmask m = g
33ff0 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
34000 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
34010 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
34020 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d   assert( (m-1)==
34030 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20  toTheLeft );.   
34040 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20     toTheLeft |= 
34050 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  m;.    }.  }.#en
34060 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
34070 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
34080 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f  expressions.  No
34090 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c  te that exprAnal
340a0 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a  yze() might.  **
340b0 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c   add new virtual
340c0 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
340d0 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
340e0 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20   clause.  We do 
340f0 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f  not.  ** want to
34100 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76   analyze these v
34110 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f  irtual terms, so
34120 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67   start analyzing
34130 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a   at the end.  **
34140 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72   and work forwar
34150 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64  d so that the ad
34160 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ded virtual term
34170 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63  s are never proc
34180 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78  essed..  */.  ex
34190 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61  prAnalyzeAll(pTa
341a0 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
341b0 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  sWC);.  if( db->
341c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
341d0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
341e0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  ginError;.  }.. 
341f0 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
34200 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
34210 29 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  ) clause contain
34220 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  s references to 
34230 67 65 6e 65 72 61 6c 0a 20 20 2a 2a 20 65 78 70  general.  ** exp
34240 72 65 73 73 69 6f 6e 73 2c 20 74 68 65 6e 20 77  ressions, then w
34250 65 20 77 6f 6e 27 74 20 62 65 20 61 62 6c 65 20  e won't be able 
34260 74 6f 20 73 61 74 69 73 66 79 20 69 74 20 75 73  to satisfy it us
34270 69 6e 67 20 69 6e 64 69 63 65 73 2c 20 73 6f 0a  ing indices, so.
34280 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e    ** go ahead an
34290 64 20 64 69 73 61 62 6c 65 20 69 74 20 6e 6f 77  d disable it now
342a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
342b0 64 65 72 42 79 20 26 26 20 70 44 69 73 74 69 6e  derBy && pDistin
342c0 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69  ct ){.    for(ii
342d0 3d 30 3b 20 69 69 3c 70 4f 72 64 65 72 42 79 2d  =0; ii<pOrderBy-
342e0 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
342f0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
34300 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
34310 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
34320 42 79 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  By->a[ii].pExpr)
34330 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
34340 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
34350 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
34360 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
34370 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
34380 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
34390 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70    }else if( pExp
343a0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
343b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
343c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
343d0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
343e0 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
343f0 6c 69 66 69 65 72 2c 20 69 66 20 74 68 65 72 65  lifier, if there
34400 20 69 73 20 6f 6e 65 2c 20 69 73 20 72 65 64 75   is one, is redu
34410 6e 64 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20  ndant. .  ** If 
34420 69 74 20 69 73 2c 20 74 68 65 6e 20 73 65 74 20  it is, then set 
34430 70 44 69 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c  pDistinct to NUL
34440 4c 20 61 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e  L and WhereInfo.
34450 65 44 69 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a  eDistinct to.  *
34460 2a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  * WHERE_DISTINCT
34470 5f 55 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c 20  _UNIQUE to tell 
34480 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 67  the caller to ig
34490 6e 6f 72 65 20 74 68 65 20 44 49 53 54 49 4e 43  nore the DISTINC
344a0 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  T..  */.  if( pD
344b0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 69  istinct ){.    i
344c0 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  f( isDistinctRed
344d0 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 70 54  undant(pParse,pT
344e0 61 62 4c 69 73 74 2c 26 70 57 49 6e 66 6f 2d 3e  abList,&pWInfo->
344f0 73 57 43 2c 70 44 69 73 74 69 6e 63 74 29 20 29  sWC,pDistinct) )
34500 7b 0a 20 20 20 20 20 20 70 44 69 73 74 69 6e 63  {.      pDistinc
34510 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 57 49  t = 0;.      pWI
34520 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
34530 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
34540 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73  UNIQUE;.    }els
34550 65 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d  e if( pOrderBy==
34560 30 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  0 ){.      pWInf
34570 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d  o->wctrlFlags |=
34580 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
34590 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  Y;.      pWInfo-
345a0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 44 69 73  >pOrderBy = pDis
345b0 74 69 6e 63 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  tinct;.    }.  }
345c0 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74  ..  /* Construct
345d0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
345e0 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45 52  bjects */.  WHER
345f0 45 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22  ETRACE(0xffff,("
34600 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
34610 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
34620 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20  if( nTabList!=1 
34630 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74  || whereShortCut
34640 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20  (&sWLB)==0 ){.  
34650 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
34660 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20  AddAll(&sWLB);. 
34670 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
34680 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
34690 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70  ;.  .    /* Disp
346a0 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57  lay all of the W
346b0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
346c0 20 69 66 20 77 68 65 72 65 74 72 61 63 65 20 69   if wheretrace i
346d0 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66  s enabled */.#if
346e0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
346f0 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
34700 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
34710 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
34720 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e  oop *p;.      in
34730 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  t i = 0;.      s
34740 74 61 74 69 63 20 63 68 61 72 20 7a 4c 61 62 65  tatic char zLabe
34750 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  l[] = "012345678
34760 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  9abcdefghijklmno
34770 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20  pqrstuvwyxz".   
34780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347a0 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
347b0 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22  LMNOPQRSTUVWYXZ"
347c0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57  ;.      for(p=pW
347d0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 3b  Info->pLoops; p;
347e0 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29   p=p->pNextLoop)
347f0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64  {.        p->cId
34800 20 3d 20 7a 4c 61 62 65 6c 5b 28 69 2b 2b 29 25   = zLabel[(i++)%
34810 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b  sizeof(zLabel)];
34820 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
34830 6f 70 50 72 69 6e 74 28 70 2c 20 70 54 61 62 4c  opPrint(p, pTabL
34840 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
34850 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
34860 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65    wherePathSolve
34870 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20  r(pWInfo, 0);.  
34880 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
34890 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
348a0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
348b0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70     if( pWInfo->p
348c0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
348d0 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65    wherePathSolve
348e0 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  r(pWInfo, pWInfo
348f0 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20  ->nRowOut);.    
34900 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
34910 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
34920 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
34930 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
34940 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
34950 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67  ==0 && (db->flag
34960 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72  s & SQLITE_Rever
34970 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20  seOrder)!=0 ){. 
34980 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
34990 61 73 6b 20 3d 20 28 42 69 74 6d 61 73 6b 29 28  ask = (Bitmask)(
349a0 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  -1);.  }.  if( p
349b0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
349c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
349d0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
349e0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
349f0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
34a00 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
34a10 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
34a20 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69  ce ){.    int ii
34a30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
34a40 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53  ugPrintf("---- S
34a50 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22  olution nRow=%d"
34a60 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
34a70 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  t);.    if( pWIn
34a80 66 6f 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20 20  fo->bOBSat ){.  
34a90 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
34aa0 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59  Printf(" ORDERBY
34ab0 3d 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f  =0x%llx", pWInfo
34ac0 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20  ->revMask);.    
34ad0 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 57  }.    switch( pW
34ae0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
34af0 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  ){.      case WH
34b00 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
34b10 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
34b20 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
34b30 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
34b40 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20  ique");.        
34b50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
34b60 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
34b70 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
34b80 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
34b90 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
34ba0 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72    DISTINCT=order
34bb0 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed");.        br
34bc0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
34bd0 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
34be0 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
34bf0 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
34c00 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
34c10 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64    DISTINCT=unord
34c20 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  ered");.        
34c30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
34c40 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
34c50 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
34c60 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  );.    for(ii=0;
34c70 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69   ii<nTabList; ii
34c80 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
34c90 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f  LoopPrint(pWInfo
34ca0 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20  ->a[ii].pWLoop, 
34cb0 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d  pTabList);.    }
34cc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 57 48  .  }.#endif.  WH
34cd0 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
34ce0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
34cf0 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
34d00 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  );.  pWInfo->pPa
34d10 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
34d20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  += pWInfo->nRowO
34d30 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ut;..  /* If the
34d40 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50   caller is an UP
34d50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
34d60 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
34d70 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a   requesting.  **
34d80 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61   to use a one-pa
34d90 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65  ss algorithm, de
34da0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20  termine if this 
34db0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  is appropriate..
34dc0 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73    ** The one-pas
34dd0 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79  s algorithm only
34de0 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48   works if the WH
34df0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
34e00 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20  raints.  ** the 
34e10 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64  statement to upd
34e20 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ate a single row
34e30 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
34e40 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
34e50 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
34e60 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
34e70 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
34e80 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
34e90 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
34ea0 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a  SS_DESIRED)!=0 .
34eb0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 61     && (pWInfo->a
34ec0 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  [0].pWLoop->wsFl
34ed0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52  ags & WHERE_ONER
34ee0 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57  OW)!=0 ){.    pW
34ef0 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
34f00 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  = 1;.    pWInfo-
34f10 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73  >a[0].pWLoop->ws
34f20 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
34f30 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20  IDX_ONLY;.  }.. 
34f40 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62   /* Open all tab
34f50 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c  les in the pTabL
34f60 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69  ist and any indi
34f70 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72  ces selected for
34f80 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20  .  ** searching 
34f90 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
34fa0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  */.  sqlite3Code
34fb0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
34fc0 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73  rse, -1); /* Ins
34fd0 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ert the cookie v
34fe0 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a  erifier Goto */.
34ff0 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
35000 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 57 49 6e  itmask)0;.  pWIn
35010 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 28 57  fo->nRowOut = (W
35020 68 65 72 65 43 6f 73 74 29 31 3b 0a 20 20 66 6f  hereCost)1;.  fo
35030 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  r(ii=0, pLevel=p
35040 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61  WInfo->a; ii<nTa
35050 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65  bList; ii++, pLe
35060 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
35070 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
35080 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
35090 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
350a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
350b0 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
350c0 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
350d0 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  x */.    struct 
350e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
350f0 61 62 49 74 65 6d 3b 0a 20 20 20 20 57 68 65 72  abItem;.    Wher
35100 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 0a 20  eLoop *pLoop;.. 
35110 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
35120 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
35130 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
35140 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
35150 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20  pTab;.    iDb = 
35160 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
35170 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
35180 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f  Schema);.    pLo
35190 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
351a0 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54  oop;.    if( (pT
351b0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
351c0 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
351d0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
351e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20   ){.      /* Do 
351f0 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  nothing */.    }
35200 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
35210 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
35220 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
35230 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
35240 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
35250 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
35260 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61  const char *pVTa
35270 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  b = (const char 
35280 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
35290 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
352a0 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
352b0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
352c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
352d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
352e0 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20  VOpen, iCur, 0, 
352f0 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41  0, pVTab, P4_VTA
35300 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  B);.    }else if
35310 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
35320 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  ) ){.      /* no
35330 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  op */.    }else.
35340 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
35350 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
35360 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
35370 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
35380 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
35390 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
353a0 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  OSE)==0 ){.     
353b0 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f   int op = pWInfo
353c0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50  ->okOnePass ? OP
353d0 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f  _OpenWrite : OP_
353e0 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
353f0 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
35400 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
35410 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c  m->iCursor, iDb,
35420 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20   pTab, op);.    
35430 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
35440 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
35450 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
35460 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
35470 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
35480 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
35490 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42   && pTab->nCol<B
354a0 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69  MS ){.        Bi
354b0 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74  tmask b = pTabIt
354c0 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  em->colUsed;.   
354d0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
354e0 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b          for(; b;
354f0 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a   b=b>>1, n++){}.
35500 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
35510 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73  dbeChangeP4(v, s
35520 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
35530 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20  tAddr(v)-1, .   
35540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35550 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
35560 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50  INT_TO_PTR(n), P
35570 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
35580 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
35590 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
355a0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
355b0 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
355c0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
355d0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
355e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
355f0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
35600 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
35610 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28  IC_INDEX.    if(
35620 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
35630 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
35640 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
35650 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
35660 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
35670 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70   &pWInfo->sWC, p
35680 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64  TabItem, notRead
35690 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  y, pLevel);.    
356a0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
356b0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
356c0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
356d0 58 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  XED ){.      Ind
356e0 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d  ex *pIx = pLoop-
356f0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
35700 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
35710 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
35720 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
35730 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 2f  e, pIx);.      /
35740 2a 20 46 49 58 4d 45 3a 20 20 41 73 20 61 6e 20  * FIXME:  As an 
35750 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 65  optimization use
35760 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
35770 6f 72 20 69 66 20 57 48 45 52 45 5f 49 44 58 5f  or if WHERE_IDX_
35780 4f 4e 4c 59 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ONLY */.      in
35790 74 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c  t iIndexCur = pL
357a0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
357b0 69 49 64 78 43 75 72 20 3f 20 69 49 64 78 43 75  iIdxCur ? iIdxCu
357c0 72 20 3a 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r : pParse->nTab
357d0 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
357e0 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
357f0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
35800 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
35810 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20  IndexCur>=0 );. 
35820 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35830 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
35840 6e 52 65 61 64 2c 20 69 49 6e 64 65 78 43 75 72  nRead, iIndexCur
35850 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  , pIx->tnum, iDb
35860 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35870 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
35880 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
35890 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
358a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
358b0 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61  , "%s", pIx->zNa
358c0 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  me));.    }.    
358d0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
358e0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
358f0 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  iDb);.    notRea
35900 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26  dy &= ~getMask(&
35910 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
35920 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
35930 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  sor);.  }.  pWIn
35940 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
35950 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
35960 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
35970 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
35980 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
35990 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
359a0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
359b0 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
359c0 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
359d0 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
359e0 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
359f0 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
35a00 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
35a10 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
35a20 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
35a30 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
35a40 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
35a50 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
35a60 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65  ; ii++){.    pLe
35a70 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
35a80 5b 69 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69  [ii];.    explai
35a90 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c  nOneScan(pParse,
35aa0 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
35ab0 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  l, ii, pLevel->i
35ac0 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73  From, wctrlFlags
35ad0 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
35ae0 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  = codeOneLoopSta
35af0 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e  rt(pWInfo, ii, n
35b00 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
35b10 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
35b20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
35b30 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  nt;.  }..  /* Do
35b40 6e 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ne. */.  return 
35b50 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
35b60 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
35b70 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
35b80 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
35b90 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
35ba0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
35bb0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
35bc0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
35bd0 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
35be0 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
35bf0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
35c00 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
35c10 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
35c20 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
35c30 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
35c40 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
35c50 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
35c60 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
35c70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
35c80 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
35c90 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
35ca0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
35cb0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
35cc0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
35cd0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
35ce0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
35cf0 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f  Level;.  WhereLo
35d00 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63  op *pLoop;.  Src
35d10 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
35d20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
35d30 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
35d40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
35d50 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
35d60 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
35d70 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ode..  */.  sqli
35d80 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
35d90 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
35da0 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  (i=pWInfo->nLeve
35db0 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
35dc0 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
35dd0 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
35de0 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
35df0 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c  >pWLoop;.    sql
35e00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
35e10 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
35e20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69  addrCont);.    i
35e30 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f  f( pLevel->op!=O
35e40 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
35e50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35e60 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  2(v, pLevel->op,
35e70 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
35e80 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20  vel->p2);.      
35e90 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
35ea0 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
35eb0 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  5);.    }.    if
35ec0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
35ed0 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
35ee0 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   && pLevel->u.in
35ef0 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  .nIn>0 ){.      
35f00 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
35f10 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  In;.      int j;
35f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
35f30 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
35f40 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  , pLevel->addrNx
35f50 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
35f60 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
35f70 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75  , pIn=&pLevel->u
35f80 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d  .in.aInLoop[j-1]
35f90 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d  ; j>0; j--, pIn-
35fa0 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -){.        sqli
35fb0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
35fc0 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
35fd0 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  p+1);.        sq
35fe0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
35ff0 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
36000 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  Op, pIn->iCur, p
36010 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
36020 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
36030 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
36040 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
36050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36060 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
36070 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
36080 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
36090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
360a0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
360b0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
360c0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
360d0 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
360e0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
360f0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
36100 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
36110 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d  P_IfPos, pLevel-
36120 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
36130 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
36140 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
36150 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
36160 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
36170 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
36180 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
36190 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
361a0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
361b0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
361c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
361d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
361e0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
361f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
36200 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
36210 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
36220 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
36230 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
36240 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36250 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
36260 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
36270 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
36280 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
36290 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20  ->op==OP_Return 
362a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
362b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
362c0 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c  OP_Gosub, pLevel
362d0 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  ->p1, pLevel->ad
362e0 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
362f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
36300 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
36310 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
36320 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
36330 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
36340 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
36350 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
36360 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
36370 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e  The "break" poin
36380 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20  t is here, just 
36390 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
363a0 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
363b0 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a    ** Set it..  *
363c0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
363d0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
363e0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
363f0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
36400 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
36410 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20  hat were opened 
36420 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
36430 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  egin..  */.  ass
36440 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ert( pWInfo->nLe
36450 76 65 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f  vel==1 || pWInfo
36460 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69  ->nLevel==pTabLi
36470 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f  st->nSrc );.  fo
36480 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
36490 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66  Info->a; i<pWInf
364a0 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20  o->nLevel; i++, 
364b0 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49  pLevel++){.    I
364c0 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a  ndex *pIdx = 0;.
364d0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
364e0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
364f0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
36500 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
36510 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
36520 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
36530 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
36540 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c  Tab!=0 );.    pL
36550 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
36560 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70  Loop;.    if( (p
36570 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
36580 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
36590 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70  .     && pTab->p
365a0 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26  Select==0.     &
365b0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
365c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
365d0 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
365e0 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
365f0 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  nt ws = pLoop->w
36600 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66  sFlags;.      if
36610 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
36620 50 61 73 73 20 26 26 20 28 77 73 20 26 20 57 48  Pass && (ws & WH
36630 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
36640 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
36650 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
36660 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49   OP_Close, pTabI
36670 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
36680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
36690 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44   (ws & WHERE_IND
366a0 45 58 45 44 29 21 3d 30 20 26 26 20 28 77 73 20  EXED)!=0 && (ws 
366b0 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  & (WHERE_IPK|WHE
366c0 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 29 3d  RE_TEMP_INDEX))=
366d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
366e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
366f0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65  v, OP_Close, pLe
36700 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
36710 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
36720 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61    /* If this sca
36730 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c  n uses an index,
36740 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65 20   make VDBE code 
36750 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f  substitutions to
36760 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a   read data.    *
36770 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  * from the index
36780 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f 6d   instead of from
36790 20 74 68 65 20 74 61 62 6c 65 20 77 68 65 72 65   the table where
367a0 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20 73   possible.  In s
367b0 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a 2a  ome cases.    **
367c0 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
367d0 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  on prevents the 
367e0 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72 20  table from ever 
367f0 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69 63  being read, whic
36800 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65  h can.    ** yie
36810 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74  ld a significant
36820 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
36830 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  st..    ** .    
36840 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20  ** Calls to the 
36850 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
36860 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65  n between sqlite
36870 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a  3WhereBegin and.
36880 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68      ** sqlite3Wh
36890 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65  ereEnd will have
368a0 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68   created code th
368b0 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  at references th
368c0 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64  e table.    ** d
368d0 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c  irectly.  This l
368e0 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68  oop scans all th
368f0 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20  at code looking 
36900 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20  for opcodes.    
36910 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ** that referenc
36920 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  e the table and 
36930 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e  converts them in
36940 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a  to opcodes that.
36950 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
36960 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
36970 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  */.    if( pLoop
36980 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
36990 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45  RE_INDEXED|WHERE
369a0 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20  _IDX_ONLY) ){.  
369b0 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70      pIdx = pLoop
369c0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
369d0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
369e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
369f0 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
36a00 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  ){.      pIdx = 
36a10 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
36a20 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
36a30 20 70 49 64 78 20 26 26 20 21 64 62 2d 3e 6d 61   pIdx && !db->ma
36a40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
36a50 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61      int k, j, la
36a60 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  st;.      VdbeOp
36a70 20 2a 70 4f 70 3b 0a 0a 20 20 20 20 20 20 70 4f   *pOp;..      pO
36a80 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
36a90 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  etOp(v, pWInfo->
36aa0 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73  iTop);.      las
36ab0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
36ac0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
36ad0 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66       for(k=pWInf
36ae0 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b  o->iTop; k<last;
36af0 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   k++, pOp++){.  
36b00 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
36b10 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  1!=pLevel->iTabC
36b20 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
36b30 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
36b40 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
36b50 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  n ){.          f
36b60 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
36b70 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
36b80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
36b90 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69  Op->p2==pIdx->ai
36ba0 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20  Column[j] ){.   
36bb0 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
36bc0 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  p2 = j;.        
36bd0 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
36be0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
36bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
36c00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
36c10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
36c20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
36c30 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
36c40 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
36c50 4c 59 29 3d 3d 30 20 7c 7c 20 6a 3c 70 49 64 78  LY)==0 || j<pIdx
36c60 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ->nColumn );.   
36c70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
36c80 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
36c90 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
36ca0 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
36cb0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
36cc0 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
36cd0 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
36ce0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36cf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
36d00 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75   /* Final cleanu
36d10 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  p.  */.  pParse-
36d20 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
36d30 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
36d40 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e  yLoop;.  whereIn
36d50 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
36d60 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  o);.  return;.}.