/ Hex Artifact Content
Login

Artifact de92174234ff56240df2b10bebe45466676ce7c3:


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 2a 0a 2a 2a 20 24 49 64  izer"..**.** $Id
0330: 3a 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 33 37  : where.c,v 1.37
0340: 30 20 32 30 30 39 2f 30 32 2f 32 30 20 31 30 3a  0 2009/02/20 10:
0350: 35 38 3a 34 32 20 64 61 6e 69 65 6c 6b 31 39 37  58:42 danielk197
0360: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  7 Exp $.*/.#incl
0370: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0380: 22 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  "../*.** Trace o
0390: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
03a0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
03b0: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
03c0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
03d0: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  ).int sqlite3Whe
03e0: 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  reTrace = 0;.#en
03f0: 64 69 66 0a 23 69 66 20 30 0a 23 20 64 65 66 69  dif.#if 0.# defi
0400: 6e 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29  ne WHERETRACE(X)
0410: 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65 72    if(sqlite3Wher
0420: 65 54 72 61 63 65 29 20 73 71 6c 69 74 65 33 44  eTrace) sqlite3D
0430: 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c  ebugPrintf X.#el
0440: 73 65 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52  se.# define WHER
0450: 45 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66  ETRACE(X).#endif
0460: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
0470: 65 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65  erence.*/.typede
0480: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c  f struct WhereCl
0490: 61 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65  ause WhereClause
04a0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
04b0: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 57 68   WhereMaskSet Wh
04c0: 65 72 65 4d 61 73 6b 53 65 74 3b 0a 74 79 70 65  ereMaskSet;.type
04d0: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
04e0: 4f 72 49 6e 66 6f 20 57 68 65 72 65 4f 72 49 6e  OrInfo WhereOrIn
04f0: 66 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  fo;.typedef stru
0500: 63 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20  ct WhereAndInfo 
0510: 57 68 65 72 65 41 6e 64 49 6e 66 6f 3b 0a 74 79  WhereAndInfo;.ty
0520: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
0530: 72 65 43 6f 73 74 20 57 68 65 72 65 43 6f 73 74  reCost WhereCost
0540: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65  ;../*.** The que
0550: 72 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65  ry generator use
0560: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
0570: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20  stances of this 
0580: 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20  structure to.** 
0590: 68 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20  help it analyze 
05a0: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
05b0: 6e 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ns of the WHERE 
05c0: 63 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48  clause.  Each WH
05d0: 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75  ERE.** clause su
05e0: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
05f0: 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68  eparated from th
0600: 65 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44 20  e others by AND 
0610: 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 20 28 4e  operators..** (N
0620: 6f 74 65 3a 20 74 68 65 20 73 61 6d 65 20 64 61  ote: the same da
0630: 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ta structure is 
0640: 61 6c 73 6f 20 72 65 75 73 65 64 20 74 6f 20 68  also reused to h
0650: 6f 6c 64 20 61 20 67 72 6f 75 70 20 6f 66 20 74  old a group of t
0660: 65 72 6d 73 0a 2a 2a 20 73 65 70 61 72 61 74 65  erms.** separate
0670: 64 20 62 79 20 4f 52 20 6f 70 65 72 61 74 6f 72  d by OR operator
0680: 73 2e 20 20 42 75 74 20 61 74 20 74 68 65 20 74  s.  But at the t
0690: 6f 70 2d 6c 65 76 65 6c 2c 20 65 76 65 72 79 74  op-level, everyt
06a0: 68 69 6e 67 20 69 73 20 41 4e 44 0a 2a 2a 20 73  hing is AND.** s
06b0: 65 70 61 72 61 74 65 64 2e 29 0a 2a 2a 0a 2a 2a  eparated.).**.**
06c0: 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d 73 20   All WhereTerms 
06d0: 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e  are collected in
06e0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  to a single Wher
06f0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
0700: 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  e.  .** The foll
0710: 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79 20 68  owing identity h
0720: 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  olds:.**.**     
0730: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70 57 43     WhereTerm.pWC
0740: 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e 69 64  ->a[WhereTerm.id
0750: 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72 6d 0a  x] == WhereTerm.
0760: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65 72  **.** When a ter
0770: 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  m is of the form
0780: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
0790: 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78 70       X <op> <exp
07a0: 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 58  r>.**.** where X
07b0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d   is a column nam
07c0: 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  e and <op> is on
07d0: 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f 70 65  e of certain ope
07e0: 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e 20  rators,.** then 
07f0: 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43 75  WhereTerm.leftCu
0800: 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65 54 65  rsor and WhereTe
0810: 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  rm.u.leftColumn 
0820: 72 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20 63 75  record the.** cu
0830: 72 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e 64 20  rsor number and 
0840: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 66 6f  column number fo
0850: 72 20 58 2e 20 20 57 68 65 72 65 54 65 72 6d 2e  r X.  WhereTerm.
0860: 65 4f 70 65 72 61 74 6f 72 20 72 65 63 6f 72 64  eOperator record
0870: 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e 20 75 73  s.** the <op> us
0880: 69 6e 67 20 61 20 62 69 74 6d 61 73 6b 20 65 6e  ing a bitmask en
0890: 63 6f 64 69 6e 67 20 64 65 66 69 6e 65 64 20 62  coding defined b
08a0: 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f 77 2e 20  y WO_xxx below. 
08b0: 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f 66 20 61   The.** use of a
08c0: 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e   bitmask encodin
08d0: 67 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  g for the operat
08e0: 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20  or allows us to 
08f0: 73 65 61 72 63 68 0a 2a 2a 20 71 75 69 63 6b 6c  search.** quickl
0900: 79 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74  y for terms that
0910: 20 6d 61 74 63 68 20 61 6e 79 20 6f 66 20 73 65   match any of se
0920: 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20  veral different 
0930: 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a  operators..**.**
0940: 20 41 20 57 68 65 72 65 54 65 72 6d 20 6d 69 67   A WhereTerm mig
0950: 68 74 20 61 6c 73 6f 20 62 65 20 74 77 6f 20 6f  ht also be two o
0960: 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20  r more subterms 
0970: 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 3a  connected by OR:
0980: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 28  .**.**         (
0990: 74 31 2e 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  t1.X <op> <expr>
09a0: 29 20 4f 52 20 28 74 31 2e 59 20 3c 6f 70 3e 20  ) OR (t1.Y <op> 
09b0: 3c 65 78 70 72 3e 29 20 4f 52 20 2e 2e 2e 2e 0a  <expr>) OR .....
09c0: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 73 65  **.** In this se
09d0: 63 6f 6e 64 20 63 61 73 65 2c 20 77 74 46 6c 61  cond case, wtFla
09e0: 67 20 61 73 20 74 68 65 20 54 45 52 4d 5f 4f 52  g as the TERM_OR
09f0: 49 4e 46 4f 20 73 65 74 20 61 6e 64 20 65 4f 70  INFO set and eOp
0a00: 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 0a 2a 2a  erator==WO_OR.**
0a10: 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 54 65   and the WhereTe
0a20: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 66 69 65  rm.u.pOrInfo fie
0a30: 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 75 78  ld points to aux
0a40: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
0a50: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 6f  on that.** is co
0a60: 6c 6c 65 63 74 65 64 20 61 62 6f 75 74 20 74 68  llected about th
0a70: 65 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 65 72  e.**.** If a ter
0a80: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
0a90: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d  lause does not m
0aa0: 61 74 63 68 20 65 69 74 68 65 72 20 6f 66 20 74  atch either of t
0ab0: 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75 73 0a  he two previous.
0ac0: 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2c 20 74  ** categories, t
0ad0: 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 3d 3d 30  hen eOperator==0
0ae0: 2e 20 20 54 68 65 20 57 68 65 72 65 54 65 72 6d  .  The WhereTerm
0af0: 2e 70 45 78 70 72 20 66 69 65 6c 64 20 69 73 20  .pExpr field is 
0b00: 73 74 69 6c 6c 20 73 65 74 0a 2a 2a 20 74 6f 20  still set.** to 
0b10: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 75 62  the original sub
0b20: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 65  expression conte
0b30: 6e 74 20 61 6e 64 20 77 74 46 6c 61 67 73 20 69  nt and wtFlags i
0b40: 73 20 73 65 74 20 75 70 20 61 70 70 72 6f 70 72  s set up appropr
0b50: 69 61 74 65 6c 79 0a 2a 2a 20 62 75 74 20 6e 6f  iately.** but no
0b60: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 69 6e   other fields in
0b70: 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 20 6f   the WhereTerm o
0b80: 62 6a 65 63 74 20 61 72 65 20 6d 65 61 6e 69 6e  bject are meanin
0b90: 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  gful..**.** When
0ba0: 20 65 4f 70 65 72 61 74 6f 72 21 3d 30 2c 20 70   eOperator!=0, p
0bb0: 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70  rereqRight and p
0bc0: 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72 64 20  rereqAll record 
0bd0: 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72 20 6e  sets of cursor n
0be0: 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74 20 74  umbers,.** but t
0bf0: 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69 72 65  hey do so indire
0c00: 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ctly.  A single 
0c10: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72  WhereMaskSet str
0c20: 75 63 74 75 72 65 20 74 72 61 6e 73 6c 61 74 65  ucture translate
0c30: 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62  s.** cursor numb
0c40: 65 72 20 69 6e 74 6f 20 62 69 74 73 20 61 6e 64  er into bits and
0c50: 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64 20   the translated 
0c60: 62 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  bit is stored in
0c70: 20 74 68 65 20 70 72 65 72 65 71 0a 2a 2a 20 66   the prereq.** f
0c80: 69 65 6c 64 73 2e 20 20 54 68 65 20 74 72 61 6e  ields.  The tran
0c90: 73 6c 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  slation is used 
0ca0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 78 69  in order to maxi
0cb0: 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mize the number 
0cc0: 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68 61 74 20  of.** bits that 
0cd0: 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 42 69  will fit in a Bi
0ce0: 74 6d 61 73 6b 2e 20 20 54 68 65 20 56 44 42 45  tmask.  The VDBE
0cf0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
0d00: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73 70 72 65  might be.** spre
0d10: 61 64 20 6f 75 74 20 6f 76 65 72 20 74 68 65 20  ad out over the 
0d20: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74  non-negative int
0d30: 65 67 65 72 73 2e 20 20 46 6f 72 20 65 78 61 6d  egers.  For exam
0d40: 70 6c 65 2c 20 74 68 65 20 63 75 72 73 6f 72 0a  ple, the cursor.
0d50: 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74  ** numbers might
0d60: 20 62 65 20 33 2c 20 38 2c 20 39 2c 20 31 30 2c   be 3, 8, 9, 10,
0d70: 20 32 30 2c 20 32 33 2c 20 34 31 2c 20 61 6e 64   20, 23, 41, and
0d80: 20 34 35 2e 20 20 54 68 65 20 57 68 65 72 65 4d   45.  The WhereM
0d90: 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61 6e 73 6c  askSet.** transl
0da0: 61 74 65 73 20 74 68 65 73 65 20 73 70 61 72 73  ates these spars
0db0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
0dc0: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
0dd0: 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 62 65  e integers.** be
0de0: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 20 69  ginning with 0 i
0df0: 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
0e00: 74 68 65 20 62 65 73 74 20 70 6f 73 73 69 62 6c  the best possibl
0e10: 65 20 75 73 65 20 6f 66 20 74 68 65 20 61 76 61  e use of the ava
0e20: 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74 73 20 69  ilable.** bits i
0e30: 6e 20 74 68 65 20 42 69 74 6d 61 73 6b 2e 20 20  n the Bitmask.  
0e40: 53 6f 2c 20 69 6e 20 74 68 65 20 65 78 61 6d 70  So, in the examp
0e50: 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 63 75  le above, the cu
0e60: 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a 2a 2a 20  rsor numbers.** 
0e70: 77 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20  would be mapped 
0e80: 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 20 30 20  into integers 0 
0e90: 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a 0a 2a 2a  through 7..**.**
0ea0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
0eb0: 65 72 6d 73 20 69 6e 20 61 20 6a 6f 69 6e 20 69  erms in a join i
0ec0: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
0ed0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 0a   number of bits.
0ee0: 2a 2a 20 69 6e 20 70 72 65 72 65 71 52 69 67 68  ** in prereqRigh
0ef0: 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 2e  t and prereqAll.
0f00: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
0f10: 20 36 34 20 62 69 74 73 2c 20 68 65 6e 63 65 20   64 bits, hence 
0f20: 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6f 6e 6c  SQLite.** is onl
0f30: 79 20 61 62 6c 65 20 74 6f 20 70 72 6f 63 65 73  y able to proces
0f40: 73 20 6a 6f 69 6e 73 20 77 69 74 68 20 36 34 20  s joins with 64 
0f50: 6f 72 20 66 65 77 65 72 20 74 61 62 6c 65 73 2e  or fewer tables.
0f60: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0f70: 63 74 20 57 68 65 72 65 54 65 72 6d 20 57 68 65  ct WhereTerm Whe
0f80: 72 65 54 65 72 6d 3b 0a 73 74 72 75 63 74 20 57  reTerm;.struct W
0f90: 68 65 72 65 54 65 72 6d 20 7b 0a 20 20 45 78 70  hereTerm {.  Exp
0fa0: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
0fb0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
0fc0: 74 6f 20 74 68 65 20 73 75 62 65 78 70 72 65 73  to the subexpres
0fd0: 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 69  sion that is thi
0fe0: 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  s term */.  int 
0ff0: 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
1000: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 70      /* Disable p
1010: 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77  WC->a[iParent] w
1020: 68 65 6e 20 74 68 69 73 20 74 65 72 6d 20 64 69  hen this term di
1030: 73 61 62 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20  sabled */.  int 
1040: 6c 65 66 74 43 75 72 73 6f 72 3b 20 20 20 20 20  leftCursor;     
1050: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
1060: 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20  mber of X in "X 
1070: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a  <op> <expr>" */.
1080: 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 6e    union {.    in
1090: 74 20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20  t leftColumn;   
10a0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
10b0: 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22  number of X in "
10c0: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a  X <op> <expr>" *
10d0: 2f 0a 20 20 20 20 57 68 65 72 65 4f 72 49 6e 66  /.    WhereOrInf
10e0: 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a  o *pOrInfo;   /*
10f0: 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   Extra informati
1100: 6f 6e 20 69 66 20 65 4f 70 65 72 61 74 6f 72 3d  on if eOperator=
1110: 3d 57 4f 5f 4f 52 20 2a 2f 0a 20 20 20 20 57 68  =WO_OR */.    Wh
1120: 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64  ereAndInfo *pAnd
1130: 49 6e 66 6f 3b 20 2f 2a 20 45 78 74 72 61 20 69  Info; /* Extra i
1140: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f  nformation if eO
1150: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20  perator==WO_AND 
1160: 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 31 36 20  */.  } u;.  u16 
1170: 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 20 20 20  eOperator;      
1180: 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78 20 76      /* A WO_xx v
1190: 61 6c 75 65 20 64 65 73 63 72 69 62 69 6e 67 20  alue describing 
11a0: 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 77 74 46  <op> */.  u8 wtF
11b0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
11c0: 20 20 2f 2a 20 54 45 52 4d 5f 78 78 78 20 62 69    /* TERM_xxx bi
11d0: 74 20 66 6c 61 67 73 2e 20 20 53 65 65 20 62 65  t flags.  See be
11e0: 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e 43 68 69  low */.  u8 nChi
11f0: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
1200: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
1210: 69 6c 64 72 65 6e 20 74 68 61 74 20 6d 75 73 74  ildren that must
1220: 20 64 69 73 61 62 6c 65 20 75 73 20 2a 2f 0a 20   disable us */. 
1230: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1240: 43 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C;       /* The 
1250: 63 6c 61 75 73 65 20 74 68 69 73 20 74 65 72 6d  clause this term
1260: 20 69 73 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20   is part of */. 
1270: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 52   Bitmask prereqR
1280: 69 67 68 74 3b 20 20 20 20 2f 2a 20 42 69 74 6d  ight;    /* Bitm
1290: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 75 73  ask of tables us
12a0: 65 64 20 62 79 20 70 45 78 70 72 2d 3e 70 52 69  ed by pExpr->pRi
12b0: 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ght */.  Bitmask
12c0: 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20   prereqAll;     
12d0: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
12e0: 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64  ables referenced
12f0: 20 62 79 20 70 45 78 70 72 20 2a 2f 0a 7d 3b 0a   by pExpr */.};.
1300: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
1310: 61 6c 75 65 73 20 6f 66 20 57 68 65 72 65 54 65  alues of WhereTe
1320: 72 6d 2e 77 74 46 6c 61 67 73 0a 2a 2f 0a 23 64  rm.wtFlags.*/.#d
1330: 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e 41 4d  efine TERM_DYNAM
1340: 49 43 20 20 20 20 30 78 30 31 20 20 20 2f 2a 20  IC    0x01   /* 
1350: 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  Need to call sql
1360: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1370: 62 2c 20 70 45 78 70 72 29 20 2a 2f 0a 23 64 65  b, pExpr) */.#de
1380: 66 69 6e 65 20 54 45 52 4d 5f 56 49 52 54 55 41  fine TERM_VIRTUA
1390: 4c 20 20 20 20 30 78 30 32 20 20 20 2f 2a 20 41  L    0x02   /* A
13a0: 64 64 65 64 20 62 79 20 74 68 65 20 6f 70 74 69  dded by the opti
13b0: 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f 74 20 63  mizer.  Do not c
13c0: 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ode */.#define T
13d0: 45 52 4d 5f 43 4f 44 45 44 20 20 20 20 20 20 30  ERM_CODED      0
13e0: 78 30 34 20 20 20 2f 2a 20 54 68 69 73 20 74 65  x04   /* This te
13f0: 72 6d 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f  rm is already co
1400: 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ded */.#define T
1410: 45 52 4d 5f 43 4f 50 49 45 44 20 20 20 20 20 30  ERM_COPIED     0
1420: 78 30 38 20 20 20 2f 2a 20 48 61 73 20 61 20 63  x08   /* Has a c
1430: 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  hild */.#define 
1440: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 20 20 20 20  TERM_ORINFO     
1450: 30 78 31 30 20 20 20 2f 2a 20 4e 65 65 64 20 74  0x10   /* Need t
1460: 6f 20 66 72 65 65 20 74 68 65 20 57 68 65 72 65  o free the Where
1470: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 6f  Term.u.pOrInfo o
1480: 62 6a 65 63 74 20 2a 2f 0a 23 64 65 66 69 6e 65  bject */.#define
1490: 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 20 20   TERM_ANDINFO   
14a0: 20 30 78 32 30 20 20 20 2f 2a 20 4e 65 65 64 20   0x20   /* Need 
14b0: 74 6f 20 66 72 65 65 20 74 68 65 20 57 68 65 72  to free the Wher
14c0: 65 54 65 72 6d 2e 75 2e 70 41 6e 64 49 6e 66 6f  eTerm.u.pAndInfo
14d0: 20 6f 62 6a 20 2a 2f 0a 23 64 65 66 69 6e 65 20   obj */.#define 
14e0: 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20 20 20 20  TERM_OR_OK      
14f0: 30 78 34 30 20 20 20 2f 2a 20 55 73 65 64 20 64  0x40   /* Used d
1500: 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20  uring OR-clause 
1510: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f  processing */../
1520: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
1530: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1540: 67 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64  g structure hold
1550: 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  s all informatio
1560: 6e 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45  n about a.** WHE
1570: 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74  RE clause.  Most
1580: 6c 79 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e  ly this is a con
1590: 74 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f  tainer for one o
15a0: 72 20 6d 6f 72 65 20 57 68 65 72 65 54 65 72 6d  r more WhereTerm
15b0: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  s..*/.struct Whe
15c0: 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 50 61 72  reClause {.  Par
15d0: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
15e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
15f0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
1600: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
1610: 4d 61 73 6b 53 65 74 3b 20 20 2f 2a 20 4d 61 70  MaskSet;  /* Map
1620: 70 69 6e 67 20 6f 66 20 74 61 62 6c 65 20 63 75  ping of table cu
1630: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20  rsor numbers to 
1640: 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 75 38  bitmasks */.  u8
1650: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1660: 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74 20         /* Split 
1670: 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41 4e  operator.  TK_AN
1680: 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20  D or TK_OR */.  
1690: 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20  int nTerm;      
16a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16b0: 65 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20  er of terms */. 
16c0: 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20   int nSlot;     
16d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16e0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
16f0: 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  n a[] */.  Where
1700: 54 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20  Term *a;        
1710: 20 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20      /* Each a[] 
1720: 64 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d  describes a term
1730: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
1740: 75 61 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  uase */.  WhereT
1750: 65 72 6d 20 61 53 74 61 74 69 63 5b 34 5d 3b 20  erm aStatic[4]; 
1760: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74     /* Initial st
1770: 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61  atic space for a
1780: 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  [] */.};../*.** 
1790: 41 20 57 68 65 72 65 54 65 72 6d 20 77 69 74 68  A WhereTerm with
17a0: 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f   eOperator==WO_O
17b0: 52 20 68 61 73 20 69 74 73 20 75 2e 70 4f 72 49  R has its u.pOrI
17c0: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20  nfo pointer set 
17d0: 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61  to.** a dynamica
17e0: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  lly allocated in
17f0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1800: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1810: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
1820: 72 65 4f 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65  reOrInfo {.  Whe
1830: 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20  reClause wc;    
1840: 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f        /* Decompo
1850: 73 69 74 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74  sition into subt
1860: 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
1870: 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20  k indexable;    
1880: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
1890: 20 61 6c 6c 20 69 6e 64 65 78 61 62 6c 65 20 74   all indexable t
18a0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 63 6c 61  ables in the cla
18b0: 75 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  use */.};../*.**
18c0: 20 41 20 57 68 65 72 65 54 65 72 6d 20 77 69 74   A WhereTerm wit
18d0: 68 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  h eOperator==WO_
18e0: 41 4e 44 20 68 61 73 20 69 74 73 20 75 2e 70 41  AND has its u.pA
18f0: 6e 64 49 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73  ndInfo pointer s
1900: 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d  et to.** a dynam
1910: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
1920: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1930: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1940: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
1950: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20  WhereAndInfo {. 
1960: 20 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b   WhereClause wc;
1970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1980: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 62   subexpression b
1990: 72 6f 6b 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a  roken out */.};.
19a0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
19b0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
19c0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
19d0: 65 70 73 20 74 72 61 63 6b 20 6f 66 20 61 20 6d  eps track of a m
19e0: 61 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65  apping.** betwee
19f0: 6e 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  n VDBE cursor nu
1a00: 6d 62 65 72 73 20 61 6e 64 20 62 69 74 73 20 6f  mbers and bits o
1a10: 66 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 69  f the bitmasks i
1a20: 6e 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  n WhereTerm..**.
1a30: 2a 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  ** The VDBE curs
1a40: 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73  or numbers are s
1a50: 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 63 6f  mall integers co
1a60: 6e 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53  ntained in .** S
1a70: 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75 72  rcList_item.iCur
1a80: 73 6f 72 20 61 6e 64 20 45 78 70 72 2e 69 54 61  sor and Expr.iTa
1a90: 62 6c 65 20 66 69 65 6c 64 73 2e 20 20 46 6f 72  ble fields.  For
1aa0: 20 61 6e 79 20 67 69 76 65 6e 20 57 48 45 52 45   any given WHERE
1ab0: 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74 68 65   .** clause, the
1ac0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1ad0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 67 69 6e 20  might not begin 
1ae0: 77 69 74 68 20 30 20 61 6e 64 20 74 68 65 79 20  with 0 and they 
1af0: 6d 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  might.** contain
1b00: 20 67 61 70 73 20 69 6e 20 74 68 65 20 6e 75 6d   gaps in the num
1b10: 62 65 72 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  bering sequence.
1b20: 20 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f    But we want to
1b30: 20 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a   make maximum.**
1b40: 20 75 73 65 20 6f 66 20 74 68 65 20 62 69 74 73   use of the bits
1b50: 20 69 6e 20 6f 75 72 20 62 69 74 6d 61 73 6b 73   in our bitmasks
1b60: 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72  .  This structur
1b70: 65 20 70 72 6f 76 69 64 65 73 20 61 20 6d 61 70  e provides a map
1b80: 70 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  ping.** from the
1b90: 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e   sparse cursor n
1ba0: 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73  umbers into cons
1bb0: 65 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73  ecutive integers
1bc0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
1bd0: 74 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57  th 0..**.** If W
1be0: 68 65 72 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41  hereMaskSet.ix[A
1bf0: 5d 3d 3d 42 20 69 74 20 6d 65 61 6e 73 20 74 68  ]==B it means th
1c00: 61 74 20 54 68 65 20 41 2d 74 68 20 62 69 74 20  at The A-th bit 
1c10: 6f 66 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20  of a Bitmask.** 
1c20: 63 6f 72 72 65 73 70 6f 6e 64 73 20 56 44 42 45  corresponds VDBE
1c30: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 42   cursor number B
1c40: 2e 20 20 54 68 65 20 41 2d 74 68 20 62 69 74 20  .  The A-th bit 
1c50: 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 69 73 20  of a bitmask is 
1c60: 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  1<<A..**.** For 
1c70: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1c80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
1c90: 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 68 65  ression used the
1ca0: 73 65 20 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f  se VDBE.** curso
1cb0: 72 73 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32 39  rs:  4, 5, 8, 29
1cc0: 2c 20 35 37 2c 20 37 33 2e 20 20 54 68 65 6e 20  , 57, 73.  Then 
1cd0: 74 68 65 20 20 57 68 65 72 65 4d 61 73 6b 53 65  the  WhereMaskSe
1ce0: 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 77  t structure.** w
1cf0: 6f 75 6c 64 20 6d 61 70 20 74 68 6f 73 65 20 63  ould map those c
1d00: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
1d10: 74 6f 20 62 69 74 73 20 30 20 74 68 72 6f 75 67  to bits 0 throug
1d20: 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  h 5..**.** Note 
1d30: 74 68 61 74 20 74 68 65 20 6d 61 70 70 69 6e 67  that the mapping
1d40: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1d50: 69 6c 79 20 6f 72 64 65 72 65 64 2e 20 20 49 6e  ily ordered.  In
1d60: 20 74 68 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20   the example.** 
1d70: 61 62 6f 76 65 2c 20 74 68 65 20 6d 61 70 70 69  above, the mappi
1d80: 6e 67 20 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65  ng might go like
1d90: 20 74 68 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d   this:  4->3, 5-
1da0: 3e 31 2c 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c  >1, 8->2, 29->0,
1db0: 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34  .** 57->5, 73->4
1dc0: 2e 20 20 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39  .  Or one of 719
1dd0: 20 6f 74 68 65 72 20 63 6f 6d 62 69 6e 61 74 69   other combinati
1de0: 6f 6e 73 20 6d 69 67 68 74 20 62 65 20 75 73 65  ons might be use
1df0: 64 2e 20 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d. It.** does no
1e00: 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e  t really matter.
1e10: 20 20 57 68 61 74 20 69 73 20 69 6d 70 6f 72 74    What is import
1e20: 61 6e 74 20 69 73 20 74 68 61 74 20 73 70 61 72  ant is that spar
1e30: 73 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  se cursor.** num
1e40: 62 65 72 73 20 61 6c 6c 20 67 65 74 20 6d 61 70  bers all get map
1e50: 70 65 64 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d  ped into bit num
1e60: 62 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20  bers that begin 
1e70: 77 69 74 68 20 30 20 61 6e 64 20 63 6f 6e 74 61  with 0 and conta
1e80: 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a  in.** no gaps..*
1e90: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4d 61  /.struct WhereMa
1ea0: 73 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b  skSet {.  int n;
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ed0: 72 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63 75  r of assigned cu
1ee0: 72 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20  rsor values */. 
1ef0: 20 69 6e 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20   int ix[BMS];   
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f10: 2a 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e 65  * Cursor assigne
1f20: 64 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a 2f  d to each bit */
1f30: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1f40: 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 72 65  reCost object re
1f50: 63 6f 72 64 73 20 61 20 6c 6f 6f 6b 75 70 20 73  cords a lookup s
1f60: 74 72 61 74 65 67 79 20 61 6e 64 20 74 68 65 20  trategy and the 
1f70: 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20 63 6f 73  estimated.** cos
1f80: 74 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68  t of pursuing th
1f90: 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2f 0a  at strategy..*/.
1fa0: 73 74 72 75 63 74 20 57 68 65 72 65 43 6f 73 74  struct WhereCost
1fb0: 20 7b 0a 20 20 57 68 65 72 65 50 6c 61 6e 20 70   {.  WherePlan p
1fc0: 6c 61 6e 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c  lan;    /* The l
1fd0: 6f 6f 6b 75 70 20 73 74 72 61 74 65 67 79 20 2a  ookup strategy *
1fe0: 2f 0a 20 20 64 6f 75 62 6c 65 20 72 43 6f 73 74  /.  double rCost
1ff0: 3b 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 61 6c  ;      /* Overal
2000: 6c 20 63 6f 73 74 20 6f 66 20 70 75 72 73 75 69  l cost of pursui
2010: 6e 67 20 74 68 69 73 20 73 65 61 72 63 68 20 73  ng this search s
2020: 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f 75  trategy */.  dou
2030: 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20 20 20 20  ble nRow;       
2040: 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d  /* Estimated num
2050: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
2060: 77 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ws */.};../*.** 
2070: 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65  Bitmasks for the
2080: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
2090: 69 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65  indices are able
20a0: 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e   to exploit.  An
20b0: 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e  .** OR-ed combin
20c0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76  ation of these v
20d0: 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65  alues can be use
20e0: 64 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67  d when searching
20f0: 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e   for.** terms in
2100: 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   the where claus
2110: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  e..*/.#define WO
2120: 5f 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64  _IN     0x001.#d
2130: 65 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20  efine WO_EQ     
2140: 30 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f  0x002.#define WO
2150: 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _LT     (WO_EQ<<
2160: 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23  (TK_LT-TK_EQ)).#
2170: 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20  define WO_LE    
2180: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d   (WO_EQ<<(TK_LE-
2190: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
21a0: 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_GT     (WO_EQ
21b0: 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29  <<(TK_GT-TK_EQ))
21c0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20  .#define WO_GE  
21d0: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47     (WO_EQ<<(TK_G
21e0: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
21f0: 65 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34  e WO_MATCH  0x04
2200: 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e  0.#define WO_ISN
2210: 55 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e  ULL 0x080.#defin
2220: 65 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30  e WO_OR     0x10
2230: 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f  0       /* Two o
2240: 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63  r more OR-connec
2250: 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65  ted terms */.#de
2260: 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30  fine WO_AND    0
2270: 78 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77  x200       /* Tw
2280: 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f  o or more AND-co
2290: 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f  nnected terms */
22a0: 0a 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c  ..#define WO_ALL
22b0: 20 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20      0xfff       
22c0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70  /* Mask of all p
22d0: 6f 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c  ossible WO_* val
22e0: 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ues */.#define W
22f0: 4f 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20  O_SINGLE 0x0ff  
2300: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2310: 61 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64  all non-compound
2320: 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a   WO_* values */.
2330: 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72  ./*.** Value for
2340: 20 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65   wsFlags returne
2350: 64 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29  d by bestIndex()
2360: 20 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a   and stored in.*
2370: 2a 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46  * WhereLevel.wsF
2380: 6c 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61  lags.  These fla
2390: 67 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69  gs determine whi
23a0: 63 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72  ch search.** str
23b0: 61 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72  ategies are appr
23c0: 6f 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  opriate..**.** T
23d0: 68 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69  he least signifi
23e0: 63 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20  cant 12 bits is 
23f0: 72 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61  reserved as a ma
2400: 73 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65  sk for WO_ value
2410: 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20  s above..** The 
2420: 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61  WhereLevel.wsFla
2430: 67 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61  gs field is usua
2440: 6c 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e  lly set to WO_IN
2450: 7c 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_EQ|WO_ISNULL
2460: 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20  ..** But if the 
2470: 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67  table is the rig
2480: 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65  ht table of a le
2490: 66 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65  ft join, WhereLe
24a0: 76 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69  vel.wsFlags.** i
24b0: 73 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57  s set to WO_IN|W
24c0: 4f 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65  O_EQ.  The Where
24d0: 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69  Level.wsFlags fi
24e0: 65 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20  eld can then be 
24f0: 75 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22  used as.** the "
2500: 6f 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f  op" parameter to
2510: 20 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77   findTerm when w
2520: 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20  e are resolving 
2530: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
2540: 69 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20  ints..** ISNULL 
2550: 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c  constraints will
2560: 20 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65   then not be use
2570: 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74  d on the right t
2580: 61 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a  able of a left.*
2590: 2a 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73  * join.  Tickets
25a0: 20 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39   #2177 and #2189
25b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  ..*/.#define WHE
25c0: 52 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20  RE_ROWID_EQ     
25d0: 30 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72  0x00001000  /* r
25e0: 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77  owid=EXPR or row
25f0: 69 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23  id IN (...) */.#
2600: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57  define WHERE_ROW
2610: 49 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30  ID_RANGE  0x0000
2620: 32 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45  2000  /* rowid<E
2630: 58 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64  XPR and/or rowid
2640: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2650: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
2660: 20 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20      0x00010000  
2670: 2f 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49  /* x=EXPR or x I
2680: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
2690: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
26a0: 52 41 4e 47 45 20 30 78 30 30 30 32 30 30 30 30  RANGE 0x00020000
26b0: 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e 64 2f    /* x<EXPR and/
26c0: 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23 64 65  or x>EXPR */.#de
26d0: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
26e0: 4e 5f 49 4e 20 20 20 20 30 78 30 30 30 34 30 30  N_IN    0x000400
26f0: 30 30 20 20 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e  00  /* x IN (...
2700: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  ) */.#define WHE
2710: 52 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20  RE_INDEXED      
2720: 30 78 30 30 30 37 30 30 30 30 20 20 2f 2a 20 41  0x00070000  /* A
2730: 6e 79 74 68 69 6e 67 20 74 68 61 74 20 75 73 65  nything that use
2740: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64  s an index */.#d
2750: 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41  efine WHERE_IN_A
2760: 42 4c 45 20 20 20 20 20 20 30 78 30 30 30 37 31  BLE      0x00071
2770: 30 30 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20  000  /* Able to 
2780: 73 75 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70  support an IN op
2790: 65 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e  erator */.#defin
27a0: 65 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  e WHERE_TOP_LIMI
27b0: 54 20 20 20 20 30 78 30 30 31 30 30 30 30 30 20  T    0x00100000 
27c0: 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c   /* x<EXPR or x<
27d0: 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74  =EXPR constraint
27e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
27f0: 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30  E_BTM_LIMIT    0
2800: 78 30 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e  x00200000  /* x>
2810: 45 58 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20  EXPR or x>=EXPR 
2820: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64  constraint */.#d
2830: 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f  efine WHERE_IDX_
2840: 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 38 30 30  ONLY     0x00800
2850: 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e 64 65  000  /* Use inde
2860: 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61  x only - omit ta
2870: 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ble */.#define W
2880: 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20 20 20  HERE_ORDERBY    
2890: 20 20 30 78 30 31 30 30 30 30 30 30 20 20 2f 2a    0x01000000  /*
28a0: 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70   Output will app
28b0: 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f  ear in correct o
28c0: 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  rder */.#define 
28d0: 57 48 45 52 45 5f 52 45 56 45 52 53 45 20 20 20  WHERE_REVERSE   
28e0: 20 20 20 30 78 30 32 30 30 30 30 30 30 20 20 2f     0x02000000  /
28f0: 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73  * Scan in revers
2900: 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69  e order */.#defi
2910: 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20  ne WHERE_UNIQUE 
2920: 20 20 20 20 20 20 30 78 30 34 30 30 30 30 30 30        0x04000000
2930: 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20    /* Selects no 
2940: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f  more than one ro
2950: 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  w */.#define WHE
2960: 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
2970: 30 78 30 38 30 30 30 30 30 30 20 20 2f 2a 20 55  0x08000000  /* U
2980: 73 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65  se virtual-table
2990: 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23   processing */.#
29a0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4d 55 4c  define WHERE_MUL
29b0: 54 49 5f 4f 52 20 20 20 20 20 30 78 31 30 30 30  TI_OR     0x1000
29c0: 30 30 30 30 20 20 2f 2a 20 4f 52 20 75 73 69 6e  0000  /* OR usin
29d0: 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69 63  g multiple indic
29e0: 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  es */../*.** Ini
29f0: 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c  tialize a preall
2a00: 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61 75  ocated WhereClau
2a10: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
2a20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
2a30: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20  reClauseInit(.  
2a40: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2a50: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2a60: 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62  WhereClause to b
2a70: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  e initialized */
2a80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2a90: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2aa0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
2ab0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  xt */.  WhereMas
2ac0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 20  kSet *pMaskSet  
2ad0: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
2ae0: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75   table cursor nu
2af0: 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b  mbers to bitmask
2b00: 73 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70  s */.){.  pWC->p
2b10: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2b20: 20 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20    pWC->pMaskSet 
2b30: 3d 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57  = pMaskSet;.  pW
2b40: 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20  C->nTerm = 0;.  
2b50: 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72  pWC->nSlot = Arr
2b60: 61 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61  aySize(pWC->aSta
2b70: 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d  tic);.  pWC->a =
2b80: 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d   pWC->aStatic;.}
2b90: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
2ba0: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
2bb0: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
2bc0: 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75  eClear(WhereClau
2bd0: 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  se*);../*.** Dea
2be0: 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f  llocate all memo
2bf0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
2c00: 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f  th a WhereOrInfo
2c10: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
2c20: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49  ic void whereOrI
2c30: 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nfoDelete(sqlite
2c40: 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e  3 *db, WhereOrIn
2c50: 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43  fo *p){.  whereC
2c60: 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77  lauseClear(&p->w
2c70: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  c);.  sqlite3DbF
2c80: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
2c90: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2ca0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
2cb0: 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65  iated with a Whe
2cc0: 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74  reAndInfo object
2cd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2ce0: 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c   whereAndInfoDel
2cf0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
2d00: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
2d10: 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  ){.  whereClause
2d20: 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20  Clear(&p->wc);. 
2d30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2d40: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
2d50: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65  Deallocate a Whe
2d60: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
2d70: 72 65 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  re.  The WhereCl
2d80: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
2d90: 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20  * itself is not 
2da0: 66 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75  freed.  This rou
2db0: 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65  tine is the inve
2dc0: 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75  rse of whereClau
2dd0: 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  seInit()..*/.sta
2de0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
2df0: 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43  auseClear(WhereC
2e00: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69  lause *pWC){.  i
2e10: 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72  nt i;.  WhereTer
2e20: 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20  m *a;.  sqlite3 
2e30: 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  *db = pWC->pPars
2e40: 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70  e->db;.  for(i=p
2e50: 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70  WC->nTerm-1, a=p
2e60: 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  WC->a; i>=0; i--
2e70: 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , a++){.    if( 
2e80: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
2e90: 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  M_DYNAMIC ){.   
2ea0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
2eb0: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70  lete(db, a->pExp
2ec0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
2ed0: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
2ee0: 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20  ERM_ORINFO ){.  
2ef0: 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44      whereOrInfoD
2f00: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
2f10: 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c  OrInfo);.    }el
2f20: 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67  se if( a->wtFlag
2f30: 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  s & TERM_ANDINFO
2f40: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41   ){.      whereA
2f50: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c  ndInfoDelete(db,
2f60: 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b   a->u.pAndInfo);
2f70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2f80: 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53   pWC->a!=pWC->aS
2f90: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c  tatic ){.    sql
2fa0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2fb0: 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  WC->a);.  }.}../
2fc0: 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
2fd0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
2fe0: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68 65  entry to the Whe
2ff0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
3000: 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20  pWC..** The new 
3010: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
3020: 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20   is constructed 
3030: 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20  from Expr p and 
3040: 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a  with wtFlags..**
3050: 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57   The index in pW
3060: 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65  C->a[] of the ne
3070: 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20 72  w WhereTerm is r
3080: 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
3090: 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75  ss..** 0 is retu
30a0: 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77 20  rned if the new 
30b0: 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20  WhereTerm could 
30c0: 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75 65  not be added due
30d0: 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20   to a memory.** 
30e0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
30f0: 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c  .  The memory al
3100: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
3110: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65   will be recorde
3120: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e  d in.** the db->
3130: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
3140: 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65 72  g so that higher
3150: 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73  -level functions
3160: 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a   can detect it..
3170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3180: 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ne will increase
3190: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
31a0: 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20   pWC->a[] array 
31b0: 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
31c0: 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61  .** If the wtFla
31d0: 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c  gs argument incl
31e0: 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49  udes TERM_DYNAMI
31f0: 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69  C, then responsi
3200: 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72  bility.** for fr
3210: 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73  eeing the expres
3220: 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65  sion p is assume
3230: 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c  d by the WhereCl
3240: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
3250: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75 65  .** This is true
3260: 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f   even if this ro
3270: 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61  utine fails to a
3280: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
3290: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57  ereTerm..**.** W
32a0: 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f  ARNING:  This ro
32b0: 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c  utine might real
32c0: 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65  locate the space
32d0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
32e0: 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41  * WhereTerms.  A
32f0: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57  ll pointers to W
3300: 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64  hereTerms should
3310: 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
3320: 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67  after.** calling
3330: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
3340: 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61  Such pointers ma
3350: 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a  y be reinitializ
3360: 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e  ed by referencin
3370: 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b  g.** the pWC->a[
3380: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
3390: 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75  ic int whereClau
33a0: 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c  seInsert(WhereCl
33b0: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
33c0: 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b  *p, u8 wtFlags){
33d0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
33e0: 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  erm;.  int idx;.
33f0: 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
3400: 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a  >=pWC->nSlot ){.
3410: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
3420: 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20  Old = pWC->a;.  
3430: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3440: 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  pWC->pParse->db;
3450: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
3460: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
3470: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
3480: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
3490: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
34a0: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
34b0: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
34c0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
34d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
34e0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
34f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3500: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
3510: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
3520: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
3530: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
3540: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
3550: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
3560: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
3570: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
3580: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3590: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
35a0: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
35b0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
35c0: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
35d0: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
35e0: 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  ]);.  }.  pTerm 
35f0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20  = &pWC->a[idx = 
3600: 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20  pWC->nTerm++];. 
3610: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20   pTerm->pExpr = 
3620: 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  p;.  pTerm->wtFl
3630: 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20  ags = wtFlags;. 
3640: 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57   pTerm->pWC = pW
3650: 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  C;.  pTerm->iPar
3660: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ent = -1;.  retu
3670: 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn idx;.}../*.**
3680: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64   This routine id
3690: 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72  entifies subexpr
36a0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
36b0: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72  HERE clause wher
36c0: 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70  e.** each subexp
36d0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
36e0: 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20  ated by the AND 
36f0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65  operator or some
3700: 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74   other.** operat
3710: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
3720: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
3730: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
3740: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
3750: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70  is filled with p
3760: 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78  ointers to subex
3770: 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20  pressions.  For 
3780: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
3790: 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c    WHERE  a=='hel
37a0: 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65  lo' AND coalesce
37b0: 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63  (b,11)<10 AND (c
37c0: 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29  +12!=d OR c==22)
37d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f  .**           \_
37e0: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
37f0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  _____________/  
3800: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
3810: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
3820: 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20      slot[0]     
3830: 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20         slot[1]  
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f               slo
3850: 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  t[2].**.** The o
3860: 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
3870: 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73  ause in pExpr is
3880: 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c   unaltered.  All
3890: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
38a0: 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c   does is make sl
38b0: 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69  ot[] entries poi
38c0: 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75  nt to substructu
38d0: 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e  re within pExpr.
38e0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72  .**.** In the pr
38f0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20  evious sentence 
3900: 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72  and in the diagr
3910: 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66  am, "slot[]" ref
3920: 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68  ers to.** the Wh
3930: 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72  ereClause.a[] ar
3940: 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d  ray.  The slot[]
3950: 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20   array grows as 
3960: 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69  needed to contai
3970: 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f  n.** all terms o
3980: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
3990: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
39a0: 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68  id whereSplit(Wh
39b0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
39c0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
39d0: 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20   op){.  pWC->op 
39e0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20  = (u8)op;.  if( 
39f0: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
3a00: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
3a10: 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68  op!=op ){.    wh
3a20: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
3a30: 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  pWC, pExpr, 0);.
3a40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65    }else{.    whe
3a50: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78  reSplit(pWC, pEx
3a60: 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a  pr->pLeft, op);.
3a70: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
3a80: 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  WC, pExpr->pRigh
3a90: 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  t, op);.  }.}../
3aa0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
3ab0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  an expression ma
3ac0: 73 6b 20 73 65 74 0a 2a 2f 0a 23 64 65 66 69 6e  sk set.*/.#defin
3ad0: 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29  e initMaskSet(P)
3ae0: 20 20 6d 65 6d 73 65 74 28 50 2c 20 30 2c 20 73    memset(P, 0, s
3af0: 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a  izeof(*P))../*.*
3b00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
3b10: 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76  mask for the giv
3b20: 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  en cursor number
3b30: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a  .  Return 0 if.*
3b40: 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74  * iCursor is not
3b50: 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a   in the set..*/.
3b60: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67  static Bitmask g
3b70: 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  etMask(WhereMask
3b80: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
3b90: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69  nt iCursor){.  i
3ba0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
3bb0: 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20   i<pMaskSet->n; 
3bc0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d  i++){.    if( pM
3bd0: 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69  askSet->ix[i]==i
3be0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
3bf0: 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61 73 6b  return ((Bitmask
3c00: 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a 20 20  )1)<<i;.    }.  
3c10: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3c20: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
3c30: 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72  new mask for cur
3c40: 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a  sor iCursor..**.
3c50: 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  ** There is one 
3c60: 63 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65  cursor per table
3c70: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3c80: 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  use.  The number
3c90: 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e   of.** tables in
3ca0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
3cb0: 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61   is limited by a
3cc0: 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74   test early in t
3cd0: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  he.** sqlite3Whe
3ce0: 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e  reBegin() routin
3cf0: 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74  e.  So we know t
3d00: 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74  hat the pMaskSet
3d10: 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20  ->ix[].** array 
3d20: 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66  will never overf
3d30: 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  low..*/.static v
3d40: 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57  oid createMask(W
3d50: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
3d60: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
3d70: 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  or){.  assert( p
3d80: 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72  MaskSet->n < Arr
3d90: 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d  aySize(pMaskSet-
3da0: 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53  >ix) );.  pMaskS
3db0: 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d  et->ix[pMaskSet-
3dc0: 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b  >n++] = iCursor;
3dd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3de0: 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28 72 65  outine walks (re
3df0: 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78  cursively) an ex
3e00: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
3e10: 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61  d generates.** a
3e20: 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74   bitmask indicat
3e30: 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73  ing which tables
3e40: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61   are used in tha
3e50: 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  t expression.** 
3e60: 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  tree..**.** In o
3e70: 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 72 6f  rder for this ro
3e80: 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20 74  utine to work, t
3e90: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
3ea0: 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a  ion must have.**
3eb0: 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 76 6f   previously invo
3ec0: 6b 65 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ked sqlite3Resol
3ed0: 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 6f 6e  veExprNames() on
3ee0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
3ef0: 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68 65 61    See.** the hea
3f00: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  der comment on t
3f10: 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  hat routine for 
3f20: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
3f30: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73  mation..** The s
3f40: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
3f50: 72 4e 61 6d 65 73 28 29 20 72 6f 75 74 69 6e 65  rNames() routine
3f60: 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c 75  s looks for colu
3f70: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a 20  mn names and.** 
3f80: 73 65 74 73 20 74 68 65 69 72 20 6f 70 63 6f 64  sets their opcod
3f90: 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20  es to TK_COLUMN 
3fa0: 61 6e 64 20 74 68 65 69 72 20 45 78 70 72 2e 69  and their Expr.i
3fb0: 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74 6f 0a  Table fields to.
3fc0: 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75 72 73  ** the VDBE curs
3fd0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
3fe0: 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f   table.  This ro
3ff0: 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74  utine just has t
4000: 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20 74  o.** translate t
4010: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
4020: 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20 76  s into bitmask v
4030: 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61 6c 6c  alues and OR all
4040: 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 73  .** the bitmasks
4050: 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73 74   together..*/.st
4060: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
4070: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
4080: 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 45  WhereMaskSet*, E
4090: 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
40a0: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65  c Bitmask exprSe
40b0: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 57  lectTableUsage(W
40c0: 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 53 65  hereMaskSet*, Se
40d0: 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42  lect*);.static B
40e0: 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65  itmask exprTable
40f0: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
4100: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
4110: 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73  pr *p){.  Bitmas
4120: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
4130: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
4140: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  0;.  if( p->op==
4150: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
4160: 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28   mask = getMask(
4170: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61  pMaskSet, p->iTa
4180: 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ble);.    return
4190: 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73   mask;.  }.  mas
41a0: 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  k = exprTableUsa
41b0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
41c0: 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20  pRight);.  mask 
41d0: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
41e0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
41f0: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 45 78 70  Left);.  if( Exp
4200: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
4210: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
4220: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
4230: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
4240: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78  e(pMaskSet, p->x
4250: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c  .pSelect);.  }el
4260: 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  se{.    mask |= 
4270: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
4280: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
4290: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  x.pList);.  }.  
42a0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
42b0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
42c0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
42d0: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
42e0: 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73  MaskSet, ExprLis
42f0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
4300: 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61   i;.  Bitmask ma
4310: 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c  sk = 0;.  if( pL
4320: 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ist ){.    for(i
4330: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
4340: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
4350: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
4360: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4370: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
4380: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pr);.    }.  }. 
4390: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
43a0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
43b0: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
43c0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
43d0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65   *pMaskSet, Sele
43e0: 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61  ct *pS){.  Bitma
43f0: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77  sk mask = 0;.  w
4400: 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20 20  hile( pS ){.    
4410: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
4420: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4430: 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29  Set, pS->pEList)
4440: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
4450: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
4460: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
4470: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61  GroupBy);.    ma
4480: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
4490: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
44a0: 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29  t, pS->pOrderBy)
44b0: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
44c0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
44d0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72  skSet, pS->pWher
44e0: 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  e);.    mask |= 
44f0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
4500: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61  MaskSet, pS->pHa
4510: 76 69 6e 67 29 3b 0a 20 20 20 20 70 53 20 3d 20  ving);.    pS = 
4520: 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  pS->pPrior;.  }.
4530: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
4540: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
4550: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
4560: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65   operator is one
4570: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
4580: 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c  s that is.** all
4590: 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65  owed for an inde
45a0: 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  xable WHERE clau
45b0: 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c  se term.  The al
45c0: 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20  lowed operators 
45d0: 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c  are.** "=", "<",
45e0: 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22   ">", "<=", ">="
45f0: 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a 73  , and "IN"..*/.s
4600: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65  tatic int allowe
4610: 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61  dOp(int op){.  a
4620: 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f  ssert( TK_GT>TK_
4630: 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47  EQ && TK_GT<TK_G
4640: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
4650: 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_LT>TK_EQ && TK
4660: 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _LT<TK_GE );.  a
4670: 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f  ssert( TK_LE>TK_
4680: 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47  EQ && TK_LE<TK_G
4690: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
46a0: 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b  K_GE==TK_EQ+4 );
46b0: 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b  .  return op==TK
46c0: 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45  _IN || (op>=TK_E
46d0: 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20  Q && op<=TK_GE) 
46e0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  || op==TK_ISNULL
46f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20  ;.}../*.** Swap 
4700: 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74  two objects of t
4710: 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 64 65  ype TYPE..*/.#de
4720: 66 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c 41  fine SWAP(TYPE,A
4730: 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20 41  ,B) {TYPE t=A; A
4740: 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a  =B; B=t;}../*.**
4750: 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61   Commute a compa
4760: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
4770: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
4780: 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59  the form "X op Y
4790: 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74  ".** are convert
47a0: 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22  ed into "Y op X"
47b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 6f 6c  ..**.** If a col
47c0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
47d0: 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  is associated wi
47e0: 74 68 20 65 69 74 68 65 72 20 74 68 65 20 6c 65  th either the le
47f0: 66 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a 20 73  ft or right.** s
4800: 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ide of the compa
4810: 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e  rison, it remain
4820: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
4830: 68 20 74 68 65 20 73 61 6d 65 20 73 69 64 65 20  h the same side 
4840: 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d  after.** the com
4850: 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20  mutation. So "Y 
4860: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
4870: 70 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a  p X" becomes .**
4880: 20 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41   "X collate NOCA
4890: 53 45 20 6f 70 20 59 22 2e 20 54 68 69 73 20 69  SE op Y". This i
48a0: 73 20 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f  s because any co
48b0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
48c0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20   on.** the left 
48d0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63  hand side of a c
48e0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69  omparison overri
48f0: 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  des any collatio
4900: 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61  n sequence .** a
4910: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72  ttached to the r
4920: 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61  ight. For the sa
4930: 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50  me reason the EP
4940: 5f 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c 61 67  _ExpCollate flag
4950: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75  .** is not commu
4960: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
4970: 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28  oid exprCommute(
4980: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
4990: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75  xpr *pExpr){.  u
49a0: 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28 70  16 expRight = (p
49b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
49c0: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
49d0: 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c  ate);.  u16 expL
49e0: 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c  eft = (pExpr->pL
49f0: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
4a00: 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61  ExpCollate);.  a
4a10: 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70  ssert( allowedOp
4a20: 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70  (pExpr->op) && p
4a30: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20  Expr->op!=TK_IN 
4a40: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
4a50: 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ht->pColl = sqli
4a60: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
4a70: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
4a80: 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  ight);.  pExpr->
4a90: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73  pLeft->pColl = s
4aa0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
4ab0: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
4ac0: 3e 70 4c 65 66 74 29 3b 0a 20 20 53 57 41 50 28  >pLeft);.  SWAP(
4ad0: 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e  CollSeq*,pExpr->
4ae0: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45  pRight->pColl,pE
4af0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c  xpr->pLeft->pCol
4b00: 6c 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69  l);.  pExpr->pRi
4b10: 67 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45  ght->flags = (pE
4b20: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
4b30: 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c  gs & ~EP_ExpColl
4b40: 61 74 65 29 20 7c 20 65 78 70 4c 65 66 74 3b 0a  ate) | expLeft;.
4b50: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
4b60: 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e  flags = (pExpr->
4b70: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 7e  pLeft->flags & ~
4b80: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c  EP_ExpCollate) |
4b90: 20 65 78 70 52 69 67 68 74 3b 0a 20 20 53 57 41   expRight;.  SWA
4ba0: 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70  P(Expr*,pExpr->p
4bb0: 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65  Right,pExpr->pLe
4bc0: 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ft);.  if( pExpr
4bd0: 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op>=TK_GT ){. 
4be0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
4bf0: 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20  ==TK_GT+2 );.   
4c00: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
4c10: 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61  TK_LE+2 );.    a
4c20: 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f  ssert( TK_GT>TK_
4c30: 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
4c40: 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b  ( TK_GT<TK_LE );
4c50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
4c60: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26  pr->op>=TK_GT &&
4c70: 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47   pExpr->op<=TK_G
4c80: 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  E );.    pExpr->
4c90: 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
4ca0: 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54  -TK_GT)^2)+TK_GT
4cb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
4cc0: 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b  ranslate from TK
4cd0: 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  _xx operator to 
4ce0: 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a  WO_xx bitmask..*
4cf0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70 65  /.static u16 ope
4d00: 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70  ratorMask(int op
4d10: 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61 73  ){.  u16 c;.  as
4d20: 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28  sert( allowedOp(
4d30: 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d  op) );.  if( op=
4d40: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20  =TK_IN ){.    c 
4d50: 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65  = WO_IN;.  }else
4d60: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
4d70: 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  LL ){.    c = WO
4d80: 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  _ISNULL;.  }else
4d90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 57  {.    assert( (W
4da0: 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29  O_EQ<<(op-TK_EQ)
4db0: 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20  ) < 0x7fff );.  
4dc0: 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45    c = (u16)(WO_E
4dd0: 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a  Q<<(op-TK_EQ));.
4de0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70    }.  assert( op
4df0: 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63  !=TK_ISNULL || c
4e00: 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==WO_ISNULL );. 
4e10: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
4e20: 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29  IN || c==WO_IN )
4e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
4e40: 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45  TK_EQ || c==WO_E
4e50: 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  Q );.  assert( o
4e60: 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57  p!=TK_LT || c==W
4e70: 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_LT );.  assert
4e80: 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63  ( op!=TK_LE || c
4e90: 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73  ==WO_LE );.  ass
4ea0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c  ert( op!=TK_GT |
4eb0: 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20  | c==WO_GT );.  
4ec0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47  assert( op!=TK_G
4ed0: 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b  E || c==WO_GE );
4ee0: 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a  .  return c;.}..
4ef0: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
4f00: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
4f10: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
4f20: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
4f30: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
4f40: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
4f50: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
4f60: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
4f70: 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20  e iCur and <op> 
4f80: 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65  is one of.** the
4f90: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
4fa0: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
4fb0: 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  by the op parame
4fc0: 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ter..** Return a
4fd0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4fe0: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
4ff0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
5000: 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72  .static WhereTer
5010: 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57  m *findTerm(.  W
5020: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
5030: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
5040: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
5050: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74  earched */.  int
5060: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
5070: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
5080: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
5090: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
50a0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
50b0: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
50c0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
50d0: 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20  ady,     /* RHS 
50e0: 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70  must not overlap
50f0: 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20   with this mask 
5100: 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20  */.  u32 op,    
5110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
5120: 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75  sk of WO_xx valu
5130: 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70  es describing op
5140: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  erator */.  Inde
5150: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
5160: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
5170: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
5180: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
5190: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  NULL */.){.  Whe
51a0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
51b0: 20 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65 72 74   int k;.  assert
51c0: 28 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20 20 6f  ( iCur>=0 );.  o
51d0: 70 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20 20 66  p &= WO_ALL;.  f
51e0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
51f0: 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b   k=pWC->nTerm; k
5200: 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; k--, pTerm++){
5210: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
5220: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
5230: 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72  .       && (pTer
5240: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
5250: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20   notReady)==0.  
5260: 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75       && pTerm->u
5270: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
5280: 6c 75 6d 6e 0a 20 20 20 20 20 20 20 26 26 20 28  lumn.       && (
5290: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
52a0: 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20 29 7b   & op)!=0.    ){
52b0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20  .      if( pIdx 
52c0: 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  && pTerm->eOpera
52d0: 74 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29  tor!=WO_ISNULL )
52e0: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
52f0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
5300: 72 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  r;.        CollS
5310: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
5320: 20 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 0a     char idxaff;.
5330: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
5340: 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50         Parse *pP
5350: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72  arse = pWC->pPar
5360: 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 64 78  se;..        idx
5370: 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  aff = pIdx->pTab
5380: 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
5390: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
53a0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
53b0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
53c0: 70 58 2c 20 69 64 78 61 66 66 29 20 29 20 63 6f  pX, idxaff) ) co
53d0: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20  ntinue;..       
53e0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
53f0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
5400: 75 65 6e 63 65 20 72 65 71 75 69 72 65 64 20 66  uence required f
5410: 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  rom an index for
5420: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 74  .        ** it t
5430: 6f 20 62 65 20 75 73 65 66 75 6c 20 66 6f 72 20  o be useful for 
5440: 6f 70 74 69 6d 69 73 69 6e 67 20 65 78 70 72 65  optimising expre
5450: 73 73 69 6f 6e 20 70 58 2e 20 53 74 6f 72 65 20  ssion pX. Store 
5460: 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
5470: 76 61 6c 75 65 20 69 6e 20 76 61 72 69 61 62 6c  value in variabl
5480: 65 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20 20 20  e pColl..       
5490: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
54a0: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
54b0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
54c0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
54d0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
54e0: 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
54f0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
5500: 20 20 20 61 73 73 65 72 74 28 70 43 6f 6c 6c 20     assert(pColl 
5510: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 29  || pParse->nErr)
5520: 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ;..        for(j
5530: 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  =0; pIdx->aiColu
5540: 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20  mn[j]!=iColumn; 
5550: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
5560: 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64  if( NEVER(j>=pId
5570: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65  x->nColumn) ) re
5580: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
5590: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  }.        if( pC
55a0: 6f 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 53 74  oll && sqlite3St
55b0: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
55c0: 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  me, pIdx->azColl
55d0: 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  [j]) ) continue;
55e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
55f0: 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20  eturn pTerm;.   
5600: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5610: 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  0;.}../* Forward
5620: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
5630: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
5640: 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20  alyze(SrcList*, 
5650: 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e  WhereClause*, in
5660: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  t);../*.** Call 
5670: 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61  exprAnalyze on a
5680: 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48  ll terms in a WH
5690: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a  ERE clause.  .**
56a0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
56b0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  id exprAnalyzeAl
56c0: 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l(.  SrcList *pT
56d0: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  abList,       /*
56e0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
56f0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
5700: 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f  e *pWC         /
5710: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
5720: 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  se to be analyze
5730: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
5740: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
5750: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
5760: 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  ){.    exprAnaly
5770: 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43  ze(pTabList, pWC
5780: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
5790: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
57a0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
57b0: 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ON./*.** Check t
57c0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
57d0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
57e0: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20   a LIKE or GLOB 
57f0: 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a  operator that.**
5800: 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
5810: 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69  d using inequali
5820: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ty constraints. 
5830: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5840: 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20  it is.** so and 
5850: 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
5860: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
5870: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
5880: 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c   be optimizible,
5890: 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65   the RHS must be
58a0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74   a string.** lit
58b0: 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e  eral that does n
58c0: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
58d0: 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73  wildcard.  .*/.s
58e0: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65  tatic int isLike
58f0: 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20  OrGlob(.  Parse 
5900: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
5910: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5920: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5930: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
5940: 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73  xpr,      /* Tes
5950: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
5960: 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61  n */.  int *pnPa
5970: 74 74 65 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d 62  ttern,   /* Numb
5980: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
5990: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
59a0: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ters */.  int *p
59b0: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54  isComplete, /* T
59c0: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
59d0: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
59e0: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
59f0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ter */.  int *pn
5a00: 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72  oCase      /* Tr
5a10: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20  ue if uppercase 
5a20: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
5a30: 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b   lowercase */.){
5a40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5a50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5a60: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f   String on RHS o
5a70: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
5a80: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
5a90: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  t, *pLeft;      
5aa0: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66  /* Right and lef
5ab0: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f  t size of LIKE o
5ac0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
5ad0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
5ae0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
5af0: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74  of operands to t
5b00: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
5b10: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65   /* One characte
5b40: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e  r in z[] */.  in
5b50: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
5b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5b70: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
5b80: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
5b90: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77  ters */.  char w
5ba0: 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[3];           
5bb0: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
5bc0: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
5bd0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5bf0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
5c00: 65 20 66 6f 72 20 4c 48 53 20 2a 2f 0a 20 20 73  e for LHS */.  s
5c10: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5c20: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
5c30: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
5c40: 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69   */..  if( !sqli
5c50: 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f  te3IsLikeFunctio
5c60: 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f  n(db, pExpr, pno
5c70: 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20  Case, wc) ){.   
5c80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
5c90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43  ifdef SQLITE_EBC
5ca0: 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61  DIC.  if( *pnoCa
5cb0: 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  se ) return 0;.#
5cc0: 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20  endif.  pList = 
5cd0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
5ce0: 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74    pRight = pList
5cf0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
5d00: 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d  if( pRight->op!=
5d10: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
5d20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5d30: 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e   pLeft = pList->
5d40: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[1].pExpr;.  if
5d50: 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f  ( pLeft->op!=TK_
5d60: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65  COLUMN ){.    re
5d70: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43  turn 0;.  }.  pC
5d80: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
5d90: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
5da0: 20 70 4c 65 66 74 29 3b 0a 20 20 61 73 73 65 72   pLeft);.  asser
5db0: 74 28 20 70 43 6f 6c 6c 21 3d 30 20 7c 7c 20 70  t( pColl!=0 || p
5dc0: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d  Left->iColumn==-
5dd0: 31 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  1 );.  if( pColl
5de0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  ==0 ){.    /* No
5df0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 73 20 64 65   collation is de
5e00: 66 69 6e 65 64 20 66 6f 72 20 74 68 65 20 52 4f  fined for the RO
5e10: 57 49 44 2e 20 20 55 73 65 20 74 68 65 20 64 65  WID.  Use the de
5e20: 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 43  fault. */.    pC
5e30: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
5e40: 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  oll;.  }.  if( (
5e50: 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c  pColl->type!=SQL
5e60: 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20  ITE_COLL_BINARY 
5e70: 7c 7c 20 2a 70 6e 6f 43 61 73 65 29 20 26 26 0a  || *pnoCase) &&.
5e80: 20 20 20 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79        (pColl->ty
5e90: 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  pe!=SQLITE_COLL_
5ea0: 4e 4f 43 41 53 45 20 7c 7c 20 21 2a 70 6e 6f 43  NOCASE || !*pnoC
5eb0: 61 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ase) ){.    retu
5ec0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
5ed0: 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 64  te3DequoteExpr(d
5ee0: 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7a 20  b, pRight);.  z 
5ef0: 3d 20 28 63 68 61 72 20 2a 29 70 52 69 67 68 74  = (char *)pRight
5f00: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 63 6e 74  ->token.z;.  cnt
5f10: 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 20 29 7b   = 0;.  if( z ){
5f20: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
5f30: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
5f40: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
5f50: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
5f60: 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20   cnt++; }.  }.  
5f70: 69 66 28 20 63 6e 74 3d 3d 30 20 7c 7c 20 32 35  if( cnt==0 || 25
5f80: 35 3d 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20  5==(u8)z[cnt-1] 
5f90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
5fa0: 0a 20 20 7d 0a 20 20 2a 70 69 73 43 6f 6d 70 6c  .  }.  *pisCompl
5fb0: 65 74 65 20 3d 20 7a 5b 63 6e 74 5d 3d 3d 77 63  ete = z[cnt]==wc
5fc0: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
5fd0: 3d 30 3b 0a 20 20 2a 70 6e 50 61 74 74 65 72 6e  =0;.  *pnPattern
5fe0: 20 3d 20 63 6e 74 3b 0a 20 20 72 65 74 75 72 6e   = cnt;.  return
5ff0: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
6000: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
6010: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
6020: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
6030: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
6040: 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  BLE./*.** Check 
6050: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
6060: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
6070: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
6080: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75  .**         colu
6090: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a  mn MATCH expr.**
60a0: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68 65  .** If it is the
60b0: 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  n return TRUE.  
60c0: 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46  If not, return F
60d0: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
60e0: 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c  int isMatchOfCol
60f0: 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78  umn(.  Expr *pEx
6100: 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20  pr      /* Test 
6110: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
6120: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  */.){.  ExprList
6130: 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20   *pList;..  if( 
6140: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55  pExpr->op!=TK_FU
6150: 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65  NCTION ){.    re
6160: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
6170: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  ( pExpr->token.n
6180: 21 3d 35 20 7c 7c 0a 20 20 20 20 20 20 20 73 71  !=5 ||.       sq
6190: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
61a0: 6f 6e 73 74 20 63 68 61 72 2a 29 70 45 78 70 72  onst char*)pExpr
61b0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 74 63 68  ->token.z,"match
61c0: 22 2c 35 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ",5)!=0 ){.    r
61d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
61e0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
61f0: 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69  pList;.  if( pLi
6200: 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a  st->nExpr!=2 ){.
6210: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6220: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61  }.  if( pList->a
6230: 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d  [1].pExpr->op !=
6240: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20   TK_COLUMN ){.  
6250: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6260: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
6270: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6280: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
6290: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68   */../*.** If th
62a0: 65 20 70 42 61 73 65 20 65 78 70 72 65 73 73 69  e pBase expressi
62b0: 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  on originated in
62c0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
62d0: 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20   clause of.** a 
62e0: 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73  join, then trans
62f0: 66 65 72 20 74 68 65 20 61 70 70 72 6f 70 72 69  fer the appropri
6300: 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65  ate markings ove
6310: 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f  r to derived..*/
6320: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61  .static void tra
6330: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
6340: 73 28 45 78 70 72 20 2a 70 44 65 72 69 76 65 64  s(Expr *pDerived
6350: 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a  , Expr *pBase){.
6360: 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67    pDerived->flag
6370: 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67  s |= pBase->flag
6380: 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b  s & EP_FromJoin;
6390: 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69  .  pDerived->iRi
63a0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
63b0: 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Base->iRightJoin
63c0: 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64  Table;.}..#if !d
63d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
63e0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
63f0: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
6400: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
6410: 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  UERY)./*.** Anal
6420: 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20  yze a term that 
6430: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20  consists of two 
6440: 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65  or more OR-conne
6450: 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73  cted.** subterms
6460: 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20  .  So in:.**.** 
6470: 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28      ... WHERE  (
6480: 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52  a=5) AND (b=7 OR
6490: 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e   c=9 OR d=13) AN
64a0: 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20  D (d=13).**     
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e       ^^^^^^^^^^^
64d0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20  ^^^^^^^^^.**.** 
64e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61  This routine ana
64f0: 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68  lyzes terms such
6500: 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74   as the middle t
6510: 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65  erm in the above
6520: 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57   example..** A W
6530: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
6540: 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  t is computed an
6550: 64 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  d attached to th
6560: 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20  e term under.** 
6570: 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64  analysis, regard
6580: 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63  less of the outc
6590: 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79  ome of the analy
65a0: 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a  sis.  Hence:.**.
65b0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
65c0: 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54  .wtFlags   |=  T
65d0: 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20  ERM_ORINFO.**   
65e0: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
65f0: 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61  rInfo  =  a dyna
6600: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
6610: 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62  d WhereOrTerm ob
6620: 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ject.**.** The t
6630: 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
6640: 65 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f  ed must have two
6650: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63   or more of OR-c
6660: 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d  onnected subterm
6670: 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73  s..** A single s
6680: 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20  ubterm might be 
6690: 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e  a set of AND-con
66a0: 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65  nected sub-subte
66b0: 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  rms..** Examples
66c0: 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20   of terms under 
66d0: 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20  analysis:.**.** 
66e0: 20 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78      (A)     t1.x
66f0: 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32  =t2.y OR t1.x=t2
6700: 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52  .z OR t1.y=15 OR
6710: 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20   t1.z=t3.a+5.** 
6720: 20 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78      (B)     x=ex
6730: 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f  pr1 OR expr2=x O
6740: 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20  R x=expr3.**    
6750: 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (C)     t1.x=t2
6760: 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a  .y OR (t1.x=t2.z
6770: 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a   AND t1.y=15).**
6780: 20 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65       (D)     x=e
6790: 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e  xpr1 OR (y>11 AN
67a0: 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b  D y<22 AND z LIK
67b0: 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20  E '*hello*').** 
67c0: 20 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61      (E)     (p.a
67d0: 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44  =1 AND q.b=2 AND
67e0: 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d   r.c=3) OR (p.x=
67f0: 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20  4 AND q.y=5 AND 
6800: 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53  r.z=6).**.** CAS
6810: 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 1:.**.** If al
6820: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f  l subterms are o
6830: 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65  f the form T.C=e
6840: 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  xpr for some sin
6850: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 0a  gle column of C.
6860: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ** a single tabl
6870: 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e  e T (as shown in
6880: 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65   example B above
6890: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  ) then create a 
68a0: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
68b0: 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65  erm that is an e
68c0: 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70  quivalent IN exp
68d0: 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  ression.  In oth
68e0: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
68f0: 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61   term.** being a
6900: 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a  nalyzed is:.**.*
6910: 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72 31  *      x = expr1
6920: 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20    OR  expr2 = x 
6930: 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a   OR  x = expr3.*
6940: 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65  *.** then create
6950: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
6960: 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  erm like this:.*
6970: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
6980: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
6990: 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a  3).**.** CASE 2:
69a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
69b0: 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78  bterms are index
69c0: 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65  able by a single
69d0: 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73   table T, then s
69e0: 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  et.**.**     Whe
69f0: 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72  reTerm.eOperator
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
6a10: 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68   WO_OR.**     Wh
6a20: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
6a30: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d  o->indexable  |=
6a40: 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    the cursor num
6a50: 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a  ber for table T.
6a60: 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  **.** A subterm 
6a70: 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69  is "indexable" i
6a80: 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20 66  f it is of the f
6a90: 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e  orm.** "T.C <op>
6aa0: 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 43   <expr>" where C
6ab0: 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f   is any column o
6ac0: 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a  f table T and .*
6ad0: 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  * <op> is one of
6ae0: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c   "=", "<", "<=",
6af0: 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20   ">", ">=", "IS 
6b00: 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a  NULL", or "IN"..
6b10: 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20  ** A subterm is 
6b20: 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69  also indexable i
6b30: 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f  f it is an AND o
6b40: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  f two or more.**
6b50: 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74 20   subsubterms at 
6b60: 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69  least one of whi
6b70: 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e  ch is indexable.
6b80: 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20    Indexable AND 
6b90: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76  .** subterms hav
6ba0: 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f  e their eOperato
6bb0: 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20  r set to WO_AND 
6bc0: 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a  and they have.**
6bd0: 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20   u.pAndInfo set 
6be0: 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  to a dynamically
6bf0: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
6c00: 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a  AndTerm object..
6c10: 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68  **.** From anoth
6c20: 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77  er point of view
6c30: 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65  , "indexable" me
6c40: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75 62  ans that the sub
6c50: 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f  term could.** po
6c60: 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65  tentially be use
6c70: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
6c80: 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  if an appropriat
6c90: 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a  e index exists..
6ca0: 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  ** This analysis
6cb0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64   does not consid
6cc0: 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  er whether or no
6cd0: 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69 73  t the index exis
6ce0: 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 73  ts; that.** is s
6cf0: 6f 6d 65 74 68 69 6e 67 20 74 68 65 20 62 65 73  omething the bes
6d00: 74 49 6e 64 65 78 28 29 20 72 6f 75 74 69 6e 65  tIndex() routine
6d10: 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65 2e   will determine.
6d20: 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 0a    This analysis.
6d30: 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74  ** only looks at
6d40: 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d   whether subterm
6d50: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
6d60: 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74  r indexing exist
6d70: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d  ..**.** All exam
6d80: 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20 45  ples A through E
6d90: 20 61 62 6f 76 65 20 61 6c 6c 20 73 61 74 69 73   above all satis
6da0: 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74 20  fy case 2.  But 
6db0: 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73  if a term.** als
6dc0: 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61 73  o statisfies cas
6dd0: 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29 20  e 1 (such as B) 
6de0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
6df0: 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a   optimizer will.
6e00: 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65 72  ** always prefer
6e10: 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74   case 1, so in t
6e20: 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65 74  hat case we pret
6e30: 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32 20  end that case 2 
6e40: 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66  is not.** satisf
6e50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69  ied..**.** It mi
6e60: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
6e70: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61  that multiple ta
6e80: 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61 62  bles are indexab
6e90: 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
6ea0: 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69  ,.** (E) above i
6eb0: 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74  s indexable on t
6ec0: 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20  ables P, Q, and 
6ed0: 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74  R..**.** Terms t
6ee0: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
6ef0: 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74 65   2 are candidate
6f00: 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20  s for lookup by 
6f10: 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74  using.** separat
6f20: 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e  e indices to fin
6f30: 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63  d rowids for eac
6f40: 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f  h subterm and co
6f50: 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75  mposing.** the u
6f60: 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69  nion of all rowi
6f70: 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65  ds using a RowSe
6f80: 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
6f90: 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f  is similar.** to
6fa0: 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73   "bitmap indices
6fb0: 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62  " in other datab
6fc0: 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a  ase engines..**.
6fd0: 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a  ** OTHERWISE:.**
6fe0: 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63  .** If neither c
6ff0: 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32  ase 1 nor case 2
7000: 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61   apply, then lea
7010: 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72  ve the eOperator
7020: 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e   set to.** zero.
7030: 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e    This term is n
7040: 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65  ot useful for se
7050: 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  arch..*/.static 
7060: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
7070: 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73  OrTerm(.  SrcLis
7080: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
7090: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
70a0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
70b0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
70c0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d        /* the com
70d0: 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61 75  plete WHERE clau
70e0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54  se */.  int idxT
70f0: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
7100: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
7110: 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20  e OR-term to be 
7120: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
7130: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
7140: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20   pWC->pParse;   
7150: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
7160: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
7170: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7180: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
7190: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
71a0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
71b0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
71c0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
71d0: 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54  dxTerm];    /* T
71e0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
71f0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72  alyzed */.  Expr
7200: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
7210: 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  >pExpr;         
7220: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
7230: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72  ssion of the ter
7240: 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  m */.  WhereMask
7250: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 3d 20  Set *pMaskSet = 
7260: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 20 2f  pWC->pMaskSet; /
7270: 2a 20 54 61 62 6c 65 20 75 73 65 20 6d 61 73 6b  * Table use mask
7280: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72b0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
72c0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
72d0: 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f   *pOrWc;       /
72e0: 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65  * Breakup of pTe
72f0: 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  rm into subterms
7300: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
7310: 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20  *pOrTerm;       
7320: 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69  /* A Sub-term wi
7330: 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a  thin the pOrWc *
7340: 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  /.  WhereOrInfo 
7350: 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a  *pOrInfo;     /*
7360: 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   Additional info
7370: 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  rmation associat
7380: 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f  ed with pTerm */
7390: 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54  .  Bitmask chngT
73a0: 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oIN;         /* 
73b0: 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  Tables that migh
73c0: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31  t satisfy case 1
73d0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e   */.  Bitmask in
73e0: 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20  dexable;        
73f0: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 61  /* Tables that a
7400: 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61  re indexable, sa
7410: 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32 20  tisfying case 2 
7420: 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72  */..  /*.  ** Br
7430: 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73  eak the OR claus
7440: 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72  e into its separ
7450: 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54  ate subterms.  T
7460: 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a  he subterms are.
7470: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
7480: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
7490: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
74a0: 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68 65  g within the Whe
74b0: 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62  reOrInfo.  ** ob
74c0: 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74 74  ject that is att
74d0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69  ached to the ori
74e0: 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20  ginal OR clause 
74f0: 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  term..  */.  ass
7500: 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
7510: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e  lags & (TERM_DYN
7520: 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  AMIC|TERM_ORINFO
7530: 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d  |TERM_ANDINFO))=
7540: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7550: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
7560: 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70   );.  pTerm->u.p
7570: 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f  OrInfo = pOrInfo
7580: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7590: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
75a0: 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20  f(*pOrInfo));.  
75b0: 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29  if( pOrInfo==0 )
75c0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d   return;.  pTerm
75d0: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
75e0: 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57  M_ORINFO;.  pOrW
75f0: 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63  c = &pOrInfo->wc
7600: 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
7610: 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 43 2d 3e  nit(pOrWc, pWC->
7620: 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74  pParse, pMaskSet
7630: 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28  );.  whereSplit(
7640: 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b  pOrWc, pExpr, TK
7650: 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c  _OR);.  exprAnal
7660: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72  yzeAll(pSrc, pOr
7670: 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  Wc);.  if( db->m
7680: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
7690: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
76a0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20  pOrWc->nTerm>=2 
76b0: 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f  );..  /*.  ** Co
76c0: 6d 70 75 74 65 20 74 68 65 20 73 65 74 20 6f 66  mpute the set of
76d0: 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   tables that mig
76e0: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 73  ht satisfy cases
76f0: 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20   1 or 2..  */.  
7700: 69 6e 64 65 78 61 62 6c 65 20 3d 20 63 68 6e 67  indexable = chng
7710: 54 6f 49 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b  ToIN = ~(Bitmask
7720: 29 30 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57  )0;.  for(i=pOrW
7730: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
7740: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
7750: 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b  =0 && indexable;
7760: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
7770: 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54 65  {.    if( (pOrTe
7780: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7790: 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b  WO_SINGLE)==0 ){
77a0: 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64 49  .      WhereAndI
77b0: 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20  nfo *pAndInfo;. 
77c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
77d0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
77e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
77f0: 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74  rt( (pOrTerm->wt
7800: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e  Flags & (TERM_AN
7810: 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46  DINFO|TERM_ORINF
7820: 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  O))==0 );.      
7830: 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  chngToIN = 0;.  
7840: 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73      pAndInfo = s
7850: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7860: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41  w(db, sizeof(*pA
7870: 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  ndInfo));.      
7880: 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a  if( pAndInfo ){.
7890: 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
78a0: 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20  use *pAndWC;.   
78b0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
78c0: 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20  pAndTerm;.      
78d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
78e0: 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a   Bitmask b = 0;.
78f0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
7900: 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41  >u.pAndInfo = pA
7910: 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ndInfo;.        
7920: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
7930: 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   |= TERM_ANDINFO
7940: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
7950: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
7960: 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70  O_AND;.        p
7970: 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66  AndWC = &pAndInf
7980: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77  o->wc;.        w
7990: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70  hereClauseInit(p
79a0: 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 50 61 72  AndWC, pWC->pPar
79b0: 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20  se, pMaskSet);. 
79c0: 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69         whereSpli
79d0: 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72  t(pAndWC, pOrTer
79e0: 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44  m->pExpr, TK_AND
79f0: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
7a00: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
7a10: 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20  pAndWC);.       
7a20: 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d   testcase( db->m
7a30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7a40: 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e         if( !db->
7a50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
7a60: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
7a70: 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64  0, pAndTerm=pAnd
7a80: 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d  WC->a; j<pAndWC-
7a90: 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e  >nTerm; j++, pAn
7aa0: 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  dTerm++){.      
7ab0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41        assert( pA
7ac0: 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b  ndTerm->pExpr );
7ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7ae0: 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54   allowedOp(pAndT
7af0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20  erm->pExpr->op) 
7b00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
7b10: 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d   b |= getMask(pM
7b20: 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d  askSet, pAndTerm
7b30: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
7b40: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7b50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7b60: 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78   }.        index
7b70: 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20  able &= b;.     
7b80: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
7b90: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
7ba0: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
7bb0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70  ){.      /* Skip
7bc0: 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e   this term for n
7bd0: 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74 20  ow.  We revisit 
7be0: 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65  it when we proce
7bf0: 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ss the.      ** 
7c00: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45  corresponding TE
7c10: 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20  RM_VIRTUAL term 
7c20: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
7c30: 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20      Bitmask b;. 
7c40: 20 20 20 20 20 62 20 3d 20 67 65 74 4d 61 73 6b       b = getMask
7c50: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  (pMaskSet, pOrTe
7c60: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  rm->leftCursor);
7c70: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
7c80: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
7c90: 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20  RM_VIRTUAL ){.  
7ca0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
7cb0: 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63  *pOther = &pOrWc
7cc0: 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61  ->a[pOrTerm->iPa
7cd0: 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62  rent];.        b
7ce0: 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73   |= getMask(pMas
7cf0: 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65  kSet, pOther->le
7d00: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
7d10: 20 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62   }.      indexab
7d20: 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69  le &= b;.      i
7d30: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  f( pOrTerm->eOpe
7d40: 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a  rator!=WO_EQ ){.
7d50: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
7d60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
7d70: 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54  e{.        chngT
7d80: 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20  oIN &= b;.      
7d90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
7da0: 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68  *.  ** Record th
7db0: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
7dc0: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
7dd0: 65 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69  e 2.  The set mi
7de0: 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74  ght be.  ** empt
7df0: 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66  y..  */.  pOrInf
7e00: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69  o->indexable = i
7e10: 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72  ndexable;.  pTer
7e20: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69  m->eOperator = i
7e30: 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20  ndexable==0 ? 0 
7e40: 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20  : WO_OR;..  /*. 
7e50: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c   ** chngToIN hol
7e60: 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c  ds a set of tabl
7e70: 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20  es that *might* 
7e80: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20  satisfy case 1. 
7e90: 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76   But.  ** we hav
7ea0: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64  e to do some add
7eb0: 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67  itional checking
7ec0: 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20   to see if case 
7ed0: 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73  1 really.  ** is
7ee0: 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2f   satisfied..  */
7ef0: 0a 20 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20  .  if( chngToIN 
7f00: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43  ){.    int okToC
7f10: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20  hngToIN = 0;    
7f20: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
7f30: 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e  conversion to IN
7f40: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20   is valid */.   
7f50: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d   int iColumn = -
7f60: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  1;         /* Co
7f70: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68  lumn index on lh
7f80: 73 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  s of IN operator
7f90: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72   */.    int iCur
7fa0: 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  sor = -1;       
7fb0: 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f    /* Table curso
7fc0: 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  r common to all 
7fd0: 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74  terms */.    int
7fe0: 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   j = 0;         
7ff0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8000: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  ounter */..    /
8010: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
8020: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  able and column 
8030: 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20  that appears on 
8040: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a  one side or the.
8050: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20      ** other of 
8060: 74 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20  the == operator 
8070: 69 6e 20 65 76 65 72 79 20 73 75 62 74 65 72 6d  in every subterm
8080: 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e  .  That table an
8090: 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20  d column.    ** 
80a0: 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64  will be recorded
80b0: 20 69 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20   in iCursor and 
80c0: 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20  iColumn.  There 
80d0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79  might not be any
80e0: 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62  .    ** such tab
80f0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20  le and column.  
8100: 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  Set okToChngToIN
8110: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
8120: 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  te table.    ** 
8130: 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f  and column is fo
8140: 75 6e 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b  und but leave ok
8150: 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65  ToChngToIN false
8160: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
8170: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d     */.    for(j=
8180: 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43  0; j<2 && !okToC
8190: 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20  hngToIN; j++){. 
81a0: 20 20 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70       pOrTerm = p
81b0: 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66  OrWc->a;.      f
81c0: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
81d0: 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  m-1; i>=0; i--, 
81e0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
81f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
8200: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
8210: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
8220: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
8230: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
8240: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
8250: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8260: 72 3d 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  r==iColumn ) con
8270: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
8280: 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67  f( (chngToIN & g
8290: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
82a0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
82b0: 72 73 6f 72 29 29 3d 3d 30 20 29 20 63 6f 6e 74  rsor))==0 ) cont
82c0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 43  inue;.        iC
82d0: 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d  olumn = pOrTerm-
82e0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
82f0: 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d         iCursor =
8300: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
8310: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62 72  rsor;.        br
8320: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8330: 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20     if( i<0 ){.  
8340: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
8350: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
8360: 73 65 72 74 28 20 28 63 68 6e 67 54 6f 49 4e 26  sert( (chngToIN&
8370: 28 63 68 6e 67 54 6f 49 4e 2d 31 29 29 3d 3d 30  (chngToIN-1))==0
8380: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8390: 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65  rt( chngToIN==ge
83a0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
83b0: 69 43 6f 6c 75 6d 6e 29 20 29 3b 0a 20 20 20 20  iColumn) );.    
83c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
83d0: 20 7d 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e   }.      okToChn
83e0: 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20  gToIN = 1;.     
83f0: 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f   for(; i>=0 && o
8400: 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d  kToChngToIN; i--
8410: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
8420: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
8430: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
8440: 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==WO_EQ );.     
8450: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
8460: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
8470: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
8480: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
8490: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
84a0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
84b0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  if( pOrTerm->u.l
84c0: 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  eftColumn!=iColu
84d0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
84e0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
84f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
8500: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
8510: 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74  ffLeft, affRight
8520: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;.          /* I
8530: 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  f the right-hand
8540: 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20   side is also a 
8550: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65  column, then the
8560: 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20   affinities.    
8570: 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68        ** of both
8580: 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   right and left 
8590: 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75  sides must be su
85a0: 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a  ch that no type.
85b0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
85c0: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71  versions are req
85d0: 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67  uired on the rig
85e0: 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32  ht.  (Ticket #22
85f0: 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  49).          */
8600: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69  .          affRi
8610: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
8620: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
8630: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
8640: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  );.          aff
8650: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
8660: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
8670: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
8680: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8690: 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20   affRight!=0 && 
86a0: 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66  affRight!=affLef
86b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
86c0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
86d0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
86e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
86f0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8700: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
8710: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8720: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8730: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
8740: 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43  his point, okToC
8750: 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20  hngToIN is true 
8760: 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72  if original pTer
8770: 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20  m satisfies.    
8780: 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74  ** case 1.  In t
8790: 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72  hat case, constr
87a0: 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61  uct a new virtua
87b0: 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a  l term that is .
87c0: 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e      ** pTerm con
87d0: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49  verted into an I
87e0: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
87f0: 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43  */.    if( okToC
8800: 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20  hngToIN ){.     
8810: 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20   Expr *pDup;    
8820: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61          /* A tra
8830: 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65  nsient duplicate
8840: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
8850: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
8860: 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54  List = 0;   /* T
8870: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
8880: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
8890: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
88a0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65   0;       /* The
88b0: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
88c0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
88d0: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
88e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
88f0: 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61  omplete IN opera
8900: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  tor */..      fo
8910: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
8920: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
8930: 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  c->a; i>=0; i--,
8940: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
8950: 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
8960: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8970: 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f  M_OR_OK)==0 ) co
8980: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8990: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
89a0: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45  >eOperator==WO_E
89b0: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Q );.        ass
89c0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  ert( pOrTerm->le
89d0: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
89e0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  r );.        ass
89f0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e  ert( pOrTerm->u.
8a00: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
8a10: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  umn );.        p
8a20: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
8a30: 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d  rDup(db, pOrTerm
8a40: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
8a50: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69   0);.        pLi
8a60: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
8a70: 4c 69 73 74 41 70 70 65 6e 64 28 70 57 43 2d 3e  ListAppend(pWC->
8a80: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70  pParse, pList, p
8a90: 44 75 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Dup, 0);.       
8aa0: 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d   pLeft = pOrTerm
8ab0: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  ->pExpr->pLeft;.
8ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
8ad0: 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29  sert( pLeft!=0 )
8ae0: 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73  ;.      pDup = s
8af0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
8b00: 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
8b10: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
8b20: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 2c  3Expr(db, TK_IN,
8b30: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
8b40: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
8b50: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
8b60: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
8b70: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
8b80: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
8b90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
8ba0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8bb0: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
8bc0: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ct) );.        p
8bd0: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
8be0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
8bf0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
8c00: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
8c10: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
8c20: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
8c30: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
8c40: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
8c50: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
8c60: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
8c70: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
8c80: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
8c90: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
8ca0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
8cb0: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
8cc0: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
8cd0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
8ce0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8cf0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
8d00: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
8d10: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
8d20: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
8d30: 74 6f 72 20 3d 20 30 3b 20 20 2f 2a 20 63 61 73  tor = 0;  /* cas
8d40: 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20  e 1 trumps case 
8d50: 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  2 */.    }.  }.}
8d60: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
8d70: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
8d80: 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49  IZATION && !SQLI
8d90: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
8da0: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   */.../*.** The 
8db0: 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
8dc0: 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72  utine is an Wher
8dd0: 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20  eTerm structure 
8de0: 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  with only the.**
8df0: 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66   "pExpr" field f
8e00: 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a  illed in.  The j
8e10: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
8e20: 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65  ne is to analyze
8e30: 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65   the.** subexpre
8e40: 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61  ssion and popula
8e50: 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  te all the other
8e60: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57   fields of the W
8e70: 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75  hereTerm.** stru
8e80: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
8e90: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
8ea0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  s of the form "<
8eb0: 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74  expr> <op> X" it
8ec0: 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a   gets commuted.*
8ed0: 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72  * to the standar
8ee0: 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70  d form of "X <op
8ef0: 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a  > <expr>"..**.**
8f00: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
8f10: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
8f20: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
8f30: 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20  re both X and Y 
8f40: 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20  are.** columns, 
8f50: 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  then the origina
8f60: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  l expression is 
8f70: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
8f80: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
8f90: 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
8fa0: 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64  "Y <op> X" is ad
8fb0: 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45  ded to the WHERE
8fc0: 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61   clause and.** a
8fd0: 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65  nalyzed separate
8fe0: 6c 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61  ly.  The origina
8ff0: 6c 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64  l term is marked
9000: 20 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45   with TERM_COPIE
9010: 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77  D.** and the new
9020: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
9030: 77 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49  with TERM_DYNAMI
9040: 43 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20  C (because it's 
9050: 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74  pExpr.** needs t
9060: 6f 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20  o be freed with 
9070: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29  the WhereClause)
9080: 20 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41   and TERM_VIRTUA
9090: 4c 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a  L (because it.**
90a0: 20 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63   is a commuted c
90b0: 6f 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74  opy of a prior t
90c0: 65 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69  erm.)  The origi
90d0: 6e 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68  nal term has nCh
90e0: 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65  ild=1.** and the
90f0: 20 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72   copy has idxPar
9100: 65 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69  ent set to the i
9110: 6e 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67  ndex of the orig
9120: 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74  inal term..*/.st
9130: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
9140: 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74  alyze(.  SrcList
9150: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
9160: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
9170: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
9180: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
9190: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
91a0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
91b0: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
91c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
91d0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20   of the term to 
91e0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
91f0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
9200: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
9210: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d       /* The term
9220: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
9230: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
9240: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
9250: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
9260: 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b  table index mask
9270: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  s */.  Expr *pEx
9280: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
9290: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
92a0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
92b0: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69  analyzed */.  Bi
92c0: 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74  tmask prereqLeft
92d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
92e0: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
92f0: 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c  of the pExpr->pL
9300: 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  eft */.  Bitmask
9310: 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20   prereqAll;     
9320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
9330: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70 45  requesites of pE
9340: 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  xpr */.  Bitmask
9350: 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b   extraRight = 0;
9360: 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b  .  int nPattern;
9370: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74  .  int isComplet
9380: 65 3b 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b  e;.  int noCase;
9390: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c      /* Top-level
93c0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70   operator.  pExp
93d0: 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65  r->op */.  Parse
93e0: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
93f0: 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 50  pParse;     /* P
9400: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
9410: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
9420: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
9430: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
9440: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
9450: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
9460: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
9470: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72  turn;.  }.  pTer
9480: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
9490: 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74  erm];.  pMaskSet
94a0: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
94b0: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
94c0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 70 72 65 72  m->pExpr;.  prer
94d0: 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62  eqLeft = exprTab
94e0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
94f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
9500: 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
9510: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
9520: 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  IN ){.    assert
9530: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
9540: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78  =0 );.    if( Ex
9550: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
9560: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
9570: 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  t) ){.      pTer
9580: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
9590: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
95a0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
95b0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
95c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
95d0: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
95e0: 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73  qRight = exprLis
95f0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
9600: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  kSet, pExpr->x.p
9610: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
9620: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
9630: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54  ISNULL ){.    pT
9640: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
9650: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
9660: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
9670: 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c  Right = exprTabl
9680: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
9690: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
96a0: 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c  .  }.  prereqAll
96b0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
96c0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
96d0: 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  r);.  if( ExprHa
96e0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
96f0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
9700: 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d  .    Bitmask x =
9710: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
9720: 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  t, pExpr->iRight
9730: 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20  JoinTable);.    
9740: 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a  prereqAll |= x;.
9750: 20 20 20 20 65 78 74 72 61 52 69 67 68 74 20 3d      extraRight =
9760: 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61   x-1;  /* ON cla
9770: 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f  use terms may no
9780: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
9790: 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  n index.        
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
97b0: 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20  * on left table 
97c0: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
97d0: 20 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f   Ticket #3015 */
97e0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72  .  }.  pTerm->pr
97f0: 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71  ereqAll = prereq
9800: 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65  All;.  pTerm->le
9810: 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  ftCursor = -1;. 
9820: 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20   pTerm->iParent 
9830: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65  = -1;.  pTerm->e
9840: 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20  Operator = 0;.  
9850: 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70  if( allowedOp(op
9860: 29 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65  ) && (pTerm->pre
9870: 72 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65  reqRight & prere
9880: 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20  qLeft)==0 ){.   
9890: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
98a0: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
98b0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
98c0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
98d0: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
98e0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
98f0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74       pTerm->left
9900: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
9910: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54  iTable;.      pT
9920: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
9930: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
9940: 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  mn;.      pTerm-
9950: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65  >eOperator = ope
9960: 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20  ratorMask(op);. 
9970: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
9980: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
9990: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
99a0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
99b0: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
99c0: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69  r *pDup;.      i
99d0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
99e0: 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rsor>=0 ){.     
99f0: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
9a00: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
9a10: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9a20: 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
9a30: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
9a40: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
9a50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9a60: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70  rDelete(db, pDup
9a70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
9a80: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
9a90: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
9aa0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
9ab0: 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52  t(pWC, pDup, TER
9ac0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
9ad0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
9ae0: 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29   if( idxNew==0 )
9af0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
9b00: 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b   pNew = &pWC->a[
9b10: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20  idxNew];.       
9b20: 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d   pNew->iParent =
9b30: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
9b40: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
9b50: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
9b60: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
9b70: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  d = 1;.        p
9b80: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
9b90: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
9ba0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9bb0: 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b     pDup = pExpr;
9bc0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
9bd0: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
9be0: 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65       exprCommute
9bf0: 28 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a  (pParse, pDup);.
9c00: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44        pLeft = pD
9c10: 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  up->pLeft;.     
9c20: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
9c30: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
9c40: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
9c50: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
9c60: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
9c70: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
9c80: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65  Right = prereqLe
9c90: 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ft;.      pNew->
9ca0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72  prereqAll = prer
9cb0: 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65  eqAll;.      pNe
9cc0: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f  w->eOperator = o
9cd0: 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70  peratorMask(pDup
9ce0: 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->op);.    }.  }
9cf0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9d00: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
9d10: 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  TIMIZATION.  /* 
9d20: 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65  If a term is the
9d30: 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
9d40: 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65  r, create two ne
9d50: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a  w virtual terms.
9d60: 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65    ** that define
9d70: 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20   the range that 
9d80: 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c  the BETWEEN impl
9d90: 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61  ements.  For exa
9da0: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
9db0: 20 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62       a BETWEEN b
9dc0: 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a   AND c.  **.  **
9dd0: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   is converted in
9de0: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
9df0: 20 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20     (a BETWEEN b 
9e00: 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62  AND c) AND (a>=b
9e10: 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a  ) AND (a<=c).  *
9e20: 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e  *.  ** The two n
9e30: 65 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64  ew terms are add
9e40: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
9e50: 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  of the WhereClau
9e60: 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20  se object..  ** 
9e70: 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72  The new terms ar
9e80: 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20  e "dynamic" and 
9e90: 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  are children of 
9ea0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54  the original BET
9eb0: 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20  WEEN.  ** term. 
9ec0: 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   That means that
9ed0: 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
9ee0: 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74  term is coded, t
9ef0: 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a  he children are.
9f00: 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f    ** skipped.  O
9f10: 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72  r, if the childr
9f20: 65 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64  en are satisfied
9f30: 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68   by an index, th
9f40: 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
9f50: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
9f60: 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
9f70: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
9f80: 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26  op==TK_BETWEEN &
9f90: 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  & pWC->op==TK_AN
9fa0: 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  D ){.    ExprLis
9fb0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
9fc0: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69  ->x.pList;.    i
9fd0: 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63  nt i;.    static
9fe0: 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20   const u8 ops[] 
9ff0: 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d  = {TK_GE, TK_LE}
a000: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
a010: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ist!=0 );.    as
a020: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
a030: 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72  pr==2 );.    for
a040: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
a050: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
a060: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  wExpr;.      int
a070: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70   idxNew;.      p
a080: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
a090: 33 45 78 70 72 28 64 62 2c 20 6f 70 73 5b 69 5d  3Expr(db, ops[i]
a0a0: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
a0b0: 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
a0c0: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
a0f0: 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
a100: 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29  i].pExpr, 0), 0)
a110: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
a120: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
a130: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
a140: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
a150: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
a160: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
a170: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
a180: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
a190: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
a1a0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
a1b0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
a1c0: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
a1d0: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
a1e0: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  idxTerm;.    }. 
a1f0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
a200: 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 2;.  }.#endif
a210: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
a220: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
a230: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65  TION */..#if !de
a240: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a250: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
a260: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
a270: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
a280: 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  ERY).  /* Analyz
a290: 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73  e a term that is
a2a0: 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f   composed of two
a2b0: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
a2c0: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  s connected by. 
a2d0: 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74   ** an OR operat
a2e0: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  or..  */.  else 
a2f0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
a300: 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65  K_OR ){.    asse
a310: 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  rt( pWC->op==TK_
a320: 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41  AND );.    exprA
a330: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72  nalyzeOrTerm(pSr
a340: 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29  c, pWC, idxTerm)
a350: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
a360: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
a370: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
a380: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a390: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
a3a0: 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63  ATION.  /* Add c
a3b0: 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65  onstraints to re
a3c0: 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20  duce the search 
a3d0: 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20  space on a LIKE 
a3e0: 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65  or GLOB.  ** ope
a3f0: 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rator..  **.  **
a400: 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20   A like pattern 
a410: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c  of the form "x L
a420: 49 4b 45 20 27 61 62 63 25 27 22 20 69 73 20 63  IKE 'abc%'" is c
a430: 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73  hanged into cons
a440: 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a  traints.  **.  *
a450: 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61  *          x>='a
a460: 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20  bc' AND x<'abd' 
a470: 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25  AND x LIKE 'abc%
a480: 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  '.  **.  ** The 
a490: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f  last character o
a4a0: 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62  f the prefix "ab
a4b0: 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  c" is incremente
a4c0: 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20  d to form the.  
a4d0: 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  ** termination c
a4e0: 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a  ondition "abd"..
a4f0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69 6b    */.  if( isLik
a500: 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20  eOrGlob(pParse, 
a510: 70 45 78 70 72 2c 20 26 6e 50 61 74 74 65 72 6e  pExpr, &nPattern
a520: 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26  , &isComplete, &
a530: 6e 6f 43 61 73 65 29 0a 20 20 20 20 20 20 20 20  noCase).        
a540: 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f   && pWC->op==TK_
a550: 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72 20  AND ){.    Expr 
a560: 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b  *pLeft, *pRight;
a570: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 31  .    Expr *pStr1
a580: 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20 20 45 78  , *pStr2;.    Ex
a590: 70 72 20 2a 70 4e 65 77 45 78 70 72 31 2c 20 2a  pr *pNewExpr1, *
a5a0: 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69  pNewExpr2;.    i
a5b0: 6e 74 20 69 64 78 4e 65 77 31 2c 20 69 64 78 4e  nt idxNew1, idxN
a5c0: 65 77 32 3b 0a 0a 20 20 20 20 70 4c 65 66 74 20  ew2;..    pLeft 
a5d0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
a5e0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
a5f0: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
a600: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
a610: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 31  pExpr;.    pStr1
a620: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
a630: 70 50 61 72 73 65 2c 20 54 4b 5f 53 54 52 49 4e  pParse, TK_STRIN
a640: 47 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  G, 0, 0, 0);.   
a650: 20 69 66 28 20 70 53 74 72 31 20 29 7b 0a 20 20   if( pStr1 ){.  
a660: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
a670: 43 6f 70 79 28 64 62 2c 20 26 70 53 74 72 31 2d  Copy(db, &pStr1-
a680: 3e 74 6f 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d  >token, &pRight-
a690: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70  >token);.      p
a6a0: 53 74 72 31 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Str1->token.n = 
a6b0: 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20  nPattern;.      
a6c0: 70 53 74 72 31 2d 3e 66 6c 61 67 73 20 3d 20 45  pStr1->flags = E
a6d0: 50 5f 44 65 71 75 6f 74 65 64 3b 0a 20 20 20 20  P_Dequoted;.    
a6e0: 7d 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71  }.    pStr2 = sq
a6f0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a700: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
a710: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
a720: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75  ailed ){.      u
a730: 38 20 63 2c 20 2a 70 43 3b 0a 20 20 20 20 20 20  8 c, *pC;.      
a740: 2f 2a 20 61 73 73 65 72 74 28 20 70 53 74 72 32  /* assert( pStr2
a750: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 3b 20 2a  ->token.dyn ); *
a760: 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28 75 38  /.      pC = (u8
a770: 2a 29 26 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e  *)&pStr2->token.
a780: 7a 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3b 0a 20  z[nPattern-1];. 
a790: 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20       c = *pC;.  
a7a0: 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29      if( noCase )
a7b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
a7c0: 3d 27 40 27 20 29 20 69 73 43 6f 6d 70 6c 65 74  ='@' ) isComplet
a7d0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  e = 0;.        c
a7e0: 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   = sqlite3UpperT
a7f0: 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20  oLower[c];.     
a800: 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63   }.      *pC = c
a810: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   + 1;.    }.    
a820: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
a830: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
a840: 20 54 4b 5f 47 45 2c 20 73 71 6c 69 74 65 33 45   TK_GE, sqlite3E
a850: 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c  xprDup(db,pLeft,
a860: 30 29 2c 70 53 74 72 31 2c 30 29 3b 0a 20 20 20  0),pStr1,0);.   
a870: 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65   idxNew1 = where
a880: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
a890: 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52  , pNewExpr1, TER
a8a0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
a8b0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
a8c0: 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d  tcase( idxNew1==
a8d0: 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
a8e0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
a8f0: 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e  idxNew1);.    pN
a900: 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
a910: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
a920: 4b 5f 4c 54 2c 20 73 71 6c 69 74 65 33 45 78 70  K_LT, sqlite3Exp
a930: 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c 30 29  rDup(db,pLeft,0)
a940: 2c 70 53 74 72 32 2c 30 29 3b 0a 20 20 20 20 69  ,pStr2,0);.    i
a950: 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c  dxNew2 = whereCl
a960: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
a970: 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f  pNewExpr2, TERM_
a980: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
a990: 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63  AMIC);.    testc
a9a0: 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20  ase( idxNew2==0 
a9b0: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
a9c0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
a9d0: 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72  xNew2);.    pTer
a9e0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
a9f0: 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73  erm];.    if( is
aa00: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
aa10: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31    pWC->a[idxNew1
aa20: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
aa30: 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  erm;.      pWC->
aa40: 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65  a[idxNew2].iPare
aa50: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
aa60: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
aa70: 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 2;.    }.  }
aa80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
aa90: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
aaa0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
aab0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
aac0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
aad0: 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43  /* Add a WO_MATC
aae0: 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d  H auxiliary term
aaf0: 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69   to the constrai
ab00: 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20  nt set if the.  
ab10: 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65  ** current expre
ab20: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
ab30: 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41  form:  column MA
ab40: 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54  TCH expr..  ** T
ab50: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
ab60: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78  is used by the x
ab70: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
ab80: 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61  s of.  ** virtua
ab90: 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e  l tables.  The n
aba0: 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69  ative query opti
abb0: 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61  mizer does not a
abc0: 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64  ttempt.  ** to d
abd0: 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20  o anything with 
abe0: 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e  MATCH functions.
abf0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61  .  */.  if( isMa
ac00: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70  tchOfColumn(pExp
ac10: 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  r) ){.    int id
ac20: 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a  xNew;.    Expr *
ac30: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
ac40: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
ac50: 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74  NewTerm;.    Bit
ac60: 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d  mask prereqColum
ac70: 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a  n, prereqExpr;..
ac80: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
ac90: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
aca0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65  ].pExpr;.    pLe
acb0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
acc0: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
acd0: 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20  .    prereqExpr 
ace0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
acf0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68  (pMaskSet, pRigh
ad00: 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f  t);.    prereqCo
ad10: 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65  lumn = exprTable
ad20: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
ad30: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
ad40: 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72  (prereqExpr & pr
ad50: 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29  ereqColumn)==0 )
ad60: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
ad70: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  ewExpr;.      pN
ad80: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
ad90: 45 78 70 72 28 64 62 2c 20 54 4b 5f 4d 41 54 43  Expr(db, TK_MATC
ada0: 48 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  H, 0, sqlite3Exp
adb0: 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c  rDup(db, pRight,
adc0: 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69   0), 0);.      i
add0: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
ade0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
adf0: 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49  NewExpr, TERM_VI
ae00: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
ae10: 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  IC);.      testc
ae20: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
ae30: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
ae40: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
ae50: 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  w];.      pNewTe
ae60: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
ae70: 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20  = prereqExpr;.  
ae80: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65      pNewTerm->le
ae90: 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
aea0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
aeb0: 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  pNewTerm->u.left
aec0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
aed0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
aee0: 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  NewTerm->eOperat
aef0: 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20  or = WO_MATCH;. 
af00: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
af10: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
af20: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
af30: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
af40: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
af50: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
af60: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
af70: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
af80: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
af90: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
afa0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
afb0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
afc0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
afd0: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
afe0: 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63   /* Prevent ON c
aff0: 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61  lause terms of a
b000: 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20   LEFT JOIN from 
b010: 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72  being used to dr
b020: 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ive.  ** an inde
b030: 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  x for tables to 
b040: 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
b050: 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65  join..  */.  pTe
b060: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
b070: 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d  |= extraRight;.}
b080: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
b090: 52 55 45 20 69 66 20 61 6e 79 20 6f 66 20 74 68  RUE if any of th
b0a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
b0b0: 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74   pList->a[iFirst
b0c0: 2e 2e 2e 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ...] contain.** 
b0d0: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
b0e0: 6e 79 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74  ny table other t
b0f0: 68 61 6e 20 74 68 65 20 69 42 61 73 65 20 74 61  han the iBase ta
b100: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
b110: 6e 74 20 72 65 66 65 72 65 6e 63 65 73 4f 74 68  nt referencesOth
b120: 65 72 54 61 62 6c 65 73 28 0a 20 20 45 78 70 72  erTables(.  Expr
b130: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
b140: 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
b150: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
b160: 68 73 20 6c 69 73 74 20 2a 2f 0a 20 20 57 68 65  hs list */.  Whe
b170: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
b180: 53 65 74 2c 20 20 20 2f 2a 20 4d 61 70 70 69 6e  Set,   /* Mappin
b190: 67 20 66 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f  g from tables to
b1a0: 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e   bitmaps */.  in
b1b0: 74 20 69 46 69 72 73 74 2c 20 20 20 20 20 20 20  t iFirst,       
b1c0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 20 73 65          /* Be se
b1d0: 61 72 63 68 69 6e 67 20 77 69 74 68 20 74 68 65  arching with the
b1e0: 20 69 46 69 72 73 74 2d 74 68 20 65 78 70 72 65   iFirst-th expre
b1f0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ssion */.  int i
b200: 42 61 73 65 20 20 20 20 20 20 20 20 20 20 20 20  Base            
b210: 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72       /* Ignore r
b220: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
b230: 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  s table */.){.  
b240: 42 69 74 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20  Bitmask allowed 
b250: 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  = ~getMask(pMask
b260: 53 65 74 2c 20 69 42 61 73 65 29 3b 0a 20 20 77  Set, iBase);.  w
b270: 68 69 6c 65 28 20 69 46 69 72 73 74 3c 70 4c 69  hile( iFirst<pLi
b280: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
b290: 20 69 66 28 20 28 65 78 70 72 54 61 62 6c 65 55   if( (exprTableU
b2a0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
b2b0: 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b  List->a[iFirst++
b2c0: 5d 2e 70 45 78 70 72 29 26 61 6c 6c 6f 77 65 64  ].pExpr)&allowed
b2d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
b2e0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
b2f0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
b300: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
b310: 74 69 6e 65 20 64 65 63 69 64 65 73 20 69 66 20  tine decides if 
b320: 70 49 64 78 20 63 61 6e 20 62 65 20 75 73 65 64  pIdx can be used
b330: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
b340: 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75  ORDER BY.** clau
b350: 73 65 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20  se.  If it can, 
b360: 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49  it returns 1.  I
b370: 66 20 70 49 64 78 20 63 61 6e 6e 6f 74 20 73 61  f pIdx cannot sa
b380: 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44  tisfy the.** ORD
b390: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
b3a0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
b3b0: 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64  ns 0..**.** pOrd
b3c0: 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52  erBy is an ORDER
b3d0: 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
b3e0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
b3f0: 6e 74 2e 20 20 70 54 61 62 20 69 73 20 74 68 65  nt.  pTab is the
b400: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61  .** left-most ta
b410: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
b420: 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 73  clause of that s
b430: 61 6d 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ame SELECT state
b440: 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ment and.** the 
b450: 74 61 62 6c 65 20 68 61 73 20 61 20 63 75 72 73  table has a curs
b460: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61  or number of "ba
b470: 73 65 22 2e 20 20 70 49 64 78 20 69 73 20 61 6e  se".  pIdx is an
b480: 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a   index on pTab..
b490: 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20  **.** nEqCol is 
b4a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
b4b0: 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78 20 74 68  lumns of pIdx th
b4c0: 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20 65  at are used as e
b4d0: 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74  quality.** const
b4e0: 72 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20  raints.  Any of 
b4f0: 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61  these columns ma
b500: 79 20 62 65 20 6d 69 73 73 69 6e 67 20 66 72 6f  y be missing fro
b510: 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  m the ORDER BY.*
b520: 2a 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  * clause and the
b530: 20 6d 61 74 63 68 20 63 61 6e 20 73 74 69 6c 6c   match can still
b540: 20 62 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a   be a success..*
b550: 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f  *.** All terms o
b560: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  f the ORDER BY t
b570: 68 61 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73  hat match agains
b580: 74 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74  t the index must
b590: 20 62 65 20 65 69 74 68 65 72 0a 2a 2a 20 41 53   be either.** AS
b5a0: 43 20 6f 72 20 44 45 53 43 2e 20 20 28 54 65 72  C or DESC.  (Ter
b5b0: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
b5c0: 42 59 20 63 6c 61 75 73 65 20 70 61 73 74 20 74  BY clause past t
b5d0: 68 65 20 65 6e 64 20 6f 66 20 61 20 55 4e 49 51  he end of a UNIQ
b5e0: 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e  UE.** index do n
b5f0: 6f 74 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73  ot need to satis
b600: 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  fy this constrai
b610: 6e 74 2e 29 20 20 54 68 65 20 2a 70 62 52 65 76  nt.)  The *pbRev
b620: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74   value is.** set
b630: 20 74 6f 20 31 20 69 66 20 74 68 65 20 4f 52 44   to 1 if the ORD
b640: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ER BY clause is 
b650: 61 6c 6c 20 44 45 53 43 20 61 6e 64 20 69 74 20  all DESC and it 
b660: 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 0a 2a  is set to 0 if.*
b670: 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
b680: 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 41 53 43  lause is all ASC
b690: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b6a0: 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a  isSortingIndex(.
b6b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
b6c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
b6d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b6e0: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
b6f0: 70 4d 61 73 6b 53 65 74 2c 20 2f 2a 20 4d 61 70  pMaskSet, /* Map
b700: 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20  ping from table 
b710: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74  cursor numbers t
b720: 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 49  o bitmaps */.  I
b730: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
b740: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
b750: 64 65 78 20 77 65 20 61 72 65 20 74 65 73 74 69  dex we are testi
b760: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65  ng */.  int base
b770: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b780: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
b790: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74   for the table t
b7a0: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20  o be sorted */. 
b7b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
b7c0: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
b7d0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
b7e0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c  */.  int nEqCol,
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b800: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  Number of index 
b810: 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20  columns with == 
b820: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
b830: 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20   int *pbRev     
b840: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
b850: 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59  to 1 if ORDER BY
b860: 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20   is DESC */.){. 
b870: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b890: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b8a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  s */.  int sortO
b8b0: 72 64 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  rder = 0;       
b8c0: 20 20 20 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66         /* XOR of
b8d0: 20 69 6e 64 65 78 20 61 6e 64 20 4f 52 44 45 52   index and ORDER
b8e0: 20 42 59 20 73 6f 72 74 20 64 69 72 65 63 74 69   BY sort directi
b8f0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  on */.  int nTer
b900: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
b910: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b920: 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  r of ORDER BY te
b930: 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  rms */.  struct 
b940: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
b950: 54 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65  Term;    /* A te
b960: 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
b970: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  BY clause */.  s
b980: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b990: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  rse->db;..  asse
b9a0: 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
b9b0: 29 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72  );.  nTerm = pOr
b9c0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
b9d0: 61 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20  assert( nTerm>0 
b9e0: 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74  );..  /* Match t
b9f0: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
ba00: 52 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69  R BY clause agai
ba10: 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  nst columns of. 
ba20: 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   ** the index.. 
ba30: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
ba40: 61 74 20 69 6e 64 69 63 65 73 20 68 61 76 65 20  at indices have 
ba50: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65  pIdx->nColumn re
ba60: 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70 6c  gular columns pl
ba70: 75 73 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64 69  us.  ** one addi
ba80: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f  tional column co
ba90: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77  ntaining the row
baa0: 69 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 63  id.  The rowid c
bab0: 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74 68  olumn.  ** of th
bac0: 65 20 69 6e 64 65 78 20 69 73 20 61 6c 73 6f 20  e index is also 
bad0: 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68  allowed to match
bae0: 20 61 67 61 69 6e 73 74 20 74 68 65 20 4f 52 44   against the ORD
baf0: 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73  ER BY.  ** claus
bb00: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
bb10: 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65  j=0, pTerm=pOrde
bb20: 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20  rBy->a; j<nTerm 
bb30: 26 26 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c  && i<=pIdx->nCol
bb40: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  umn; i++){.    E
bb50: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
bb60: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
bb70: 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52  ion of the ORDER
bb80: 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20   BY pTerm */.   
bb90: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
bba0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
bbb0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66  ting sequence of
bbc0: 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e   pExpr */.    in
bbd0: 74 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b  t termSortOrder;
bbe0: 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66   /* Sort order f
bbf0: 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a  or this term */.
bc00: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b      int iColumn;
bc10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d         /* The i-
bc20: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
bc30: 20 69 6e 64 65 78 2e 20 20 2d 31 20 66 6f 72 20   index.  -1 for 
bc40: 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  rowid */.    int
bc50: 20 69 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20   iSortOrder;    
bc60: 2f 2a 20 31 20 66 6f 72 20 44 45 53 43 2c 20 30  /* 1 for DESC, 0
bc70: 20 66 6f 72 20 41 53 43 20 6f 6e 20 74 68 65 20   for ASC on the 
bc80: 69 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20  i-th index term 
bc90: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
bca0: 72 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d  r *zColl; /* Nam
bcb0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  e of the collati
bcc0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
bcd0: 69 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20  i-th index term 
bce0: 2a 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20  */..    pExpr = 
bcf0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
bd00: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
bd10: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45  =TK_COLUMN || pE
bd20: 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73  xpr->iTable!=bas
bd30: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  e ){.      /* Ca
bd40: 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64  n not use an ind
bd50: 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68  ex sort on anyth
bd60: 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ing that is not 
bd70: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a  a column in the.
bd80: 20 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f        ** left-mo
bd90: 73 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  st table of the 
bda0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
bdb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bdc0: 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  }.    pColl = sq
bdd0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
bde0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
bdf0: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
be00: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  ){.      pColl =
be10: 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
be20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
be30: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
be40: 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  .      iColumn =
be50: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
be60: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  i];.      if( iC
be70: 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61  olumn==pIdx->pTa
be80: 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  ble->iPKey ){.  
be90: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
bea0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
beb0: 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 70    iSortOrder = p
bec0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
bed0: 69 5d 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  i];.      zColl 
bee0: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
bef0: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
bf00: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
bf10: 3b 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64  ;.      iSortOrd
bf20: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 43  er = 0;.      zC
bf30: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll = pColl->zNa
bf40: 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  me;.    }.    if
bf50: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
bf60: 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c 20 73 71 6c  !=iColumn || sql
bf70: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
bf80: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29  l->zName, zColl)
bf90: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72   ){.      /* Ter
bfa0: 6d 20 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52  m j of the ORDER
bfb0: 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20   BY clause does 
bfc0: 6e 6f 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e  not match column
bfd0: 20 69 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20   i of the index 
bfe0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e  */.      if( i<n
bff0: 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  EqCol ){.       
c000: 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20   /* If an index 
c010: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63  column that is c
c020: 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
c030: 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20   fails to match 
c040: 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  an.        ** OR
c050: 44 45 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61  DER BY term, tha
c060: 74 20 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69  t is OK.  Just i
c070: 67 6e 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d  gnore that colum
c080: 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20  n of the index. 
c090: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c0a0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
c0b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3d 3d 70    }else if( i==p
c0c0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  Idx->nColumn ){.
c0d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
c0e0: 20 63 6f 6c 75 6d 6e 20 69 20 69 73 20 74 68 65   column i is the
c0f0: 20 72 6f 77 69 64 2e 20 20 41 6c 6c 20 6f 74 68   rowid.  All oth
c100: 65 72 20 74 65 72 6d 73 20 6d 61 74 63 68 2e 20  er terms match. 
c110: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
c120: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c130: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
c140: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69  index column fai
c150: 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64 20  ls to match and 
c160: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e  is not constrain
c170: 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20 20  ed by ==.       
c180: 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e 64   ** then the ind
c190: 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66  ex cannot satisf
c1a0: 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  y the ORDER BY c
c1b0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20 20  onstraint..     
c1c0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
c1d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
c1e0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
c1f0: 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  ( pIdx->aSortOrd
c200: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  er!=0 );.    ass
c210: 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74  ert( pTerm->sort
c220: 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65 72  Order==0 || pTer
c230: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20  m->sortOrder==1 
c240: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
c250: 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20  SortOrder==0 || 
c260: 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b  iSortOrder==1 );
c270: 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72 64  .    termSortOrd
c280: 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72 20  er = iSortOrder 
c290: 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64  ^ pTerm->sortOrd
c2a0: 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e 45  er;.    if( i>nE
c2b0: 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  qCol ){.      if
c2c0: 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21  ( termSortOrder!
c2d0: 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  =sortOrder ){.  
c2e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65 73        /* Indices
c2f0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
c300: 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20 42  d if all ORDER B
c310: 59 20 74 65 72 6d 73 20 70 61 73 74 20 74 68 65  Y terms past the
c320: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75 61  .        ** equa
c330: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
c340: 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20   are all either 
c350: 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f 0a  DESC or ASC. */.
c360: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
c370: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
c380: 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74 4f  lse{.      sortO
c390: 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74 4f  rder = termSortO
c3a0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rder;.    }.    
c3b0: 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b 2b  j++;.    pTerm++
c3c0: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d  ;.    if( iColum
c3d0: 6e 3c 30 20 26 26 20 21 72 65 66 65 72 65 6e 63  n<0 && !referenc
c3e0: 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f  esOtherTables(pO
c3f0: 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74  rderBy, pMaskSet
c400: 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20  , j, base) ){.  
c410: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
c420: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  dexed column is 
c430: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
c440: 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20 6d  and everything m
c450: 61 74 63 68 65 73 0a 20 20 20 20 20 20 2a 2a 20  atches.      ** 
c460: 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e 65 20  so far and none 
c470: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
c480: 74 65 72 6d 73 20 74 6f 20 74 68 65 20 72 69 67  terms to the rig
c490: 68 74 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68  ht reference oth
c4a0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  er.      ** tabl
c4b0: 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20  es in the join, 
c4c0: 74 68 65 6e 20 77 65 20 61 72 65 20 61 73 73 75  then we are assu
c4d0: 72 65 64 20 74 68 61 74 20 74 68 65 20 69 6e 64  red that the ind
c4e0: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 0a  ex can be used .
c4f0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f 72 74        ** to sort
c500: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 72 69   because the pri
c510: 6d 61 72 79 20 6b 65 79 20 69 73 20 75 6e 69 71  mary key is uniq
c520: 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65 20 6f  ue and so none o
c530: 66 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20 20  f the other.    
c540: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77 69 6c    ** columns wil
c550: 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69 66 66 65  l make any diffe
c560: 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f 0a 20  rence.      */. 
c570: 20 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d 3b 0a       j = nTerm;.
c580: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 62      }.  }..  *pb
c590: 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72 21  Rev = sortOrder!
c5a0: 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65  =0;.  if( j>=nTe
c5b0: 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  rm ){.    /* All
c5c0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
c5d0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
c5e0: 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68 69  e covered by thi
c5f0: 73 20 69 6e 64 65 78 20 73 6f 0a 20 20 20 20 2a  s index so.    *
c600: 2a 20 74 68 69 73 20 69 6e 64 65 78 20 63 61 6e  * this index can
c610: 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f 72   be used for sor
c620: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65 74  ting. */.    ret
c630: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
c640: 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
c650: 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70 49  OE_None && i==pI
c660: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20  dx->nColumn.    
c670: 20 20 26 26 20 21 72 65 66 65 72 65 6e 63 65 73    && !references
c680: 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64  OtherTables(pOrd
c690: 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20  erBy, pMaskSet, 
c6a0: 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20  j, base) ){.    
c6b0: 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20  /* All terms of 
c6c0: 74 68 69 73 20 69 6e 64 65 78 20 6d 61 74 63 68  this index match
c6d0: 20 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66 20   some prefix of 
c6e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
c6f0: 75 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  use.    ** and t
c700: 68 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49 51  he index is UNIQ
c710: 55 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73 20  UE and no terms 
c720: 6f 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  on the tail of t
c730: 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20  he ORDER BY.    
c740: 2a 2a 20 63 6c 61 75 73 65 20 72 65 66 65 72 65  ** clause refere
c750: 6e 63 65 20 6f 74 68 65 72 20 74 61 62 6c 65 73  nce other tables
c760: 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49 66 20   in a join.  If 
c770: 74 68 69 73 20 69 73 20 61 6c 6c 20 74 72 75 65  this is all true
c780: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
c790: 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65   order by clause
c7a0: 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e   is superfluous.
c7b0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31   */.    return 1
c7c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
c7d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
c7e0: 20 74 61 62 6c 65 20 74 6f 20 73 65 65 20 69 66   table to see if
c7f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
c800: 61 75 73 65 20 69 6e 20 70 4f 72 64 65 72 42 79  ause in pOrderBy
c810: 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65   can be satisfie
c820: 64 0a 2a 2a 20 62 79 20 73 6f 72 74 69 6e 67 20  d.** by sorting 
c830: 69 6e 20 6f 72 64 65 72 20 6f 66 20 52 4f 57 49  in order of ROWI
c840: 44 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  D.  Return true 
c850: 69 66 20 73 6f 20 61 6e 64 20 73 65 74 20 2a 70  if so and set *p
c860: 62 52 65 76 20 74 6f 20 62 65 0a 2a 2a 20 74 72  bRev to be.** tr
c870: 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 20 52  ue for reverse R
c880: 4f 57 49 44 20 61 6e 64 20 66 61 6c 73 65 20 66  OWID and false f
c890: 6f 72 20 66 6f 72 77 61 72 64 20 52 4f 57 49 44  or forward ROWID
c8a0: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
c8b0: 63 20 69 6e 74 20 73 6f 72 74 61 62 6c 65 42 79  c int sortableBy
c8c0: 52 6f 77 69 64 28 0a 20 20 69 6e 74 20 62 61 73  Rowid(.  int bas
c8d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
c8e0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
c8f0: 72 20 66 6f 72 20 74 61 62 6c 65 20 74 6f 20 62  r for table to b
c900: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78  e sorted */.  Ex
c910: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
c920: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
c930: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
c940: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
c950: 70 4d 61 73 6b 53 65 74 2c 20 2f 2a 20 4d 61 70  pMaskSet, /* Map
c960: 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20  ping from table 
c970: 63 75 72 73 6f 72 73 20 74 6f 20 62 69 74 6d 61  cursors to bitma
c980: 70 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  ps */.  int *pbR
c990: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
c9a0: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
c9b0: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
c9c0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b  */.){.  Expr *p;
c9d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
c9e0: 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
c9f0: 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ert( pOrderBy->n
ca00: 45 78 70 72 3e 30 20 29 3b 0a 20 20 70 20 3d 20  Expr>0 );.  p = 
ca10: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70  pOrderBy->a[0].p
ca20: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  Expr;.  if( p->o
ca30: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
ca40: 70 2d 3e 69 54 61 62 6c 65 3d 3d 62 61 73 65 20  p->iTable==base 
ca50: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d  && p->iColumn==-
ca60: 31 0a 20 20 20 20 26 26 20 21 72 65 66 65 72 65  1.    && !refere
ca70: 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28  ncesOtherTables(
ca80: 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53  pOrderBy, pMaskS
ca90: 65 74 2c 20 31 2c 20 62 61 73 65 29 20 29 7b 0a  et, 1, base) ){.
caa0: 20 20 20 20 2a 70 62 52 65 76 20 3d 20 70 4f 72      *pbRev = pOr
cab0: 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74  derBy->a[0].sort
cac0: 4f 72 64 65 72 3b 0a 20 20 20 20 72 65 74 75 72  Order;.    retur
cad0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
cae0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 0;.}../*.** Pr
caf0: 65 70 61 72 65 20 61 20 63 72 75 64 65 20 65 73  epare a crude es
cb00: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f  timate of the lo
cb10: 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69  garithm of the i
cb20: 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  nput value..** T
cb30: 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20  he results need 
cb40: 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20 54  not be exact.  T
cb50: 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  his is only used
cb60: 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a   for estimating.
cb70: 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73  ** the total cos
cb80: 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20  t of performing 
cb90: 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20  operations with 
cba0: 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f  O(logN) or O(Nlo
cbb0: 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74  gN).** complexit
cbc0: 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69 73  y.  Because N is
cbd0: 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20 69   just a guess, i
cbe0: 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72  t is no great tr
cbf0: 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e  agedy if.** logN
cc00: 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66   is a little off
cc10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62  ..*/.static doub
cc20: 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65  le estLog(double
cc30: 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f   N){.  double lo
cc40: 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65  gN = 1;.  double
cc50: 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65   x = 10;.  while
cc60: 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67  ( N>x ){.    log
cc70: 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d  N += 1;.    x *=
cc80: 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   10;.  }.  retur
cc90: 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n logN;.}../*.**
cca0: 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
ccb0: 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
ccc0: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
ccd0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
cce0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
ccf0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
cd00: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
cd10: 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
cd20: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
cd30: 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
cd40: 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
cd50: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
cd60: 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
cd70: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
cd80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
cd90: 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
cda0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
cdb0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  ).static void TR
cdc0: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73  ACE_IDX_INPUTS(s
cdd0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
cde0: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
cdf0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
ce00: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
ce10: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
ce20: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
ce30: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
ce40: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
ce50: 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20  constraint[%d]: 
ce60: 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64  col=%d termid=%d
ce70: 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25   op=%d usabled=%
ce80: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
ce90: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
cea0: 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  raint[i].iColumn
ceb0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
cec0: 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d  straint[i].iTerm
ced0: 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70  Offset,.       p
cee0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
cef0: 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  .op,.       p->a
cf00: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
cf10: 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  able);.  }.  for
cf20: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65  (i=0; i<p->nOrde
cf30: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  rBy; i++){.    s
cf40: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
cf50: 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d  f("  orderby[%d]
cf60: 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64  : col=%d desc=%d
cf70: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
cf80: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
cf90: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  y[i].iColumn,.  
cfa0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
cfb0: 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d  [i].desc);.  }.}
cfc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
cfd0: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73  CE_IDX_OUTPUTS(s
cfe0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
cff0: 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
d000: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
d010: 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
d020: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
d030: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
d040: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
d050: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
d060: 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49  usage[%d]: argvI
d070: 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22  dx=%d omit=%d\n"
d080: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
d090: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d0a0: 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
d0b0: 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  dex,.       p->a
d0c0: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
d0d0: 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  i].omit);.  }.  
d0e0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
d0f0: 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c  tf("  idxNum=%d\
d100: 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a  n", p->idxNum);.
d110: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
d120: 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25  intf("  idxStr=%
d130: 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29  s\n", p->idxStr)
d140: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
d150: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42  Printf("  orderB
d160: 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c  yConsumed=%d\n",
d170: 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75   p->orderByConsu
d180: 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  med);.  sqlite3D
d190: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
d1a0: 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e  timatedCost=%g\n
d1b0: 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43  ", p->estimatedC
d1c0: 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ost);.}.#else.#d
d1d0: 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
d1e0: 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e  INPUTS(A).#defin
d1f0: 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  e TRACE_IDX_OUTP
d200: 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23  UTS(A).#endif..#
d210: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d220: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
d230: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
d240: 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72  e best index for
d250: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
d260: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74  ..**.** The best
d270: 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74   index is comput
d280: 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
d290: 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74  ndex method of t
d2a0: 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61  he virtual.** ta
d2b0: 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69  ble module.  Thi
d2c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61  s routine is rea
d2d0: 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70 70  lly just a wrapp
d2e0: 65 72 20 74 68 61 74 20 73 65 74 73 20 75 70 0a  er that sets up.
d2f0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
d300: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
d310: 75 72 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ure that is used
d320: 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20   to communicate 
d330: 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64  with.** xBestInd
d340: 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a  ex..**.** In a j
d350: 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  oin, this routin
d360: 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65  e might be calle
d370: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
d380: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65   for the.** same
d390: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
d3a0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
d3b0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
d3c0: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
d3d0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  and initialized 
d3e0: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76  on the first inv
d3f0: 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  ocation and reus
d400: 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71  ed on all subseq
d410: 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  uent.** invocati
d420: 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ons.  The sqlite
d430: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
d440: 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75  ucture is also u
d450: 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65  sed when.** code
d460: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
d470: 20 61 63 63 65 73 73 20 74 68 65 20 76 69 72 74   access the virt
d480: 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ual table.  The 
d490: 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28  whereInfoDelete(
d4a0: 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61  ) .** routine ta
d4b0: 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72 65 65  kes care of free
d4c0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
d4d0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
d4e0: 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76  ture after.** ev
d4f0: 65 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69  erybody has fini
d500: 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f  shed with it..*/
d510: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62  .static double b
d520: 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
d530: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d540: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d550: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
d560: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
d570: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d590: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
d5a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
d5b0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
d5c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
d5d0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
d5e0: 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
d5f0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
d600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
d610: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
d620: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
d630: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
d640: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
d650: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d660: 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
d670: 2a 2f 0a 20 20 69 6e 74 20 6f 72 64 65 72 42 79  */.  int orderBy
d680: 55 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  Usable,         
d690: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
d6a0: 65 20 63 61 6e 20 70 6f 74 65 6e 74 69 61 6c 20  e can potential 
d6b0: 73 6f 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  sort */.  sqlite
d6c0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70  3_index_info **p
d6d0: 70 49 64 78 49 6e 66 6f 20 2f 2a 20 49 6e 64 65  pIdxInfo /* Inde
d6e0: 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61  x information pa
d6f0: 73 73 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64  ssed to xBestInd
d700: 65 78 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ex */.){.  Table
d710: 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70   *pTab = pSrc->p
d720: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Tab;.  sqlite3_v
d730: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 54 61  tab *pVtab = pTa
d740: 62 2d 3e 70 56 74 61 62 3b 0a 20 20 73 71 6c 69  b->pVtab;.  sqli
d750: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
d760: 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75  pIdxInfo;.  stru
d770: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
d780: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
d790: 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
d7a0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
d7b0: 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72  derby *pIdxOrder
d7c0: 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  By;.  struct sql
d7d0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
d7e0: 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
d7f0: 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
d800: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
d810: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  , j;.  int nOrde
d820: 72 42 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  rBy;.  int rc;..
d830: 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c 69    /* If the sqli
d840: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
d850: 74 72 75 63 74 75 72 65 20 68 61 73 20 6e 6f 74  tructure has not
d860: 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
d870: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
d880: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  and initialized 
d890: 66 6f 72 20 74 68 69 73 20 76 69 72 74 75 61 6c  for this virtual
d8a0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 61 6c 6c   table, then all
d8b0: 6f 63 61 74 65 0a 20 20 2a 2a 20 61 6e 64 20 69  ocate.  ** and i
d8c0: 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f 77  nitialize it now
d8d0: 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
d8e0: 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20   = *ppIdxInfo;. 
d8f0: 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
d900: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54 65 72   ){.    int nTer
d910: 6d 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  m;.    WHERETRAC
d920: 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20  E(("Recomputing 
d930: 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25  index info for %
d940: 73 2e 2e 2e 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a  s...\n", pTab->z
d950: 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Name));..    /* 
d960: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
d970: 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45   of possible WHE
d980: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
d990: 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a  aints referring.
d9a0: 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76      ** to this v
d9b0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
d9c0: 20 20 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d      for(i=nTerm=
d9d0: 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
d9e0: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
d9f0: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
da00: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
da10: 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
da20: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
da30: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
da40: 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70  ert( (pTerm->eOp
da50: 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65  erator&(pTerm->e
da60: 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20  Operator-1))==0 
da70: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
da80: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
da90: 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  tor==WO_IN );.  
daa0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
dab0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
dac0: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
dad0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
dae0: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e  perator & (WO_IN
daf0: 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  |WO_ISNULL) ) co
db00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 54  ntinue;.      nT
db10: 65 72 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  erm++;.    }..  
db20: 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45    /* If the ORDE
db30: 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74  R BY clause cont
db40: 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e  ains only column
db50: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
db60: 20 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c   .    ** virtual
db70: 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
db80: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
db90: 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
dba0: 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73   of.    ** the s
dbb0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
dbc0: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20  o structure..   
dbd0: 20 2a 2f 0a 20 20 20 20 6e 4f 72 64 65 72 42 79   */.    nOrderBy
dbe0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4f   = 0;.    if( pO
dbf0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
dc00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
dc10: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
dc20: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
dc30: 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
dc40: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
dc50: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
dc60: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
dc70: 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
dc80: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
dc90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
dca0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72        if( i==pOr
dcb0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
dcc0: 20 20 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79          nOrderBy
dcd0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
dce0: 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pr;.      }.    
dcf0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  }..    /* Alloca
dd00: 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
dd10: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
dd20: 75 72 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ure.    */.    p
dd30: 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  IdxInfo = sqlite
dd40: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
dd50: 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
dd60: 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20  (*pIdxInfo).    
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65           + (size
dd90: 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20  of(*pIdxCons) + 
dda0: 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29  sizeof(*pUsage))
ddb0: 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  *nTerm.         
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49      + sizeof(*pI
dde0: 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65  dxOrderBy)*nOrde
ddf0: 72 42 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  rBy );.    if( p
de00: 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
de10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
de20: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74  Msg(pParse, "out
de30: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
de40: 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30      /* (double)0
de50: 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49   In case of SQLI
de60: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
de70: 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20  _POINT... */.   
de80: 20 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c     return (doubl
de90: 65 29 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  e)0;.    }.    *
dea0: 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64 78  ppIdxInfo = pIdx
deb0: 49 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  Info;..    /* In
dec0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72  itialize the str
ded0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c  ucture.  The sql
dee0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
def0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
df00: 6e 73 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 66  ns.    ** many f
df10: 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
df20: 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
df30: 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
df40: 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 20 20 2a  Index from.    *
df50: 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
df60: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
df70: 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
df80: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
df90: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
dfa0: 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20   those fields.. 
dfb0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 43 6f     */.    pIdxCo
dfc0: 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
dfd0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
dfe0: 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  raint*)&pIdxInfo
dff0: 5b 31 5d 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  [1];.    pIdxOrd
e000: 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73  erBy = (struct s
e010: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
e020: 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b  erby*)&pIdxCons[
e030: 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 70 55 73 61  nTerm];.    pUsa
e040: 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ge = (struct sql
e050: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
e060: 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49  raint_usage*)&pI
e070: 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72  dxOrderBy[nOrder
e080: 42 79 5d 3b 0a 20 20 20 20 2a 28 69 6e 74 2a 29  By];.    *(int*)
e090: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  &pIdxInfo->nCons
e0a0: 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a  traint = nTerm;.
e0b0: 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78      *(int*)&pIdx
e0c0: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
e0d0: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 2a   nOrderBy;.    *
e0e0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
e0f0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
e100: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
e110: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
e120: 43 6f 6e 73 3b 0a 20 20 20 20 2a 28 73 74 72 75  Cons;.    *(stru
e130: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
e140: 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
e150: 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
e160: 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
e170: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
e180: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
e190: 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64  int_usage**)&pId
e1a0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
e1b0: 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20  ntUsage =.      
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
e200: 55 73 61 67 65 3b 0a 0a 20 20 20 20 66 6f 72 28  Usage;..    for(
e210: 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
e220: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
e230: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
e240: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
e250: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
e260: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
e270: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
e280: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
e290: 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72  >eOperator&(pTer
e2a0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29  m->eOperator-1))
e2b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
e2c0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
e2d0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29  perator==WO_IN )
e2e0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
e2f0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
e300: 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  or==WO_ISNULL );
e310: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
e320: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
e330: 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
e340: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
e350: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43    pIdxCons[j].iC
e360: 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75  olumn = pTerm->u
e370: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
e380: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
e390: 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a  TermOffset = i;.
e3a0: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
e3b0: 5d 2e 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d  ].op = (u8)pTerm
e3c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20  ->eOperator;.   
e3d0: 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74     /* The direct
e3e0: 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74   assignment in t
e3f0: 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65  he previous line
e400: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c   is possible onl
e410: 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20  y because.      
e420: 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53  ** the WO_ and S
e430: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
e440: 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72  TRAINT_ codes ar
e450: 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68  e identical.  Th
e460: 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  e.      ** follo
e470: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
e480: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
e490: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
e4a0: 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
e4b0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
e4c0: 51 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Q );.      asser
e4d0: 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45  t( WO_LT==SQLITE
e4e0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
e4f0: 54 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 61 73  T_LT );.      as
e500: 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
e510: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
e520: 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 20  AINT_LE );.     
e530: 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d   assert( WO_GT==
e540: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
e550: 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20  STRAINT_GT );.  
e560: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
e570: 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
e580: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b  CONSTRAINT_GE );
e590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
e5a0: 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f  O_MATCH==SQLITE_
e5b0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
e5c0: 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 20 20  _MATCH );.      
e5d0: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
e5e0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
e5f0: 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
e600: 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54  _GT|WO_GE|WO_MAT
e610: 43 48 29 20 29 3b 0a 20 20 20 20 20 20 6a 2b 2b  CH) );.      j++
e620: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
e630: 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
e640: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
e650: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
e660: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
e670: 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64 65 72  .      pIdxOrder
e680: 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
e690: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
e6a0: 20 20 20 20 20 20 70 49 64 78 4f 72 64 65 72 42        pIdxOrderB
e6b0: 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64  y[i].desc = pOrd
e6c0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
e6d0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
e6e0: 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
e6f0: 69 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  int, the sqlite3
e700: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
e710: 63 74 75 72 65 20 74 68 61 74 20 70 49 64 78 49  cture that pIdxI
e720: 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20  nfo points.  ** 
e730: 74 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  to will have bee
e740: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65  n initialized, e
e750: 69 74 68 65 72 20 64 75 72 69 6e 67 20 74 68 65  ither during the
e760: 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74   current invocat
e770: 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69  ion or.  ** duri
e780: 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e  ng some prior in
e790: 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77  vocation.  Now w
e7a0: 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63  e just have to c
e7b0: 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a  ustomize the.  *
e7c0: 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64  * details of pId
e7d0: 78 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75  xInfo for the cu
e7e0: 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  rrent invocation
e7f0: 20 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a   and pass it to.
e800: 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e    ** xBestIndex.
e810: 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  .  */..  /* The 
e820: 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74  module name must
e830: 20 62 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73   be defined. Als
e840: 6f 2c 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74  o, by this point
e850: 20 74 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a   there must.  **
e860: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
e870: 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
e880: 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65   structure. Othe
e890: 72 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74  rwise.  ** sqlit
e8a0: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
e8b0: 61 6d 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76  ames() would hav
e8c0: 65 20 70 69 63 6b 65 64 20 75 70 20 74 68 65 20  e picked up the 
e8d0: 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61  error. .  */.  a
e8e0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d  ssert( pTab->azM
e8f0: 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54 61 62  oduleArg && pTab
e900: 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d  ->azModuleArg[0]
e910: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56   );.  assert( pV
e920: 74 61 62 20 29 3b 0a 23 69 66 20 30 0a 20 20 69  tab );.#if 0.  i
e930: 66 28 20 70 54 61 62 2d 3e 70 56 74 61 62 3d 3d  f( pTab->pVtab==
e940: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
e950: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e960: 20 22 75 6e 64 65 66 69 6e 65 64 20 6d 6f 64 75   "undefined modu
e970: 6c 65 20 25 73 20 66 6f 72 20 74 61 62 6c 65 20  le %s for table 
e980: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
e990: 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30  b->azModuleArg[0
e9a0: 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ], pTab->zName);
e9b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b  .    return 0.0;
e9c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
e9d0: 2a 20 53 65 74 20 74 68 65 20 61 43 6f 6e 73 74  * Set the aConst
e9e0: 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66  raint[].usable f
e9f0: 69 65 6c 64 73 20 61 6e 64 20 69 6e 69 74 69 61  ields and initia
ea00: 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f  lize all .  ** o
ea10: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
ea20: 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  to zero..  **.  
ea30: 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  ** aConstraint[]
ea40: 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75 65 20  .usable is true 
ea50: 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
ea60: 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
ea70: 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65 20 63  hand.  ** side c
ea80: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72 65 66  ontains only ref
ea90: 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65  erences to table
eaa0: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
eab0: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
eac0: 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68  * table.  In oth
ead0: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
eae0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f   constraint is o
eaf0: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
eb00: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
eb10: 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a 20 20  column = expr.  
eb20: 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61  **.  ** and we a
eb30: 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20  re evaluating a 
eb40: 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  join, then the c
eb50: 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c  onstraint on col
eb60: 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c  umn is .  ** onl
eb70: 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 74  y valid if all t
eb80: 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64  ables referenced
eb90: 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72 20 74   in expr occur t
eba0: 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20  o the left.  ** 
ebb0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e  of the table con
ebc0: 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a  taining column..
ebd0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 43    **.  ** The aC
ebe0: 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61 72 72  onstraints[] arr
ebf0: 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72  ay contains entr
ec00: 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73  ies for all cons
ec10: 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20  traints.  ** on 
ec20: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
ec30: 65 2e 20 20 54 68 61 74 20 77 61 79 20 77 65 20  e.  That way we 
ec40: 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20 63 6f 6d  only have to com
ec50: 70 75 74 65 20 69 74 20 6f 6e 63 65 0a 20 20 2a  pute it once.  *
ec60: 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 77 65  * even though we
ec70: 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20 70 69   might try to pi
ec80: 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  ck the best inde
ec90: 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  x multiple times
eca0: 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20  ..  ** For each 
ecb0: 61 74 74 65 6d 70 74 20 61 74 20 70 69 63 6b 69  attempt at picki
ecc0: 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  ng an index, the
ecd0: 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73   order of tables
ece0: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 69   in the.  ** joi
ecf0: 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65  n might be diffe
ed00: 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76 65 20  rent so we have 
ed10: 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
ed20: 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20 20 2a   usable flag.  *
ed30: 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 2a  * each time..  *
ed40: 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a  /.  pIdxCons = *
ed50: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
ed60: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
ed70: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
ed80: 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70 55 73  onstraint;.  pUs
ed90: 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  age = pIdxInfo->
eda0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
edb0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
edc0: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
edd0: 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
ede0: 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d 20  ons++){.    j = 
edf0: 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
ee00: 66 66 73 65 74 3b 0a 20 20 20 20 70 54 65 72 6d  ffset;.    pTerm
ee10: 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
ee20: 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
ee30: 62 6c 65 20 3d 20 20 28 70 54 65 72 6d 2d 3e 70  ble =  (pTerm->p
ee40: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
ee50: 52 65 61 64 79 29 3d 3d 30 20 3f 31 3a 30 3b 0a  Ready)==0 ?1:0;.
ee60: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73    }.  memset(pUs
ee70: 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
ee80: 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e  Usage[0])*pIdxIn
ee90: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29  fo->nConstraint)
eea0: 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
eeb0: 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
eec0: 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
eed0: 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
eee0: 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20  >idxStr);.  }.  
eef0: 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
ef00: 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
ef10: 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
ef20: 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
ef30: 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
ef40: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
ef50: 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
ef60: 0a 20 20 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32  .  /* ((double)2
ef70: 29 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c  ) In case of SQL
ef80: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
ef90: 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20  G_POINT... */.  
efa0: 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
efb0: 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
efc0: 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75  _BIG_DBL / ((dou
efd0: 62 6c 65 29 32 29 3b 0a 20 20 6e 4f 72 64 65 72  ble)2);.  nOrder
efe0: 42 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  By = pIdxInfo->n
eff0: 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70  OrderBy;.  if( p
f000: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
f010: 79 20 26 26 20 21 6f 72 64 65 72 42 79 55 73 61  y && !orderByUsa
f020: 62 6c 65 20 29 7b 0a 20 20 20 20 2a 28 69 6e 74  ble ){.    *(int
f030: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
f040: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a  derBy = 0;.  }..
f050: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
f060: 61 66 65 74 79 4f 66 66 28 70 50 61 72 73 65 2d  afetyOff(pParse-
f070: 3e 64 62 29 3b 0a 20 20 57 48 45 52 45 54 52 41  >db);.  WHERETRA
f080: 43 45 28 28 22 78 42 65 73 74 49 6e 64 65 78 20  CE(("xBestIndex 
f090: 66 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d  for %s\n", pTab-
f0a0: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 54 52 41 43  >zName));.  TRAC
f0b0: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 49 64  E_IDX_INPUTS(pId
f0c0: 78 49 6e 66 6f 29 3b 0a 20 20 72 63 20 3d 20 70  xInfo);.  rc = p
f0d0: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
f0e0: 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c  BestIndex(pVtab,
f0f0: 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 54 52   pIdxInfo);.  TR
f100: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
f110: 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 28 76 6f  pIdxInfo);.  (vo
f120: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
f130: 4f 6e 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  On(pParse->db);.
f140: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f150: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
f160: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
f170: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
f180: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
f190: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
f1a0: 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45  e if( !pVtab->zE
f1b0: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
f1c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f1d0: 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c  Parse, "%s", sql
f1e0: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b  ite3ErrStr(rc));
f1f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f200: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f210: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
f220: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
f230: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
f240: 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
f250: 65 2d 3e 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  e->db, pVtab->zE
f260: 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d  rrMsg);.  pVtab-
f270: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  >zErrMsg = 0;.. 
f280: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
f290: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
f2a0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
f2b0: 20 21 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e   !pIdxInfo->aCon
f2c0: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
f2d0: 65 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 61  e && pUsage[i].a
f2e0: 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20  rgvIndex>0 ){.  
f2f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f300: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
f310: 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73         "table %s
f320: 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74  : xBestIndex ret
f330: 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64  urned an invalid
f340: 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   plan", pTab->zN
f350: 61 6d 65 29 3b 0a 20 20 20 20 20 20 2f 2a 20 28  ame);.      /* (
f360: 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65  double)0 In case
f370: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
f380: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e  FLOATING_POINT..
f390: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
f3a0: 6e 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20 20  n (double)0;.   
f3b0: 20 7d 0a 20 20 7d 0a 0a 20 20 2a 28 69 6e 74 2a   }.  }..  *(int*
f3c0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  )&pIdxInfo->nOrd
f3d0: 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
f3e0: 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e  .  return pIdxIn
f3f0: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
f400: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
f410: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
f420: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
f430: 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65 72 79  * Find the query
f440: 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73   plan for access
f450: 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
f460: 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74   table.  Write t
f470: 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79  he.** best query
f480: 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f   plan and its co
f490: 73 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72  st into the Wher
f4a0: 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70  eCost object sup
f4b0: 70 6c 69 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  plied as the.** 
f4c0: 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  last parameter..
f4d0: 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74  **.** The lowest
f4e0: 20 63 6f 73 74 20 70 6c 61 6e 20 77 69 6e 73 2e   cost plan wins.
f4f0: 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e    The cost is an
f500: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
f510: 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50   amount of.** CP
f520: 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e  U and disk I/O n
f530: 65 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  eed to process t
f540: 68 65 20 72 65 71 75 65 73 74 20 75 73 69 6e 67  he request using
f550: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 6c   the selected pl
f560: 61 6e 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74  an..** Factors t
f570: 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f  hat influence co
f580: 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a  st include:.**.*
f590: 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73 74 69  *    *  The esti
f5a0: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
f5b0: 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
f5c0: 65 20 72 65 74 72 69 65 76 65 64 2e 20 20 28 54  e retrieved.  (T
f5d0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65  he.**       fewe
f5e0: 72 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a  r the better.).*
f5f0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68  *.**    *  Wheth
f600: 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e  er or not sortin
f610: 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a  g must occur..**
f620: 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65  .**    *  Whethe
f630: 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d  r or not there m
f640: 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65 20  ust be separate 
f650: 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a  lookups in the.*
f660: 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e  *       index an
f670: 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  d in the main ta
f680: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
f690: 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
f6a0: 45 44 20 42 59 20 63 6c 61 75 73 65 20 61 74 74  ED BY clause att
f6b0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62  ached to the tab
f6c0: 6c 65 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  le in the SELECT
f6d0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  .** statement, t
f6e0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
f6f0: 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73  n only considers
f700: 20 70 6c 61 6e 73 20 75 73 69 6e 67 20 74 68 65   plans using the
f710: 20 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78   .** named index
f720: 2e 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20  . If one cannot 
f730: 62 65 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  be found, then t
f740: 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 73 74  he returned cost
f750: 20 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49   is.** SQLITE_BI
f760: 47 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c 61 6e  G_DBL. If a plan
f770: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
f780: 61 74 20 75 73 65 73 20 74 68 65 20 6e 61 6d 65  at uses the name
f790: 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74 68 65  d index, .** the
f7a0: 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 63 61  n the cost is ca
f7b0: 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68 65 20  lculated in the 
f7c0: 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  usual way..**.**
f7d0: 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45 58 45   If a NOT INDEXE
f7e0: 44 20 63 6c 61 75 73 65 20 77 61 73 20 61 74 74  D clause was att
f7f0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62  ached to the tab
f800: 6c 65 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  le in the SELECT
f810: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20   .** statement, 
f820: 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73 20  then no indexes 
f830: 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20  are considered. 
f840: 48 6f 77 65 76 65 72 2c 20 74 68 65 20 73 65 6c  However, the sel
f850: 65 63 74 65 64 20 0a 2a 2a 20 70 6c 61 6e 20 6d  ected .** plan m
f860: 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20 61 64  ay still take ad
f870: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 74  vantage of the t
f880: 61 62 6c 65 73 20 62 75 69 6c 74 2d 69 6e 20 72  ables built-in r
f890: 6f 77 69 64 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a  owid.** index..*
f8a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
f8b0: 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  stIndex(.  Parse
f8c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
f8d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
f8e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
f8f0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
f900: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
f910: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
f920: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
f930: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
f940: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
f950: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
f960: 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61  earch */.  Bitma
f970: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
f980: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
f990: 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
f9a0: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
f9b0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
f9c0: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
f9d0: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
f9e0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  Y clause */.  Wh
f9f0: 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20  ereCost *pCost  
fa00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
fa10: 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70  est cost query p
fa20: 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  lan */.){.  Wher
fa30: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
fa40: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
fa50: 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
fa60: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
fa70: 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72    int iCur = pSr
fa80: 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a  c->iCursor;   /*
fa90: 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
faa0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61  he table to be a
fab0: 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64  ccessed */.  Ind
fac0: 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20  ex *pProbe;     
fad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
fae0: 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c  ndex we are eval
faf0: 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  uating */.  int 
fb00: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
fb10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
fb20: 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
fb30: 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e  se order */.  in
fb40: 74 20 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  t wsFlags;      
fb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
fb60: 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
fb70: 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20 69  th pProbe */.  i
fb80: 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
fb90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
fba0: 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
fbb0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
fbc0: 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b    int eqTermMask
fbd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
fbe0: 20 4d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65   Mask of valid e
fbf0: 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72  quality operator
fc00: 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f  s */.  double co
fc10: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
fc20: 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73     /* Cost of us
fc30: 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20  ing pProbe */.  
fc40: 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20  double nRow;    
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
fc60: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
fc70: 6f 66 20 72 6f 77 73 20 69 6e 20 72 65 73 75 6c  of rows in resul
fc80: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69  t set */.  int i
fc90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fca0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
fcb0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 42 69 74 6d  ounter */.  Bitm
fcc0: 61 73 6b 20 6d 61 73 6b 53 72 63 3b 20 20 20 20  ask maskSrc;    
fcd0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
fce0: 73 6b 20 66 6f 72 20 74 68 65 20 70 53 72 63 20  sk for the pSrc 
fcf0: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 57 48 45 52  table */..  WHER
fd00: 45 54 52 41 43 45 28 28 22 62 65 73 74 49 6e 64  ETRACE(("bestInd
fd10: 65 78 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52 65  ex: tbl=%s notRe
fd20: 61 64 79 3d 25 6c 6c 78 5c 6e 22 2c 20 70 53 72  ady=%llx\n", pSr
fd30: 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 6e  c->pTab->zName,n
fd40: 6f 74 52 65 61 64 79 29 29 3b 0a 20 20 70 50 72  otReady));.  pPr
fd50: 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  obe = pSrc->pTab
fd60: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 69 66 28 20  ->pIndex;.  if( 
fd70: 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  pSrc->notIndexed
fd80: 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   ){.    pProbe =
fd90: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
fda0: 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 6e   the table has n
fdb0: 6f 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  o indices and th
fdc0: 65 72 65 20 61 72 65 20 6e 6f 20 74 65 72 6d 73  ere are no terms
fdd0: 20 69 6e 20 74 68 65 20 77 68 65 72 65 0a 20 20   in the where.  
fde0: 2a 2a 20 63 6c 61 75 73 65 20 74 68 61 74 20 72  ** clause that r
fdf0: 65 66 65 72 20 74 6f 20 74 68 65 20 52 4f 57 49  efer to the ROWI
fe00: 44 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  D, then we will 
fe10: 6e 65 76 65 72 20 62 65 20 61 62 6c 65 20 74 6f  never be able to
fe20: 20 64 6f 0a 20 20 2a 2a 20 61 6e 79 74 68 69 6e   do.  ** anythin
fe30: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 66  g other than a f
fe40: 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 6f  ull table scan o
fe50: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 57  n this table.  W
fe60: 65 20 6d 69 67 68 74 20 61 73 0a 20 20 2a 2a 20  e might as.  ** 
fe70: 77 65 6c 6c 20 70 75 74 20 69 74 20 66 69 72 73  well put it firs
fe80: 74 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 6f 72  t in the join or
fe90: 64 65 72 2e 20 20 54 68 61 74 20 77 61 79 2c 20  der.  That way, 
fea0: 70 65 72 68 61 70 73 20 69 74 20 63 61 6e 20 62  perhaps it can b
feb0: 65 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65  e.  ** reference
fec0: 64 20 62 79 20 6f 74 68 65 72 20 74 61 62 6c 65  d by other table
fed0: 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  s in the join.. 
fee0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f   */.  memset(pCo
fef0: 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  st, 0, sizeof(*p
ff00: 43 6f 73 74 29 29 3b 0a 20 20 69 66 28 20 70 50  Cost));.  if( pP
ff10: 72 6f 62 65 3d 3d 30 20 26 26 0a 20 20 20 20 20  robe==0 &&.     
ff20: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
ff30: 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51  ur, -1, 0, WO_EQ
ff40: 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_IN|WO_LT|WO_
ff50: 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 30  LE|WO_GT|WO_GE,0
ff60: 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 28 70 4f  )==0 &&.     (pO
ff70: 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 21 73 6f  rderBy==0 || !so
ff80: 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43  rtableByRowid(iC
ff90: 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 57  ur, pOrderBy, pW
ffa0: 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 26 72 65  C->pMaskSet, &re
ffb0: 76 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  v)) ){.    retur
ffc0: 6e 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e  n;.  }.  pCost->
ffd0: 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  rCost = SQLITE_B
ffe0: 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 43 68  IG_DBL;..  /* Ch
fff0: 65 63 6b 20 66 6f 72 20 61 20 72 6f 77 69 64 3d  eck for a rowid=
10000 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e  EXPR or rowid IN
10010 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e   (...) constrain
10020 74 73 2e 20 49 66 20 74 68 65 72 65 20 77 61 73  ts. If there was
10030 0a 20 20 2a 2a 20 61 6e 20 49 4e 44 45 58 45 44  .  ** an INDEXED
10040 20 42 59 20 63 6c 61 75 73 65 20 61 74 74 61 63   BY clause attac
10050 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c  hed to this tabl
10060 65 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65  e, skip this ste
10070 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  p..  */.  if( !p
10080 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20  Src->pIndex ){. 
10090 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
100a0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
100b0 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
100c0 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
100d0 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
100e0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
100f0 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70  ;.      pCost->p
10100 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48  lan.wsFlags = WH
10110 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20 20  ERE_ROWID_EQ;.  
10120 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
10130 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
10140 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
10150 6f 77 69 64 3d 3d 20 69 73 20 61 6c 77 61 79 73  owid== is always
10160 20 74 68 65 20 62 65 73 74 20 70 69 63 6b 2e 20   the best pick. 
10170 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72 74 68 65 72   Look no further
10180 2e 20 20 42 65 63 61 75 73 65 20 6f 6e 6c 79 0a  .  Because only.
10190 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e          ** a sin
101a0 67 6c 65 20 72 6f 77 20 69 73 20 67 65 6e 65 72  gle row is gener
101b0 61 74 65 64 2c 20 6f 75 74 70 75 74 20 69 73 20  ated, output is 
101c0 61 6c 77 61 79 73 20 69 6e 20 73 6f 72 74 65 64  always in sorted
101d0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
101e0 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73    pCost->plan.ws
101f0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f  Flags = WHERE_RO
10200 57 49 44 5f 45 51 20 7c 20 57 48 45 52 45 5f 55  WID_EQ | WHERE_U
10210 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 70  NIQUE;.        p
10220 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d  Cost->plan.nEq =
10230 20 31 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52   1;.        WHER
10240 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 62 65 73  ETRACE(("... bes
10250 74 20 69 73 20 72 6f 77 69 64 5c 6e 22 29 29 3b  t is rowid\n"));
10260 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
10270 72 43 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rCost = 0;.     
10280 20 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d     pCost->nRow =
10290 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
102a0 72 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  rn;.      }else 
102b0 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
102c0 65 72 74 79 28 28 70 45 78 70 72 20 3d 20 70 54  erty((pExpr = pT
102d0 65 72 6d 2d 3e 70 45 78 70 72 29 2c 20 45 50 5f  erm->pExpr), EP_
102e0 78 49 73 53 65 6c 65 63 74 29 20 0a 20 20 20 20  xIsSelect) .    
102f0 20 20 20 20 20 20 20 20 20 26 26 20 70 45 78 70           && pExp
10300 72 2d 3e 78 2e 70 4c 69 73 74 20 0a 20 20 20 20  r->x.pList .    
10310 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
10320 52 6f 77 69 64 20 49 4e 20 28 4c 49 53 54 29 3a  Rowid IN (LIST):
10330 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77   cost is NlogN w
10340 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
10350 6d 62 65 72 20 6f 66 20 6c 69 73 74 0a 20 20 20  mber of list.   
10360 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73       ** elements
10370 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43  .  */.        pC
10380 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 70 43 6f  ost->rCost = pCo
10390 73 74 2d 3e 6e 52 6f 77 20 3d 20 70 45 78 70 72  st->nRow = pExpr
103a0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
103b0 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  ;.        pCost-
103c0 3e 72 43 6f 73 74 20 2a 3d 20 65 73 74 4c 6f 67  >rCost *= estLog
103d0 28 70 43 6f 73 74 2d 3e 72 43 6f 73 74 29 3b 0a  (pCost->rCost);.
103e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
103f0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e       /* Rowid IN
10400 20 28 53 45 4c 45 43 54 29 3a 20 63 6f 73 74 20   (SELECT): cost 
10410 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e  is NlogN where N
10420 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
10430 66 20 72 6f 77 73 0a 20 20 20 20 20 20 20 20 2a  f rows.        *
10440 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
10450 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 65 6c  of the inner sel
10460 65 63 74 2e 20 20 57 65 20 68 61 76 65 20 6e 6f  ect.  We have no
10470 20 77 61 79 20 74 6f 20 65 73 74 69 6d 61 74 65   way to estimate
10480 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
10490 20 76 61 6c 75 65 20 73 6f 20 6d 61 6b 65 20 61   value so make a
104a0 20 77 69 6c 64 20 67 75 65 73 73 2e 20 2a 2f 0a   wild guess. */.
104b0 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e          pCost->n
104c0 52 6f 77 20 3d 20 31 30 30 3b 0a 20 20 20 20 20  Row = 100;.     
104d0 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
104e0 3d 20 32 30 30 3b 0a 20 20 20 20 20 20 7d 0a 20  = 200;.      }. 
104f0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
10500 28 22 2e 2e 2e 20 72 6f 77 69 64 20 49 4e 20 63  ("... rowid IN c
10510 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 70 43  ost: %.9g\n", pC
10520 6f 73 74 2d 3e 72 43 6f 73 74 29 29 3b 0a 20 20  ost->rCost));.  
10530 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 45 73    }.  .    /* Es
10540 74 69 6d 61 74 65 20 74 68 65 20 63 6f 73 74 20  timate the cost 
10550 6f 66 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e  of a table scan.
10560 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 6b    If we do not k
10570 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20 20 20  now how many.   
10580 20 2a 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20   ** entries are 
10590 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 75 73  in the table, us
105a0 65 20 31 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61  e 1 million as a
105b0 20 67 75 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20   guess..    */. 
105c0 20 20 20 63 6f 73 74 20 3d 20 70 50 72 6f 62 65     cost = pProbe
105d0 20 3f 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   ? pProbe->aiRow
105e0 45 73 74 5b 30 5d 20 3a 20 31 30 30 30 30 30 30  Est[0] : 1000000
105f0 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
10600 28 28 22 2e 2e 2e 20 74 61 62 6c 65 20 73 63 61  (("... table sca
10610 6e 20 62 61 73 65 20 63 6f 73 74 3a 20 25 2e 39  n base cost: %.9
10620 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
10630 20 20 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52    wsFlags = WHER
10640 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 20  E_ROWID_RANGE;. 
10650 20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66   .    /* Check f
10660 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
10670 6e 20 61 20 72 61 6e 67 65 20 6f 66 20 72 6f 77  n a range of row
10680 69 64 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73  ids in a table s
10690 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  can..    */.    
106a0 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
106b0 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
106c0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
106d0 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
106e0 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  E, 0);.    if( p
106f0 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66  Term ){.      if
10700 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
10710 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
10720 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c  dy, WO_LT|WO_LE,
10730 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 77   0) ){.        w
10740 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
10750 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
10760 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f     cost /= 3;  /
10770 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77  * Guess that row
10780 69 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61 74  id<EXPR eliminat
10790 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 66  es two-thirds of
107a0 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 7d   rows */.      }
107b0 0a 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54  .      if( findT
107c0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
107d0 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
107e0 47 54 7c 57 4f 5f 47 45 2c 20 30 29 20 29 7b 0a  GT|WO_GE, 0) ){.
107f0 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
10800 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  |= WHERE_BTM_LIM
10810 49 54 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74  IT;.        cost
10820 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73   /= 3;  /* Guess
10830 20 74 68 61 74 20 72 6f 77 69 64 3e 45 58 50 52   that rowid>EXPR
10840 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d   eliminates two-
10850 74 68 69 72 64 73 20 6f 66 20 72 6f 77 73 20 2a  thirds of rows *
10860 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
10870 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
10880 20 72 6f 77 69 64 20 72 61 6e 67 65 20 72 65 64   rowid range red
10890 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  uces cost to %.9
108a0 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
108b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77    }else{.      w
108c0 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  sFlags = 0;.    
108d0 7d 0a 20 20 20 20 6e 52 6f 77 20 3d 20 63 6f 73  }.    nRow = cos
108e0 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  t;.  .    /* If 
108f0 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 64  the table scan d
10900 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20  oes not satisfy 
10910 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
10920 75 73 65 2c 20 69 6e 63 72 65 61 73 65 0a 20 20  use, increase.  
10930 20 20 2a 2a 20 74 68 65 20 63 6f 73 74 20 62 79    ** the cost by
10940 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f 76 65 72 20   NlogN to cover 
10950 74 68 65 20 65 78 70 65 6e 73 65 20 6f 66 20 73  the expense of s
10960 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  orting. */.    i
10970 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
10980 20 20 20 20 20 69 66 28 20 73 6f 72 74 61 62 6c       if( sortabl
10990 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70  eByRowid(iCur, p
109a0 4f 72 64 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d  OrderBy, pWC->pM
109b0 61 73 6b 53 65 74 2c 20 26 72 65 76 29 20 29 7b  askSet, &rev) ){
109c0 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
109d0 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42   |= WHERE_ORDERB
109e0 59 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Y|WHERE_ROWID_RA
109f0 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  NGE;.        if(
10a00 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20   rev ){.        
10a10 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
10a20 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20  RE_REVERSE;.    
10a30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
10a40 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20  e{.        cost 
10a50 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63  += cost*estLog(c
10a60 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 57 48  ost);.        WH
10a70 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73  ERETRACE(("... s
10a80 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73  orting increases
10a90 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22   cost to %.9g\n"
10aa0 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20  , cost));.      
10ab0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
10ac0 63 6f 73 74 3c 70 43 6f 73 74 2d 3e 72 43 6f 73  cost<pCost->rCos
10ad0 74 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 73 74  t ){.      pCost
10ae0 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a  ->rCost = cost;.
10af0 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e 52 6f        pCost->nRo
10b00 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20  w = nRow;.      
10b10 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
10b20 61 67 73 20 3d 20 77 73 46 6c 61 67 73 3b 0a 20  ags = wsFlags;. 
10b30 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65     }.  }..#ifnde
10b40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  f SQLITE_OMIT_OR
10b50 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
10b60 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
10b70 20 4f 52 2d 63 6c 61 75 73 65 20 74 68 61 74 20   OR-clause that 
10b80 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 6c  can be used to l
10b90 6f 6f 6b 20 75 70 20 74 68 65 20 74 61 62 6c 65  ook up the table
10ba0 2e 0a 20 20 2a 2f 0a 20 20 6d 61 73 6b 53 72 63  ..  */.  maskSrc
10bb0 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e   = getMask(pWC->
10bc0 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  pMaskSet, iCur);
10bd0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72  .  for(i=0, pTer
10be0 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
10bf0 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
10c00 72 6d 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  rm++){.    Where
10c10 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20  Clause tempWC;. 
10c20 20 20 20 74 65 6d 70 57 43 20 3d 20 2a 70 57 43     tempWC = *pWC
10c30 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
10c40 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f  >eOperator==WO_O
10c50 52 20 0a 20 20 20 20 20 20 20 20 26 26 20 28 28  R .        && ((
10c60 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
10c70 20 26 20 7e 6d 61 73 6b 53 72 63 29 20 26 20 6e   & ~maskSrc) & n
10c80 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20  otReady)==0.    
10c90 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75      && (pTerm->u
10ca0 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
10cb0 62 6c 65 20 26 20 6d 61 73 6b 53 72 63 29 21 3d  ble & maskSrc)!=
10cc0 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  0 ){.      Where
10cd0 43 6c 61 75 73 65 20 2a 70 4f 72 57 43 20 3d 20  Clause *pOrWC = 
10ce0 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
10cf0 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65  o->wc;.      Whe
10d00 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
10d10 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
10d20 20 20 20 20 69 6e 74 20 73 6f 72 74 61 62 6c 65      int sortable
10d30 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 75 62   = 0;.      doub
10d40 6c 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a 20  le rTotal = 0;. 
10d50 20 20 20 20 20 6e 52 6f 77 20 3d 20 30 3b 0a 20       nRow = 0;. 
10d60 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 4f       for(j=0, pO
10d70 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20  rTerm=pOrWC->a; 
10d80 6a 3c 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 3b 20  j<pOrWC->nTerm; 
10d90 6a 2b 2b 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  j++, pOrTerm++){
10da0 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6f  .        WhereCo
10db0 73 74 20 73 54 65 72 6d 43 6f 73 74 3b 0a 20 20  st sTermCost;.  
10dc0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
10dd0 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64  (("... Multi-ind
10de0 65 78 20 4f 52 20 74 65 73 74 69 6e 67 20 66 6f  ex OR testing fo
10df0 72 20 74 65 72 6d 20 25 64 20 6f 66 20 25 64 2e  r term %d of %d.
10e00 2e 2e 2e 5c 6e 22 2c 20 6a 2c 69 29 29 3b 0a 20  ...\n", j,i));. 
10e10 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
10e20 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
10e30 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  O_AND ){.       
10e40 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
10e50 70 41 6e 64 57 43 20 3d 20 26 70 4f 72 54 65 72  pAndWC = &pOrTer
10e60 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
10e70 63 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  c;.          bes
10e80 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
10e90 41 6e 64 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  AndWC, pSrc, not
10ea0 52 65 61 64 79 2c 20 30 2c 20 26 73 54 65 72 6d  Ready, 0, &sTerm
10eb0 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cost);.        }
10ec0 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
10ed0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
10ee0 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ur ){.          
10ef0 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65  tempWC.a = pOrTe
10f00 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  rm;.          te
10f10 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a  mpWC.nTerm = 1;.
10f20 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49 6e            bestIn
10f30 64 65 78 28 70 50 61 72 73 65 2c 20 26 74 65 6d  dex(pParse, &tem
10f40 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  pWC, pSrc, notRe
10f50 61 64 79 2c 20 30 2c 20 26 73 54 65 72 6d 43 6f  ady, 0, &sTermCo
10f60 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  st);.        }el
10f70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  se{.          co
10f80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
10f90 7d 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c  }.        rTotal
10fa0 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e 72 43   += sTermCost.rC
10fb0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f  ost;.        nRo
10fc0 77 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e 6e  w += sTermCost.n
10fd0 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Row;.        if(
10fe0 20 72 54 6f 74 61 6c 3e 3d 70 43 6f 73 74 2d 3e   rTotal>=pCost->
10ff0 72 43 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a 20  rCost ) break;. 
11000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11010 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 7b 0a   pOrderBy!=0 ){.
11020 20 20 20 20 20 20 20 20 69 66 28 20 73 6f 72 74          if( sort
11030 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72  ableByRowid(iCur
11040 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 57 43 2d  , pOrderBy, pWC-
11050 3e 70 4d 61 73 6b 53 65 74 2c 20 26 72 65 76 29  >pMaskSet, &rev)
11060 20 26 26 20 21 72 65 76 20 29 7b 0a 20 20 20 20   && !rev ){.    
11070 20 20 20 20 20 20 73 6f 72 74 61 62 6c 65 20 3d        sortable =
11080 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
11090 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 54 6f  e{.          rTo
110a0 74 61 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c  tal += nRow*estL
110b0 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  og(nRow);.      
110c0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
110d0 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63  "... sorting inc
110e0 72 65 61 73 65 73 20 4f 52 20 63 6f 73 74 20 74  reases OR cost t
110f0 6f 20 25 2e 39 67 5c 6e 22 2c 20 72 54 6f 74 61  o %.9g\n", rTota
11100 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  l));.        }. 
11110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45       }.      WHE
11120 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d 75  RETRACE(("... mu
11130 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f 73  lti-index OR cos
11140 74 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39 67  t=%.9g nrow=%.9g
11150 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
11160 20 20 20 20 20 20 20 72 54 6f 74 61 6c 2c 20 6e         rTotal, n
11170 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 69 66 28  Row));.      if(
11180 20 72 54 6f 74 61 6c 3c 70 43 6f 73 74 2d 3e 72   rTotal<pCost->r
11190 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Cost ){.        
111a0 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 72  pCost->rCost = r
111b0 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 70  Total;.        p
111c0 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f  Cost->nRow = nRo
111d0 77 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  w;.        pCost
111e0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  ->plan.wsFlags =
111f0 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b   WHERE_MULTI_OR;
11200 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
11210 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 20 3d 20 70  plan.u.pTerm = p
11220 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
11230 28 20 73 6f 72 74 61 62 6c 65 20 29 7b 0a 20 20  ( sortable ){.  
11240 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70          pCost->p
11250 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48  lan.wsFlags = WH
11260 45 52 45 5f 4f 52 44 45 52 42 59 7c 57 48 45 52  ERE_ORDERBY|WHER
11270 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
11280 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11290 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
112a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
112b0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
112c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 53  ..  /* If the pS
112d0 72 63 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  rc table is the 
112e0 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
112f0 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20   LEFT JOIN then 
11300 77 65 20 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20  we may not.  ** 
11310 75 73 65 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  use an index to 
11320 73 61 74 69 73 66 79 20 49 53 20 4e 55 4c 4c 20  satisfy IS NULL 
11330 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74  constraints on t
11340 68 61 74 20 74 61 62 6c 65 2e 20 20 54 68 69 73  hat table.  This
11350 20 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73 65   is.  ** because
11360 20 63 6f 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65   columns might e
11370 6e 64 20 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c  nd up being NULL
11380 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 64 6f   if the table do
11390 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20  es not match -. 
113a0 20 2a 2a 20 61 20 63 69 72 63 75 6d 73 74 61 6e   ** a circumstan
113b0 63 65 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  ce which the ind
113c0 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75  ex cannot help u
113d0 73 20 64 69 73 63 6f 76 65 72 2e 20 20 54 69 63  s discover.  Tic
113e0 6b 65 74 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a  ket #2177..  */.
113f0 20 20 69 66 28 20 28 70 53 72 63 2d 3e 6a 6f 69    if( (pSrc->joi
11400 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
11410 21 3d 30 20 29 7b 0a 20 20 20 20 65 71 54 65 72  !=0 ){.    eqTer
11420 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  mMask = WO_EQ|WO
11430 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _IN;.  }else{.  
11440 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57    eqTermMask = W
11450 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
11460 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  NULL;.  }..  /* 
11470 4c 6f 6f 6b 20 61 74 20 65 61 63 68 20 69 6e 64  Look at each ind
11480 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ex..  */.  if( p
11490 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20  Src->pIndex ){. 
114a0 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63     pProbe = pSrc
114b0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  ->pIndex;.  }.  
114c0 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 50  for(; pProbe; pP
114d0 72 6f 62 65 3d 28 70 53 72 63 2d 3e 70 49 6e 64  robe=(pSrc->pInd
114e0 65 78 20 3f 20 30 20 3a 20 70 50 72 6f 62 65 2d  ex ? 0 : pProbe-
114f0 3e 70 4e 65 78 74 29 29 7b 0a 20 20 20 20 64 6f  >pNext)){.    do
11500 75 62 6c 65 20 69 6e 4d 75 6c 74 69 70 6c 69 65  uble inMultiplie
11510 72 20 3d 20 31 3b 0a 0a 20 20 20 20 57 48 45 52  r = 1;..    WHER
11520 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 69 6e 64  ETRACE(("... ind
11530 65 78 20 25 73 3a 5c 6e 22 2c 20 70 50 72 6f 62  ex %s:\n", pProb
11540 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20  e->zName));..   
11550 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
11560 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
11570 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  in the index tha
11580 74 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  t are satisfied.
11590 20 20 20 20 2a 2a 20 62 79 20 78 3d 45 58 50 52      ** by x=EXPR
115a0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20   constraints or 
115b0 78 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74  x IN (...) const
115c0 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  raints..    */. 
115d0 20 20 20 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a     wsFlags = 0;.
115e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
115f0 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Probe->nColumn; 
11600 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
11610 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  j = pProbe->aiCo
11620 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 70  lumn[i];.      p
11630 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
11640 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f  pWC, iCur, j, no
11650 74 52 65 61 64 79 2c 20 65 71 54 65 72 6d 4d 61  tReady, eqTermMa
11660 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20  sk, pProbe);.   
11670 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
11680 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 77  ) break;.      w
11690 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
116a0 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
116b0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
116c0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b  rator & WO_IN ){
116d0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
116e0 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
116f0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 77 73 46  xpr;.        wsF
11700 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
11710 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20  LUMN_IN;.       
11720 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
11730 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
11740 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
11750 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c         inMultipl
11760 69 65 72 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20  ier *= 25;.     
11770 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
11780 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20  pr->x.pList ){. 
11790 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69           inMulti
117a0 70 6c 69 65 72 20 2a 3d 20 70 45 78 70 72 2d 3e  plier *= pExpr->
117b0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  x.pList->nExpr +
117c0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
117d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
117e0 6e 52 6f 77 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nRow = pProbe->a
117f0 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d  iRowEst[i] * inM
11800 75 6c 74 69 70 6c 69 65 72 3b 0a 20 20 20 20 63  ultiplier;.    c
11810 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 65 73 74  ost = nRow * est
11820 4c 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65 72  Log(inMultiplier
11830 29 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b 0a  );.    nEq = i;.
11840 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
11850 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
11860 20 26 26 20 28 77 73 46 6c 61 67 73 20 26 20 57   && (wsFlags & W
11870 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d  HERE_COLUMN_IN)=
11880 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e  =0.         && n
11890 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq==pProbe->nCol
118a0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 77 73 46  umn ){.      wsF
118b0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
118c0 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  IQUE;.    }.    
118d0 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
118e0 2e 2e 2e 20 6e 45 71 3d 25 64 20 69 6e 4d 75 6c  ... nEq=%d inMul
118f0 74 3d 25 2e 39 67 20 63 6f 73 74 3d 25 2e 39 67  t=%.9g cost=%.9g
11900 5c 6e 22 2c 6e 45 71 2c 69 6e 4d 75 6c 74 69 70  \n",nEq,inMultip
11910 6c 69 65 72 2c 63 6f 73 74 29 29 3b 0a 0a 20 20  lier,cost));..  
11920 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 61    /* Look for ra
11930 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nge constraints.
11940 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
11950 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  Eq<pProbe->nColu
11960 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  mn ){.      int 
11970 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  j = pProbe->aiCo
11980 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20  lumn[nEq];.     
11990 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
119a0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
119b0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
119c0 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
119d0 45 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  E, pProbe);.    
119e0 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
119f0 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
11a00 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
11a10 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66  ANGE;.        if
11a20 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
11a30 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
11a40 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
11a50 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20  pProbe) ){.     
11a60 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
11a70 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
11a80 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20  .          cost 
11a90 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20  /= 3;.          
11aa0 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20  nRow /= 3;.     
11ab0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
11ac0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
11ad0 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
11ae0 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70  , WO_GT|WO_GE, p
11af0 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20  Probe) ){.      
11b00 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
11b10 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
11b20 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f            cost /
11b30 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  = 3;.          n
11b40 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20  Row /= 3;.      
11b50 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52    }.        WHER
11b60 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20  ETRACE(("...... 
11b70 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f  range reduces co
11b80 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
11b90 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
11ba0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
11bb0 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   the additional 
11bc0 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
11bd0 69 66 20 74 68 61 74 20 69 73 20 61 20 66 61 63  if that is a fac
11be0 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
11bf0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
11c00 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c 61        if( (wsFla
11c10 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
11c20 4e 5f 49 4e 29 3d 3d 30 20 26 26 0a 20 20 20 20  N_IN)==0 &&.    
11c30 20 20 20 20 20 20 20 69 73 53 6f 72 74 69 6e 67         isSorting
11c40 49 6e 64 65 78 28 70 50 61 72 73 65 2c 70 57 43  Index(pParse,pWC
11c50 2d 3e 70 4d 61 73 6b 53 65 74 2c 70 50 72 6f 62  ->pMaskSet,pProb
11c60 65 2c 69 43 75 72 2c 70 4f 72 64 65 72 42 79 2c  e,iCur,pOrderBy,
11c70 6e 45 71 2c 26 72 65 76 29 20 29 7b 0a 20 20 20  nEq,&rev) ){.   
11c80 20 20 20 20 20 69 66 28 20 77 73 46 6c 61 67 73       if( wsFlags
11c90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11ca0 20 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45   wsFlags = WHERE
11cb0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20  _COLUMN_RANGE;. 
11cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11cd0 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
11ce0 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20  E_ORDERBY;.     
11cf0 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20     if( rev ){.  
11d00 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
11d10 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
11d20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11d40 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73   cost += cost*es
11d50 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20  tLog(cost);.    
11d60 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
11d70 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20  "...... orderby 
11d80 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 74  increases cost t
11d90 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
11da0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11db0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
11dc0 6f 20 73 65 65 20 69 66 20 77 65 20 63 61 6e 20  o see if we can 
11dd0 67 65 74 20 61 77 61 79 20 77 69 74 68 20 75 73  get away with us
11de0 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64  ing just the ind
11df0 65 78 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a  ex without.    *
11e00 2a 20 65 76 65 72 20 72 65 61 64 69 6e 67 20 74  * ever reading t
11e10 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68  he table.  If th
11e20 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
11e30 74 68 65 6e 20 68 61 6c 76 65 20 74 68 65 0a 20  then halve the. 
11e40 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68     ** cost of th
11e50 69 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f  is index..    */
11e60 0a 20 20 20 20 69 66 28 20 77 73 46 6c 61 67 73  .    if( wsFlags
11e70 20 26 26 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65   && pSrc->colUse
11e80 64 20 3c 20 28 28 28 42 69 74 6d 61 73 6b 29 31  d < (((Bitmask)1
11e90 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20  )<<(BMS-1)) ){. 
11ea0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
11eb0 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a   pSrc->colUsed;.
11ec0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
11ed0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
11ee0 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  robe->nColumn; j
11ef0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
11f00 20 78 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43   x = pProbe->aiC
11f10 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
11f20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b    if( x<BMS-1 ){
11f30 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d 20  .          m &= 
11f40 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  ~(((Bitmask)1)<<
11f50 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
11f60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11f70 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
11f80 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
11f90 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  _IDX_ONLY;.     
11fa0 20 20 20 63 6f 73 74 20 2f 3d 20 32 3b 0a 20 20     cost /= 2;.  
11fb0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
11fc0 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e  (("...... idx-on
11fd0 6c 79 20 72 65 64 75 63 65 73 20 63 6f 73 74 20  ly reduces cost 
11fe0 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  to %.9g\n", cost
11ff0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
12000 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
12010 73 20 69 6e 64 65 78 20 68 61 73 20 61 63 68 69  s index has achi
12020 65 76 65 64 20 74 68 65 20 6c 6f 77 65 73 74 20  eved the lowest 
12030 63 6f 73 74 20 73 6f 20 66 61 72 2c 20 74 68 65  cost so far, the
12040 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f  n use it..    */
12050 0a 20 20 20 20 69 66 28 20 77 73 46 6c 61 67 73  .    if( wsFlags
12060 21 3d 30 20 26 26 20 63 6f 73 74 20 3c 20 70 43  !=0 && cost < pC
12070 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20  ost->rCost ){.  
12080 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
12090 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70   = cost;.      p
120a0 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f  Cost->nRow = nRo
120b0 77 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  w;.      pCost->
120c0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 77  plan.wsFlags = w
120d0 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 43  sFlags;.      pC
120e0 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20  ost->plan.nEq = 
120f0 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nEq;.      asser
12100 74 28 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77  t( pCost->plan.w
12110 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
12120 4e 44 45 58 45 44 20 29 3b 0a 20 20 20 20 20 20  NDEXED );.      
12130 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49  pCost->plan.u.pI
12140 64 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20  dx = pProbe;.   
12150 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
12160 6f 72 74 20 74 68 65 20 62 65 73 74 20 72 65 73  ort the best res
12170 75 6c 74 0a 20 20 2a 2f 0a 20 20 70 43 6f 73 74  ult.  */.  pCost
12180 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  ->plan.wsFlags |
12190 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20  = eqTermMask;.  
121a0 57 48 45 52 45 54 52 41 43 45 28 28 22 62 65 73  WHERETRACE(("bes
121b0 74 20 69 6e 64 65 78 20 69 73 20 25 73 2c 20 63  t index is %s, c
121c0 6f 73 74 3d 25 2e 39 67 2c 20 6e 72 6f 77 3d 25  ost=%.9g, nrow=%
121d0 2e 39 67 2c 20 77 73 46 6c 61 67 73 3d 25 78 2c  .9g, wsFlags=%x,
121e0 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   nEq=%d\n",.    
121f0 20 20 20 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e      (pCost->plan
12200 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
12210 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 3f 0a 20  _INDEXED)!=0 ?. 
12220 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 73              pCos
12230 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  t->plan.u.pIdx->
12240 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e 65 29 22  zName : "(none)"
12250 2c 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 2c 0a 20  , pCost->nRow,. 
12260 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43         pCost->rC
12270 6f 73 74 2c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e  ost, pCost->plan
12280 2e 77 73 46 6c 61 67 73 2c 20 70 43 6f 73 74 2d  .wsFlags, pCost-
12290 3e 70 6c 61 6e 2e 6e 45 71 29 29 3b 0a 7d 0a 0a  >plan.nEq));.}..
122a0 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61  ./*.** Disable a
122b0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
122c0 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65  RE clause.  Exce
122d0 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62  pt, do not disab
122e0 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69  le the term.** i
122f0 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20  f it controls a 
12300 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
12310 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f  and it did not o
12320 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
12330 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63  ON.** or USING c
12340 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f  lause of that jo
12350 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64  in..**.** Consid
12360 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a  er the term t2.z
12370 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c  ='ok' in the fol
12380 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a  lowing queries:.
12390 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c  **.**   (1)  SEL
123a0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
123b0 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
123c0 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32  .a=t2.x WHERE t2
123d0 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29  .z='ok'.**   (2)
123e0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
123f0 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
12400 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  ON t1.a=t2.x AND
12410 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
12420 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (3)  SELECT * FR
12430 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20  OM t1, t2 WHERE 
12440 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
12450 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68  .z='ok'.**.** Th
12460 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64  e t2.z='ok' is d
12470 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69  isabled in the i
12480 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74  n (2) because it
12490 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69   originates.** i
124a0 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  n the ON clause.
124b0 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69    The term is di
124c0 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65  sabled in (3) be
124d0 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20  cause it is not 
124e0 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46  part.** of a LEF
124f0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49  T OUTER JOIN.  I
12500 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20  n (1), the term 
12510 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e  is not disabled.
12520 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67  .**.** Disabling
12530 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74   a term causes t
12540 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20  hat term to not 
12550 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65  be tested in the
12560 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
12570 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73  f the join.  Dis
12580 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74  abling is an opt
12590 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e  imization.  When
125a0 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73   terms are satis
125b0 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63  fied.** by indic
125c0 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74  es, we disable t
125d0 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72  hem to prevent r
125e0 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69  edundant tests i
125f0 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c  n the inner.** l
12600 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67  oop.  We would g
12610 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  et the correct r
12620 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e  esults if nothin
12630 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61  g were ever disa
12640 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69  bled,.** but joi
12650 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ns might run a l
12660 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54  ittle slower.  T
12670 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64  he trick is to d
12680 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a  isable as much.*
12690 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68  * as we can with
126a0 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f  out disabling to
126b0 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64  o much.  If we d
126c0 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20  isabled in (1), 
126d0 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20  we'd get.** the 
126e0 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53  wrong answer.  S
126f0 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a  ee ticket #813..
12700 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
12710 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65  isableTerm(Where
12720 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57  Level *pLevel, W
12730 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29  hereTerm *pTerm)
12740 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20  {.  if( pTerm.  
12750 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 28 70      && ALWAYS((p
12760 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
12770 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 29 0a  TERM_CODED)==0).
12780 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
12790 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c  ->iLeftJoin==0 |
127a0 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
127b0 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
127c0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20  EP_FromJoin)).  
127d0 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  ){.    pTerm->wt
127e0 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
127f0 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
12800 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
12810 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
12820 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
12830 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
12840 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
12850 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
12860 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
12870 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
12880 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
12890 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
128a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
128b0 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74  pply the affinit
128c0 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
128d0 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6e 20  ith the first n 
128e0 63 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78  columns of index
128f0 0a 2a 2a 20 70 49 64 78 20 74 6f 20 74 68 65 20  .** pIdx to the 
12900 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 6e 20  values in the n 
12910 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
12920 6e 67 20 61 74 20 62 61 73 65 2e 0a 2a 2f 0a 73  ng at base..*/.s
12930 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41  tatic void codeA
12940 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72  pplyAffinity(Par
12950 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
12960 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 49 6e 64  base, int n, Ind
12970 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28  ex *pIdx){.  if(
12980 20 6e 3e 30 20 29 7b 0a 20 20 20 20 56 64 62 65   n>0 ){.    Vdbe
12990 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
129a0 64 62 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dbe;.    assert(
129b0 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c   v!=0 );.    sql
129c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
129d0 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62  , OP_Affinity, b
129e0 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  ase, n);.    sql
129f0 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
12a00 79 53 74 72 28 76 2c 20 70 49 64 78 29 3b 0a 20  yStr(v, pIdx);. 
12a10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
12a20 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
12a30 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  e(pParse, base, 
12a40 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  n);.  }.}.../*.*
12a50 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12a60 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75  for a single equ
12a70 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68  ality term of th
12a80 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
12a90 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   An equality.** 
12aa0 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68  term can be eith
12ab0 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49  er X=expr or X I
12ac0 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d  N (...).   pTerm
12ad0 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20   is the term to 
12ae0 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a  be .** coded..**
12af0 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20  .** The current 
12b00 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f  value for the co
12b10 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74  nstraint is left
12b20 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
12b30 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63  g..**.** For a c
12b40 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65  onstraint of the
12b50 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68   form X=expr, th
12b60 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
12b70 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74  evaluated and it
12b80 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c  s.** result is l
12b90 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  eft on the stack
12ba0 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e  .  For constrain
12bb0 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  ts of the form X
12bc0 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69   IN (...).** thi
12bd0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
12be0 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  p a loop that wi
12bf0 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ll iterate over 
12c00 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e  all values of X.
12c10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
12c20 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
12c30 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12c40 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
12c50 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
12c60 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
12c70 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65  erm,   /* The te
12c80 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
12c90 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64  clause to be cod
12ca0 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  ed */.  WhereLev
12cb0 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57  el *pLevel, /* W
12cc0 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  hen level of the
12cd0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20   FROM clause we 
12ce0 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
12cf0 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20  /.  int iTarget 
12d00 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d          /* Attem
12d10 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75  pt to leave resu
12d20 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69  lts in this regi
12d30 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
12d40 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
12d50 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20  Expr;.  Vdbe *v 
12d60 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
12d70 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20  .  int iReg;    
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12d90 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
12da0 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  g results */..  
12db0 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e  assert( iTarget>
12dc0 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f  0 );.  if( pX->o
12dd0 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20  p==TK_EQ ){.    
12de0 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  iReg = sqlite3Ex
12df0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
12e00 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
12e10 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c   iTarget);.  }el
12e20 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  se if( pX->op==T
12e30 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
12e40 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
12e50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12e60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
12e70 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e  , 0, iReg);.#ifn
12e80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12e90 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65  SUBQUERY.  }else
12ea0 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b  {.    int eType;
12eb0 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  .    int iTab;. 
12ec0 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
12ed0 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65   *pIn;..    asse
12ee0 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
12ef0 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  N );.    iReg = 
12f00 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79  iTarget;.    eTy
12f10 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
12f20 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
12f30 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 54 61 62  pX, 0);.    iTab
12f40 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
12f50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12f60 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
12f70 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  d, iTab, 0);.   
12f80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
12f90 20 22 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61   "%.*s", pX->spa
12fa0 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29  n.n, pX->span.z)
12fb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12fc0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
12fd0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
12fe0 42 4c 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70  BLE );.    if( p
12ff0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d  Level->u.in.nIn=
13000 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
13010 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71  el->addrNxt = sq
13020 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
13030 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  el(v);.    }.   
13040 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
13050 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n++;.    pLevel-
13060 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a  >u.in.aInLoop =.
13070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
13080 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50  ReallocOrFree(pP
13090 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c  arse->db, pLevel
130a0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a  ->u.in.aInLoop,.
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
130d0 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69  zeof(pLevel->u.i
130e0 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c  n.aInLoop[0])*pL
130f0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b  evel->u.in.nIn);
13100 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65  .    pIn = pLeve
13110 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b  l->u.in.aInLoop;
13120 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a  .    if( pIn ){.
13130 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65        pIn += pLe
13140 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20  vel->u.in.nIn - 
13150 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43  1;.      pIn->iC
13160 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  ur = iTab;.     
13170 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
13180 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
13190 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
131a0 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
131b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
131c0 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67  owid, iTab, iReg
131d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
131e0 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
131f0 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
13200 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13210 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30  _Column, iTab, 0
13220 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
13230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13240 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
13250 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20  sNull, iReg);.  
13260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
13270 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
13280 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 0;.    }.#endi
13290 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54  f.  }.  disableT
132a0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
132b0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65  m);.  return iRe
132c0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  g;.}../*.** Gene
132d0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
132e0 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c  ill evaluate all
132f0 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
13300 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a  raints for an.**
13310 20 69 6e 64 65 78 2e 20 20 54 68 65 20 76 61 6c   index.  The val
13320 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73  ues for all cons
13330 74 72 61 69 6e 74 73 20 61 72 65 20 6c 65 66 74  traints are left
13340 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   on the stack..*
13350 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
13360 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65  , consider table
13370 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29   t1(a,b,c,d,e,f)
13380 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61   with index i1(a
13390 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73  ,b,c)..** Suppos
133a0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
133b0 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d  se is this:  a==
133c0 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c  5 AND b IN (1,2,
133d0 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63  3) AND c>5 AND c
133e0 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  <10.** The index
133f0 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20   has as many as 
13400 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63  three equality c
13410 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20  onstraints, but 
13420 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70  in this.** examp
13430 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63  le, the third "c
13440 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  " value is an in
13450 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e  equality.  So on
13460 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74  ly two .** const
13470 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64  raints are coded
13480 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
13490 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f  will generate co
134a0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a  de to evaluate.*
134b0 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20  * a==5 and b IN 
134c0 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75  (1,2,3).  The cu
134d0 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
134e0 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65   a and b will be
134f0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f   stored.** in co
13500 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
13510 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ers and the inde
13520 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  x of the first r
13530 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72  egister is retur
13540 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ned..**.** In th
13550 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20  e example above 
13560 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69  nEq==2.  But thi
13570 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72  s subroutine wor
13580 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65  ks for any value
13590 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75  .** of nEq inclu
135a0 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d  ding 0.  If nEq=
135b0 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  =0, this routine
135c0 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d   is nearly a no-
135d0 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  op..** The only 
135e0 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73  thing it does is
135f0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c   allocate the pL
13600 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72  evel->iMem memor
13610 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  y cell..**.** Th
13620 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79  is routine alway
13630 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c  s allocates at l
13640 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20  east one memory 
13650 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73  cell and returns
13660 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66  .** the index of
13670 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
13680 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  l. The code that
13690 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72  .** calls this r
136a0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20  outine will use 
136b0 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  that memory cell
136c0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65   to store the te
136d0 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79  rmination.** key
136e0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   value of the lo
136f0 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d  op.  If one or m
13700 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  ore IN operators
13710 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a   appear, then.**
13720 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
13730 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74  locates an addit
13740 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79  ional nEq memory
13750 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72   cells for inter
13760 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73  nal.** use..*/.s
13770 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c  tatic int codeAl
13780 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
13790 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
137a0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
137b0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
137c0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
137d0 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e  el,   /* Which n
137e0 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
137f0 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f  e FROM we are co
13800 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43  ding */.  WhereC
13810 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
13820 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
13830 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  use */.  Bitmask
13840 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
13850 2a 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66  * Which parts of
13860 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79   FROM have not y
13870 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f  et been coded */
13880 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67  .  int nExtraReg
13890 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
138a0 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
138b0 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
138c0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  e */.){.  int nE
138d0 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  q = pLevel->plan
138e0 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65 20 6e  .nEq;   /* The n
138f0 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
13900 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  N constraints to
13910 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20   code */.  Vdbe 
13920 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
13930 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
13940 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  vm under constru
13950 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78  ction */.  Index
13960 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
13970 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13980 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64  index being used
13990 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a   for this loop *
139a0 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  /.  int iCur = p
139b0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20  Level->iTabCur; 
139c0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
139d0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
139e0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
139f0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
13a00 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73  /* A single cons
13a10 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  traint term */. 
13a20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13a40 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
13a50 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b  /.  int regBase;
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
13a80 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  er */.  int nReg
13a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13aa0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13ab0 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
13ac0 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 2f  allocate */..  /
13ad0 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73  * This module is
13ae0 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20   only called on 
13af0 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74  query plans that
13b00 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a   use an index. *
13b10 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76  /.  assert( pLev
13b20 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
13b30 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
13b40 20 29 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 65   );.  pIdx = pLe
13b50 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
13b60 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
13b70 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
13b80 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
13b90 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
13ba0 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
13bb0 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
13bc0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
13bd0 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Reg = pLevel->pl
13be0 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52  an.nEq + nExtraR
13bf0 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  eg;.  pParse->nM
13c00 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 2f  em += nReg;..  /
13c10 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
13c20 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
13c30 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
13c40 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
13c50 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a  >=nEq );.  for(j
13c60 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
13c70 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20  .    int r1;.   
13c80 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61   int k = pIdx->a
13c90 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
13ca0 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
13cb0 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
13cc0 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d  otReady, pLevel-
13cd0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70  >plan.wsFlags, p
13ce0 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 4e 45  Idx);.    if( NE
13cf0 56 45 52 28 70 54 65 72 6d 3d 3d 30 29 20 29 20  VER(pTerm==0) ) 
13d00 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
13d10 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
13d20 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
13d30 3d 3d 30 20 29 3b 0a 20 20 20 20 72 31 20 3d 20  ==0 );.    r1 = 
13d40 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
13d50 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
13d60 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73 65 2b  pLevel, regBase+
13d70 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d  j);.    if( r1!=
13d80 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20  regBase+j ){.   
13d90 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29     if( nReg==1 )
13da0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13db0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
13dc0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 29  pParse, regBase)
13dd0 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  ;.        regBas
13de0 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65  e = r1;.      }e
13df0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
13e00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13e10 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20  , OP_SCopy, r1, 
13e20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
13e30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
13e40 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
13e50 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
13e60 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
13e70 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
13e80 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
13e90 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
13ea0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
13eb0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29  O_ISNULL|WO_IN))
13ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
13ed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13ee0 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
13ef0 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e  Base+j, pLevel->
13f00 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a  addrBrk);.    }.
13f10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 67    }.  return reg
13f20 42 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Base;.}../*.** R
13f30 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
13f40 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 70 57  e WhereClause pW
13f50 43 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 74 65  C contains no te
13f60 72 6d 73 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  rms that.** are 
13f70 6e 6f 74 20 76 69 72 74 75 61 6c 20 61 6e 64 20  not virtual and 
13f80 77 68 69 63 68 20 68 61 76 65 20 6e 6f 74 20 62  which have not b
13f90 65 65 6e 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  een coded..**.**
13fa0 20 54 6f 20 70 75 74 20 69 74 20 61 6e 6f 74 68   To put it anoth
13fb0 65 72 20 77 61 79 2c 20 72 65 74 75 72 6e 20 54  er way, return T
13fc0 52 55 45 20 69 66 20 6e 6f 20 61 64 64 69 74 69  RUE if no additi
13fd0 6f 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  onal WHERE claus
13fe0 65 73 0a 2a 2a 20 74 65 73 74 73 20 61 72 65 20  es.** tests are 
13ff0 72 65 71 75 69 72 65 64 20 69 6e 20 6f 72 64 65  required in orde
14000 72 20 74 6f 20 65 73 74 61 62 6c 69 73 68 20 74  r to establish t
14010 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
14020 72 6f 77 0a 2a 2a 20 73 68 6f 75 6c 64 20 67 6f  row.** should go
14030 20 74 6f 20 6f 75 74 70 75 74 20 61 6e 64 20 72   to output and r
14040 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
14050 68 65 72 65 20 61 72 65 20 73 6f 6d 65 20 74 65  here are some te
14060 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 57 48  rms of.** the WH
14070 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
14080 6e 65 65 64 20 74 6f 20 62 65 20 76 61 6c 69 64  need to be valid
14090 61 74 65 64 20 62 65 66 6f 72 65 20 6f 75 74 70  ated before outp
140a0 75 74 69 6e 67 20 74 68 65 20 72 6f 77 2e 0a 2a  uting the row..*
140b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
140c0 72 65 52 6f 77 52 65 61 64 79 46 6f 72 4f 75 74  reRowReadyForOut
140d0 70 75 74 28 57 68 65 72 65 43 6c 61 75 73 65 20  put(WhereClause 
140e0 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65 54 65  *pWC){.  WhereTe
140f0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
14100 20 6a 3b 0a 20 0a 20 20 66 6f 72 28 70 54 65 72   j;. .  for(pTer
14110 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
14120 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
14130 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
14140 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
14150 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
14160 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 29  UAL|TERM_CODED))
14170 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
14180 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
14190 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
141a0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73  e code for the s
141b0 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76  tart of the iLev
141c0 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68  el-th loop in th
141d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
141e0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
141f0 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70 57   described by pW
14200 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Info..*/.static 
14210 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c  Bitmask codeOneL
14220 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65 72  oopStart(.  Wher
14230 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
14240 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66   /* Complete inf
14250 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
14260 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
14270 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
14280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
14290 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e  ch level of pWIn
142a0 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62  fo->a[] should b
142b0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75 38 20  e coded */.  u8 
142c0 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
142d0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
142e0 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
142f0 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
14300 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  nt.h */.  Bitmas
14310 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f  k notReady     /
14320 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20 61  * Which tables a
14330 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  re currently ava
14340 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  ilable */.){.  i
14350 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  nt j, k;        
14360 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
14370 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
14380 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur;            /
14390 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
143a0 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
143b0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74  */.  int addrNxt
143c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  ;         /* Whe
143d0 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f  re to jump to co
143e0 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
143f0 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a  next IN case */.
14400 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b    int omitTable;
14410 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
14420 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64  f we use the ind
14430 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  ex only */.  int
14440 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
14450 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
14460 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20  need to scan in 
14470 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
14480 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
14490 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77  Level;  /* The w
144a0 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65  here level to be
144b0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
144c0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
144d0 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f   /* Decompositio
144e0 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
144f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
14500 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
14510 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
14520 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61    /* A WHERE cla
14530 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61  use term */.  Pa
14540 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14560 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
14570 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14590 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
145a0 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72  pared stmt under
145b0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a   constructions *
145c0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
145d0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
145e0 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
145f0 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f  se term being co
14600 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ded */.  int add
14610 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  rBrk;           
14620 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
14630 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
14640 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  ut of the loop *
14650 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
14660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14670 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
14680 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
14690 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  h next cycle */.
146a0 20 20 69 6e 74 20 72 65 67 52 6f 77 53 65 74 3b    int regRowSet;
146b0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
146c0 72 6f 77 69 64 73 20 74 6f 20 74 68 69 73 20 52  rowids to this R
146d0 6f 77 53 65 74 20 69 66 20 6e 6f 6e 2d 6e 65 67  owSet if non-neg
146e0 61 74 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20 63  ative */.  int c
146f0 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 3b 20  odeRowSetEarly; 
14700 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 64 65 78  /* True if index
14710 20 66 75 6c 6c 79 20 63 6f 6e 73 74 72 61 69 6e   fully constrain
14720 73 20 74 68 65 20 73 65 61 72 63 68 20 2a 2f 0a  s the search */.
14730 20 20 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70    ..  pParse = p
14740 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
14750 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
14760 62 65 3b 0a 20 20 70 57 43 20 3d 20 70 57 49 6e  be;.  pWC = pWIn
14770 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c 65 76 65  fo->pWC;.  pLeve
14780 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
14790 4c 65 76 65 6c 5d 3b 0a 20 20 70 54 61 62 49 74  Level];.  pTabIt
147a0 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  em = &pWInfo->pT
147b0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
147c0 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72  ->iFrom];.  iCur
147d0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
147e0 72 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d 20 28  rsor;.  bRev = (
147f0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
14800 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56  lags & WHERE_REV
14810 45 52 53 45 29 21 3d 30 3b 0a 20 20 6f 6d 69 74  ERSE)!=0;.  omit
14820 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d  Table = (pLevel-
14830 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
14840 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
14850 3d 30 3b 0a 20 20 72 65 67 52 6f 77 53 65 74 20  =0;.  regRowSet 
14860 3d 20 70 57 49 6e 66 6f 2d 3e 72 65 67 52 6f 77  = pWInfo->regRow
14870 53 65 74 3b 0a 20 20 63 6f 64 65 52 6f 77 53 65  Set;.  codeRowSe
14880 74 45 61 72 6c 79 20 3d 20 30 3b 0a 0a 20 20 2f  tEarly = 0;..  /
14890 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
148a0 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20  for the "break" 
148b0 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69  and "continue" i
148c0 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a  nstructions.  **
148d0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
148e0 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20   loop.  Jump to 
148f0 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b  addrBrk to break
14900 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a   out of a loop..
14910 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e    ** Jump to con
14920 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74  t to go immediat
14930 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ely to the next 
14940 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
14950 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  .  ** loop..  **
14960 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65  .  ** When there
14970 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
14980 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65  or, we also have
14990 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62   a "addrNxt" lab
149a0 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61  el that.  ** mea
149b0 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  ns to continue w
149c0 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
149d0 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f  value combinatio
149e0 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68  n.  When.  ** th
149f0 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70  ere are no IN op
14a00 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63  erators in the c
14a10 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20  onstraints, the 
14a20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a  "addrNxt" label.
14a30 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
14a40 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20   as "addrBrk".. 
14a50 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20   */.  addrBrk = 
14a60 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20  pLevel->addrBrk 
14a70 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
14a80 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
14a90 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61  akeLabel(v);.  a
14aa0 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c  ddrCont = pLevel
14ab0 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c  ->addrCont = sql
14ac0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
14ad0 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  l(v);..  /* If t
14ae0 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74  his is the right
14af0 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
14b00 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c   OUTER JOIN, all
14b10 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69  ocate and.  ** i
14b20 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f  nitialize a memo
14b30 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63  ry cell that rec
14b40 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62  ords if this tab
14b50 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20  le matches any. 
14b60 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c   ** row of the l
14b70 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  eft table of the
14b80 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   join..  */.  if
14b90 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e  ( pLevel->iFrom>
14ba0 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30  0 && (pTabItem[0
14bb0 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
14bc0 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
14bd0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
14be0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
14bf0 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
14c00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14c10 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76  Integer, 0, pLev
14c20 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
14c30 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
14c40 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a  (v, "init LEFT J
14c50 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61  OIN no-match fla
14c60 67 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  g"));.  }..#ifnd
14c70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
14c80 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
14c90 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  (  (pLevel->plan
14ca0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
14cb0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
14cc0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  0 ){.    /* Case
14cd0 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69   0:  The table i
14ce0 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  s a virtual-tabl
14cf0 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c  e.  Use the VFil
14d00 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20  ter and VNext.  
14d10 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f    **          to
14d20 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
14d30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
14d40 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56   iReg;   /* P3 V
14d50 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c  alue for OP_VFil
14d60 74 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ter */.    sqlit
14d70 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
14d80 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c  VtabIdx = pLevel
14d90 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64  ->plan.u.pVtabId
14da0 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  x;.    int nCons
14db0 74 72 61 69 6e 74 20 3d 20 70 56 74 61 62 49 64  traint = pVtabId
14dc0 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  x->nConstraint;.
14dd0 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74      struct sqlit
14de0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14df0 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61 67  int_usage *aUsag
14e00 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e30 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43      pVtabIdx->aC
14e40 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a  onstraintUsage;.
14e50 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74      const struct
14e60 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
14e70 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73  onstraint *aCons
14e80 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20  traint =.       
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14eb0 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64           pVtabId
14ec0 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  x->aConstraint;.
14ed0 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
14ee0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
14ef0 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61  pParse, nConstra
14f00 69 6e 74 2b 32 29 3b 0a 20 20 20 20 70 50 61 72  int+2);.    pPar
14f10 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
14f20 63 68 65 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 6a  che++;.    for(j
14f30 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69  =1; j<=nConstrai
14f40 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
14f50 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73  for(k=0; k<nCons
14f60 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20  traint; k++){.  
14f70 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65        if( aUsage
14f80 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a  [k].argvIndex==j
14f90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
14fa0 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74  t iTerm = aConst
14fb0 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66  raint[k].iTermOf
14fc0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  fset;.          
14fd0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
14fe0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 20  disableColCache 
14ff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
15000 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
15010 72 73 65 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72  rse, pWC->a[iTer
15020 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m].pExpr->pRight
15030 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20  , iReg+j+1);.   
15040 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15060 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f        if( k==nCo
15070 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b  nstraint ) break
15080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
15090 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  rt( pParse->disa
150a0 62 6c 65 43 6f 6c 43 61 63 68 65 20 29 3b 0a 20  bleColCache );. 
150b0 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
150c0 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20  leColCache--;.  
150d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
150e0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
150f0 72 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78  r, pVtabIdx->idx
15100 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Num, iReg);.    
15110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15120 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
15130 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20   j-1, iReg+1);. 
15140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15150 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74  dOp4(v, OP_VFilt
15160 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  er, iCur, addrBr
15170 6b 2c 20 69 52 65 67 2c 20 70 56 74 61 62 49 64  k, iReg, pVtabId
15180 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20 20  x->idxStr,.     
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151a0 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54   pVtabIdx->needT
151b0 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20 50 34  oFreeIdxStr ? P4
151c0 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54  _MPRINTF : P4_ST
151d0 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74 61 62  ATIC);.    pVtab
151e0 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
151f0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 66  dxStr = 0;.    f
15200 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
15210 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
15220 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d     if( aUsage[j]
15230 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  .omit ){.       
15240 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
15250 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72  nstraint[j].iTer
15260 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
15270 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
15280 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54 65  vel, &pWC->a[iTe
15290 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rm]);.      }.  
152a0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
152b0 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
152c0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
152d0 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
152e0 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
152f0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15300 3b 0a 20 20 20 20 63 6f 64 65 52 6f 77 53 65 74  ;.    codeRowSet
15310 45 61 72 6c 79 20 3d 20 72 65 67 52 6f 77 53 65  Early = regRowSe
15320 74 3e 3d 30 20 3f 20 77 68 65 72 65 52 6f 77 52  t>=0 ? whereRowR
15330 65 61 64 79 46 6f 72 4f 75 74 70 75 74 28 70 57  eadyForOutput(pW
15340 43 29 20 3a 20 30 3b 0a 20 20 20 20 69 66 28 20  C) : 0;.    if( 
15350 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20  codeRowSetEarly 
15360 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15370 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15380 5f 56 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69  _VRowid, iCur, i
15390 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
153a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
153b0 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 2c 20 72   OP_RowSetAdd, r
153c0 65 67 52 6f 77 53 65 74 2c 20 69 52 65 67 29 3b  egRowSet, iReg);
153d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
153e0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
153f0 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ge(pParse, iReg,
15400 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
15410 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
15420 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
15430 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
15440 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
15450 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
15460 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20  RE_ROWID_EQ ){. 
15470 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57     /* Case 1:  W
15480 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72  e can directly r
15490 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c  eference a singl
154a0 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20  e row using an. 
154b0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65     **          e
154c0 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
154d0 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
154e0 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a  OWID field.  Or.
154f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
15500 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c  we reference mul
15510 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67  tiple rows using
15520 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e   a "rowid IN (..
15530 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  .)".    **      
15540 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
15550 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31     */.    int r1
15560 3b 0a 20 20 20 20 69 6e 74 20 72 74 6d 70 20 3d  ;.    int rtmp =
15570 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
15580 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
15590 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
155a0 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
155b0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
155c0 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61  WO_IN, 0);.    a
155d0 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
155e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
155f0 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29  Term->pExpr!=0 )
15600 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
15610 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
15620 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 61 73 73  =iCur );.    ass
15630 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
15640 30 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f  0 );.    r1 = co
15650 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
15660 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
15670 65 76 65 6c 2c 20 72 74 6d 70 29 3b 0a 20 20 20  evel, rtmp);.   
15680 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
15690 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20  l->addrNxt;.    
156a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
156b0 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
156c0 74 2c 20 72 31 2c 20 61 64 64 72 4e 78 74 29 3b  t, r1, addrNxt);
156d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
156e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
156f0 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64  Exists, iCur, ad
15700 64 72 4e 78 74 2c 20 72 31 29 3b 0a 20 20 20 20  drNxt, r1);.    
15710 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20  codeRowSetEarly 
15720 3d 20 28 70 57 43 2d 3e 6e 54 65 72 6d 3d 3d 31  = (pWC->nTerm==1
15730 20 26 26 20 72 65 67 52 6f 77 53 65 74 3e 3d 30   && regRowSet>=0
15740 29 20 3f 31 3a 30 3b 0a 20 20 20 20 69 66 28 20  ) ?1:0;.    if( 
15750 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20  codeRowSetEarly 
15760 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15770 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15780 5f 52 6f 77 53 65 74 41 64 64 2c 20 72 65 67 52  _RowSetAdd, regR
15790 6f 77 53 65 74 2c 20 72 31 29 3b 0a 20 20 20 20  owSet, r1);.    
157a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  }.    sqlite3Rel
157b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
157c0 73 65 2c 20 72 74 6d 70 29 3b 0a 20 20 20 20 56  se, rtmp);.    V
157d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
157e0 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65  pk"));.    pLeve
157f0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
15800 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65  .  }else if( pLe
15810 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
15820 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s & WHERE_ROWID_
15830 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20  RANGE ){.    /* 
15840 43 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65  Case 2:  We have
15850 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
15860 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
15870 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
15880 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
15890 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
158a0 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  op;.    int star
158b0 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e  t;.    int memEn
158c0 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  dValue = 0;.    
158d0 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
158e0 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61  t, *pEnd;..    a
158f0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
15900 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53 74 61 72  ==0 );.    pStar
15910 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  t = findTerm(pWC
15920 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
15930 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
15940 45 2c 20 30 29 3b 0a 20 20 20 20 70 45 6e 64 20  E, 0);.    pEnd 
15950 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
15960 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
15970 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c  dy, WO_LT|WO_LE,
15980 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65   0);.    if( bRe
15990 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  v ){.      pTerm
159a0 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
159b0 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
159c0 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65        pEnd = pTe
159d0 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rm;.    }.    if
159e0 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
159f0 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
15a00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
15a10 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64  xpression that d
15a20 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74  efines the start
15a30 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
15a40 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20  int r1, rTemp;  
15a50 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
15a60 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74  rs for holding t
15a70 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72  he start boundar
15a80 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  y */..      /* T
15a90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
15aa0 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78  stant maps TK_xx
15ab0 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72   codes into corr
15ac0 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20  esponding .     
15ad0 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73   ** seek opcodes
15ae0 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e  .  It depends on
15af0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72   a particular or
15b00 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a  dering of TK_xx.
15b10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
15b20 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b  onst u8 aMoveOp[
15b30 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
15b40 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50   /* TK_GT */  OP
15b50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20  _SeekGt,.       
15b60 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20      /* TK_LE */ 
15b70 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20   OP_SeekLe,.    
15b80 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20         /* TK_LT 
15b90 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20  */  OP_SeekLt,. 
15ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
15bb0 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65  GE */  OP_SeekGe
15bc0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
15bd0 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54  assert( TK_LE==T
15be0 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f  K_GT+1 );      /
15bf0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
15c00 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20  ordering.. */.  
15c10 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
15c20 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20  T==TK_GT+2 );   
15c30 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68     /*  ... of th
15c40 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e  e TK_xx values..
15c50 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
15c60 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b  t( TK_GE==TK_GT+
15c70 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e  3 );      /*  ..
15c80 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a  . is correcct. *
15c90 2f 0a 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53  /..      pX = pS
15ca0 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  tart->pExpr;.   
15cb0 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
15cc0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15cd0 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75  ( pStart->leftCu
15ce0 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
15cf0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
15d00 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15d10 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
15d20 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20   &rTemp);.      
15d30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15d40 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d  3(v, aMoveOp[pX-
15d50 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72  >op-TK_GT], iCur
15d60 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a  , addrBrk, r1);.
15d70 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
15d80 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
15d90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15da0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
15db0 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31  ge(pParse, r1, 1
15dc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15dd0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
15de0 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20  Parse, rTemp);. 
15df0 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
15e00 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29  (pLevel, pStart)
15e10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15e20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15e30 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f  dOp2(v, bRev ? O
15e40 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69  P_Last : OP_Rewi
15e50 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  nd, iCur, addrBr
15e60 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  k);.    }.    if
15e70 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ( pEnd ){.      
15e80 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20  Expr *pX;.      
15e90 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72  pX = pEnd->pExpr
15ea0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15eb0 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pX!=0 );.      a
15ec0 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66  ssert( pEnd->lef
15ed0 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
15ee0 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c  .      memEndVal
15ef0 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ue = ++pParse->n
15f00 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
15f10 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
15f20 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d  e, pX->pRight, m
15f30 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20  emEndValue);.   
15f40 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54     if( pX->op==T
15f50 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  K_LT || pX->op==
15f60 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20  TK_GT ){.       
15f70 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
15f80 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a   OP_Le : OP_Ge;.
15f90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15fa0 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
15fb0 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f  ev ? OP_Lt : OP_
15fc0 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Gt;.      }.    
15fd0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
15fe0 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20  evel, pEnd);.   
15ff0 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73   }.    start = s
16000 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16010 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c  tAddr(v);.    pL
16020 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20  evel->op = bRev 
16030 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e  ? OP_Prev : OP_N
16040 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ext;.    pLevel-
16050 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
16060 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61  pLevel->p2 = sta
16070 72 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  rt;.    pLevel->
16080 70 35 20 3d 20 28 70 53 74 61 72 74 3d 3d 30 20  p5 = (pStart==0 
16090 26 26 20 70 45 6e 64 3d 3d 30 29 20 3f 31 3a 30  && pEnd==0) ?1:0
160a0 3b 0a 20 20 20 20 63 6f 64 65 52 6f 77 53 65 74  ;.    codeRowSet
160b0 45 61 72 6c 79 20 3d 20 72 65 67 52 6f 77 53 65  Early = regRowSe
160c0 74 3e 3d 30 20 3f 20 77 68 65 72 65 52 6f 77 52  t>=0 ? whereRowR
160d0 65 61 64 79 46 6f 72 4f 75 74 70 75 74 28 70 57  eadyForOutput(pW
160e0 43 29 20 3a 20 30 3b 0a 20 20 20 20 69 66 28 20  C) : 0;.    if( 
160f0 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20  codeRowSetEarly 
16100 7c 7c 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  || testOp!=OP_No
16110 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  op ){.      int 
16120 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
16130 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
16140 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16150 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
16160 77 69 64 2c 20 69 43 75 72 2c 20 72 31 29 3b 0a  wid, iCur, r1);.
16170 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f 70        if( testOp
16180 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
16190 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
161a0 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70  AddOp3(v, testOp
161b0 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61  , memEndValue, a
161c0 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
161d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
161e0 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
161f0 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
16200 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
16210 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
16220 20 20 20 69 66 28 20 63 6f 64 65 52 6f 77 53 65     if( codeRowSe
16230 74 45 61 72 6c 79 20 29 7b 0a 20 20 20 20 20 20  tEarly ){.      
16240 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16250 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Op2(v, OP_RowSet
16260 41 64 64 2c 20 72 65 67 52 6f 77 53 65 74 2c 20  Add, regRowSet, 
16270 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r1);.      }.   
16280 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16290 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
162a0 20 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   r1);.    }.  }e
162b0 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
162c0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28  plan.wsFlags & (
162d0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
162e0 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  GE|WHERE_COLUMN_
162f0 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  EQ) ){.    /* Ca
16300 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75 73 69  se 3: A scan usi
16310 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20  ng an index..   
16320 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
16330 20 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61     The WHERE cla
16340 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  use may contain 
16350 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75  zero or more equ
16360 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20  ality .    **   
16370 20 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d        terms ("==
16380 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74  " or "IN" operat
16390 6f 72 73 29 20 74 68 61 74 20 72 65 66 65 72 20  ors) that refer 
163a0 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20  to the N.    ** 
163b0 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73          left-mos
163c0 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  t columns of the
163d0 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61   index. It may a
163e0 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  lso contain.    
163f0 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71 75  **         inequ
16400 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
16410 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c  s (>, <, >= or <
16420 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65  =) on the indexe
16430 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  d.    **        
16440 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d   column that imm
16450 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73  ediately follows
16460 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65   the N equalitie
16470 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20  s. Only .    ** 
16480 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
16490 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61  t-most column ca
164a0 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  n be an inequali
164b0 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75  ty - the rest mu
164c0 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  st.    **       
164d0 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61    use the "==" a
164e0 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  nd "IN" operator
164f0 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
16500 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20  if the .    **  
16510 20 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20         index is 
16520 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e  on (x,y,z), then
16530 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
16540 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a  lauses are all .
16550 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f      **         o
16560 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a  ptimized:.    **
16570 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
16580 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20     x=5.    **   
16590 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
165a0 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y=10.    **    
165b0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
165c0 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
165d0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
165e0 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20  >5 AND y<10.    
165f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
16600 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c  5 AND y=5 AND z<
16610 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  =10.    **.    *
16620 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c  *         The z<
16630 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66  10 term of the f
16640 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20  ollowing cannot 
16650 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20  be used, only.  
16660 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
16670 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a   x=5 term:.    *
16680 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
16690 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30      x=5 AND z<10
166a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
166b0 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20         N may be 
166c0 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
166d0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
166e0 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a  straints..    **
166f0 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72           If ther
16700 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c  e are no inequal
16710 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
16720 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20   then N is at.  
16730 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61    **         lea
16740 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20  st one..    **. 
16750 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
16760 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20  is case is also 
16770 75 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  used when there 
16780 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  are no WHERE cla
16790 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  use.    **      
167a0 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62     constraints b
167b0 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73  ut an index is s
167c0 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20  elected anyway, 
167d0 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20  in order.    ** 
167e0 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65          to force
167f0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65   the output orde
16800 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20  r to conform to 
16810 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20  an ORDER BY..   
16820 20 2a 2f 20 20 0a 20 20 20 20 69 6e 74 20 61 53   */  .    int aS
16830 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  tartOp[] = {.   
16840 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20     0,.      0,. 
16850 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20       OP_Rewind, 
16860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
16870 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
16880 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
16890 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  &  !bRev) */.   
168a0 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20     OP_Last,     
168b0 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21          /* 3: (!
168c0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
168d0 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
168e0 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
168f0 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20   OP_SeekGt,     
16900 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61        /* 4: (sta
16910 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
16920 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21  && !startEq && !
16930 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
16940 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20  P_SeekLt,       
16950 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74      /* 5: (start
16960 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
16970 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52   !startEq &&  bR
16980 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
16990 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20  SeekGe,         
169a0 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63    /* 6: (start_c
169b0 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
169c0 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76  startEq && !bRev
169d0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
169e0 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20 20  ekLe            
169f0 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 7: (start_con
16a00 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
16a10 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
16a20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
16a30 74 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20  t aEndOp[] = {. 
16a40 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20       OP_Noop,   
16a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
16a60 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74  (!end_constraint
16a70 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  s) */.      OP_I
16a80 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxGE,           
16a90 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 1: (end_cons
16aa0 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76  traints && !bRev
16ab0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
16ac0 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  xLT             
16ad0 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 2: (end_const
16ae0 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29 20  raints && bRev) 
16af0 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
16b00 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e  t nEq = pLevel->
16b10 70 6c 61 6e 2e 6e 45 71 3b 0a 20 20 20 20 69 6e  plan.nEq;.    in
16b20 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30  t isMinQuery = 0
16b30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
16b40 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   this is an opti
16b50 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e  mized SELECT min
16b60 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  (x).. */.    int
16b70 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
16b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73            /* Bas
16b90 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
16ba0 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61  ng constraint va
16bb0 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lues */.    int 
16bc0 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
16bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
16be0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20   register */.   
16bf0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
16c00 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a  geStart = 0;  /*
16c10 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
16c20 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
16c30 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65  start */.    Whe
16c40 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e  reTerm *pRangeEn
16c50 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65  d = 0;    /* Ine
16c60 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
16c70 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20  nt at range end 
16c80 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
16c90 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
16ca0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
16cb0 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73 20  ange start uses 
16cc0 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
16cd0 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20      int endEq;  
16ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cf0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
16d00 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e  e end uses ==, >
16d10 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
16d20 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  nt start_constra
16d30 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53  ints;       /* S
16d40 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73  tart of range is
16d50 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a   constrained */.
16d60 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
16d70 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
16d80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
16d90 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a  nstraint terms *
16da0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
16db0 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  x;         /* Th
16dc0 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
16dd0 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
16de0 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
16df0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
16e00 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
16e10 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
16e20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20   nExtraReg = 0; 
16e30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
16e40 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e  xtra registers n
16e50 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  eeded */.    int
16e60 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
16e70 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
16e80 20 6f 70 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20   opcode */..    
16e90 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
16ea0 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20  lan.u.pIdx;.    
16eb0 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
16ec0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 6b  ->iIdxCur;.    k
16ed0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
16ee0 6e 5b 6e 45 71 5d 3b 20 20 20 20 20 2f 2a 20 43  n[nEq];     /* C
16ef0 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61  olumn for inequa
16f00 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
16f10 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   */..    /* If t
16f20 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69  his loop satisfi
16f30 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20  es a sort order 
16f40 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65  (pOrderBy) reque
16f50 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20  st that .    ** 
16f60 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
16f70 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69  is function to i
16f80 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45  mplement a "SELE
16f90 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a  CT min(x) ..." .
16fa0 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68      ** query, th
16fb0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  en the caller wi
16fc0 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68  ll only allow th
16fd0 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f  e loop to run fo
16fe0 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c  r.    ** a singl
16ff0 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  e iteration. Thi
17000 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
17010 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72   first row retur
17020 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  ned.    ** shoul
17030 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c  d not have a NUL
17040 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  L value stored i
17050 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e  n 'x'. If column
17060 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74   'x' is.    ** t
17070 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74  he first one aft
17080 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  er the nEq equal
17090 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
170a0 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20  in the index,.  
170b0 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72    ** this requir
170c0 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20  es some special 
170d0 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f  handling..    */
170e0 0a 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46  .    if( (wctrlF
170f0 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
17100 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20  BY_MIN)!=0.     
17110 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  && (pLevel->plan
17120 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  .wsFlags&WHERE_O
17130 52 44 45 52 42 59 29 0a 20 20 20 20 20 26 26 20  RDERBY).     && 
17140 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e  (pIdx->nColumn>n
17150 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
17160 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64   /* assert( pOrd
17170 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  erBy->nExpr==1 )
17180 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73  ; */.      /* as
17190 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
171a0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[0].pExpr->iCol
171b0 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
171c0 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20  umn[nEq] ); */. 
171d0 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20       isMinQuery 
171e0 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
171f0 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
17200 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
17210 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
17220 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
17230 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
17240 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
17250 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
17260 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
17270 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
17280 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
17290 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45  ){.      pRangeE
172a0 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  nd = findTerm(pW
172b0 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
172c0 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f  eady, (WO_LT|WO_
172d0 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  LE), pIdx);.    
172e0 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
172f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
17300 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
17310 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
17320 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
17330 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66 69 6e  RangeStart = fin
17340 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
17350 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57   k, notReady, (W
17360 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64  O_GT|WO_GE), pId
17370 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  x);.      nExtra
17380 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
17390 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
173a0 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
173b0 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
173c0 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
173d0 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20  r IN.    ** and 
173e0 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73  store the values
173f0 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
17400 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
17410 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
17420 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42  starting at regB
17430 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
17440 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c  regBase = codeAl
17450 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70  lEqualityTerms(p
17460 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70  Parse, pLevel, p
17470 57 43 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45  WC, notReady, nE
17480 78 74 72 61 52 65 67 29 3b 0a 20 20 20 20 61 64  xtraReg);.    ad
17490 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
174a0 61 64 64 72 4e 78 74 3b 0a 0a 0a 20 20 20 20 2f  addrNxt;...    /
174b0 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
174c0 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65  g a reverse orde
174d0 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63  r scan on an asc
174e0 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72  ending index, or
174f0 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72  .    ** a forwar
17500 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  d order scan on 
17510 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
17520 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20  ex, interchange 
17530 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  the .    ** star
17540 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20  t and end terms 
17550 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64  (pRangeStart and
17560 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20   pRangeEnd)..   
17570 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 52 65 76   */.    if( bRev
17580 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  ==(pIdx->aSortOr
17590 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
175a0 5f 53 4f 5f 41 53 43 29 20 29 7b 0a 20 20 20 20  _SO_ASC) ){.    
175b0 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d    SWAP(WhereTerm
175c0 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70   *, pRangeEnd, p
175d0 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
175e0 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65   }..    testcase
175f0 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
17600 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
17610 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20  perator & WO_LE 
17620 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
17630 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
17640 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
17650 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
17660 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
17670 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61  pRangeEnd && pRa
17680 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
17690 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
176a0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
176b0 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e  eEnd && pRangeEn
176c0 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
176d0 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73 74 61 72  O_GE );.    star
176e0 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61  tEq = !pRangeSta
176f0 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72  rt || pRangeStar
17700 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  t->eOperator & (
17710 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
17720 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61    endEq =   !pRa
17730 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65  ngeEnd || pRange
17740 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
17750 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
17760 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
17770 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74  aints = pRangeSt
17780 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20  art || nEq>0;.. 
17790 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69     /* Seek the i
177a0 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74  ndex cursor to t
177b0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
177c0 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43  range. */.    nC
177d0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
177e0 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53  .    if( pRangeS
177f0 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  tart ){.      in
17800 74 20 64 63 63 20 3d 20 70 50 61 72 73 65 2d 3e  t dcc = pParse->
17810 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3b  disableColCache;
17820 0a 20 20 20 20 20 20 69 66 28 20 70 52 61 6e 67  .      if( pRang
17830 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  eEnd ){.        
17840 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
17850 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20  olCache++;.     
17860 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
17870 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
17880 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45   pRangeStart->pE
17890 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 72 65 67  xpr->pRight, reg
178a0 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
178b0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
178c0 43 6f 6c 43 61 63 68 65 20 3d 20 64 63 63 3b 0a  ColCache = dcc;.
178d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
178e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
178f0 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45  Null, regBase+nE
17900 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
17910 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
17920 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
17930 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20  isMinQuery ){.  
17940 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17950 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
17960 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
17970 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
17980 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
17990 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
179a0 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
179b0 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
179c0 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
179d0 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
179e0 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
179f0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 6f 70 20  , pIdx);.    op 
17a00 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72  = aStartOp[(star
17a10 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32  t_constraints<<2
17a20 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29  ) + (startEq<<1)
17a30 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73   + bRev];.    as
17a40 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20  sert( op!=0 );. 
17a50 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17a60 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20  =OP_Rewind );.  
17a70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17a80 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74  OP_Last );.    t
17a90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
17aa0 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65  SeekGt );.    te
17ab0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
17ac0 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73  eekGe );.    tes
17ad0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
17ae0 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74  ekLe );.    test
17af0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
17b00 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  kLt );.    sqlit
17b10 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17b20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
17b30 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 0a  rNxt, regBase, .
17b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b50 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54        SQLITE_INT
17b60 5f 54 4f 5f 50 54 52 28 6e 43 6f 6e 73 74 72 61  _TO_PTR(nConstra
17b70 69 6e 74 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  int), P4_INT32);
17b80 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
17b90 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
17ba0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
17bb0 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64  raint at the end
17bc0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   of the.    ** r
17bd0 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20  ange (if any).. 
17be0 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74     */.    nConst
17bf0 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
17c00 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29   if( pRangeEnd )
17c10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
17c20 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
17c30 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72  pRangeEnd->pExpr
17c40 2d 3e 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  ->pRight, regBas
17c50 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 73 71  e+nEq);.      sq
17c60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17c70 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
17c80 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
17c90 78 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 41  xt);.      codeA
17ca0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
17cb0 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45  rse, regBase, nE
17cc0 71 2b 31 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  q+1, pIdx);.    
17cd0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
17ce0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
17cf0 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62  op of the loop b
17d00 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65  ody */.    pLeve
17d10 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
17d20 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
17d30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
17d40 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75   if the index cu
17d50 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65  rsor is past the
17d60 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67   end of the rang
17d70 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61  e. */.    op = a
17d80 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64  EndOp[(pRangeEnd
17d90 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20   || nEq) * (1 + 
17da0 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74  bRev)];.    test
17db0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f  case( op==OP_Noo
17dc0 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  p );.    testcas
17dd0 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20  e( op==OP_IdxGE 
17de0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
17df0 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b   op==OP_IdxLT );
17e00 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f  .    if( op!=OP_
17e10 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Noop ){.      sq
17e20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17e30 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
17e40 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
17e50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17e60 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17e70 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 43 6f 6e  _INT_TO_PTR(nCon
17e80 73 74 72 61 69 6e 74 29 2c 20 50 34 5f 49 4e 54  straint), P4_INT
17e90 33 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  32);.      sqlit
17ea0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
17eb0 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31  , endEq!=bRev ?1
17ec0 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  :0);.    }..    
17ed0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
17ee0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
17ef0 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68  raints, check th
17f00 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  at the value.   
17f10 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
17f20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
17f30 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74   inequality cont
17f40 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c  rains is not NUL
17f50 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20  L..    ** If it 
17f60 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  is, jump to the 
17f70 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
17f80 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20  f the loop..    
17f90 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69  */.    r1 = sqli
17fa0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
17fb0 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63  arse);.    testc
17fc0 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ase( pLevel->pla
17fd0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
17fe0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20  E_BTM_LIMIT );. 
17ff0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
18000 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
18010 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
18020 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 70  MIT );.    if( p
18030 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
18040 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
18050 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
18060 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20  _LIMIT) ){.     
18070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18080 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
18090 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72   iIdxCur, nEq, r
180a0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
180b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
180c0 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64  P_IsNull, r1, ad
180d0 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 0a  drCont);.    }..
180e0 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
180f0 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66  table cursor, if
18100 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
18110 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
18120 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74  vel, pRangeStart
18130 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  );.    disableTe
18140 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
18150 65 45 6e 64 29 3b 0a 20 20 20 20 63 6f 64 65 52  eEnd);.    codeR
18160 6f 77 53 65 74 45 61 72 6c 79 20 3d 20 72 65 67  owSetEarly = reg
18170 52 6f 77 53 65 74 3e 3d 30 20 3f 20 77 68 65 72  RowSet>=0 ? wher
18180 65 52 6f 77 52 65 61 64 79 46 6f 72 4f 75 74 70  eRowReadyForOutp
18190 75 74 28 70 57 43 29 20 3a 20 30 3b 0a 20 20 20  ut(pWC) : 0;.   
181a0 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20   if( !omitTable 
181b0 7c 7c 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72  || codeRowSetEar
181c0 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ly ){.      sqli
181d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
181e0 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49   OP_IdxRowid, iI
181f0 64 78 43 75 72 2c 20 72 31 29 3b 0a 20 20 20 20  dxCur, r1);.    
18200 20 20 69 66 28 20 63 6f 64 65 52 6f 77 53 65 74    if( codeRowSet
18210 45 61 72 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  Early ){.       
18220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18230 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 41  p2(v, OP_RowSetA
18240 64 64 2c 20 72 65 67 52 6f 77 53 65 74 2c 20 72  dd, regRowSet, r
18250 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
18260 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18270 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18280 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 72 31 29  _Seek, iCur, r1)
18290 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73  ;  /* Deferred s
182a0 65 65 6b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  eek */.      }. 
182b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
182c0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
182d0 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20  Parse, r1);..   
182e0 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
182f0 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
18300 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
18310 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a   loop. Disable .
18320 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61      ** WHERE cla
18330 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72  use terms made r
18340 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20  edundant by the 
18350 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e  index range scan
18360 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 65  ..    */.    pLe
18370 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
18380 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
18390 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
183a0 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
183b0 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
183c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
183d0 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
183e0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
183f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
18400 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a  LTI_OR ){.    /*
18410 20 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f 72   Case 4:  Two or
18420 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79   more separately
18430 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
18440 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20  onnected by OR. 
18450 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
18460 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
18470 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
18480 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a  LE t1(a,b,c,d);.
18490 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
184a0 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
184b0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
184c0 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
184d0 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(b);.    **   C
184e0 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f  REATE INDEX i3 O
184f0 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a  N t1(c);.    **.
18500 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
18510 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
18520 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63  a=5 OR b=7 OR (c
18530 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20  =11 AND d=13).  
18540 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74    **.    ** In t
18550 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72  he example, ther
18560 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65  e are three inde
18570 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
18580 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a  ted by OR..    *
18590 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65  * The top of the
185a0 20 6c 6f 6f 70 20 69 73 20 63 6f 6e 73 74 72 75   loop is constru
185b0 63 74 65 64 20 62 79 20 63 72 65 61 74 69 6e 67  cted by creating
185c0 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
185d0 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 70 75  .    ** and popu
185e0 6c 61 74 69 6e 67 20 69 74 2e 20 20 54 68 65 6e  lating it.  Then
185f0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 6c   looping over el
18600 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f  ements of the ro
18610 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  wset..    **.   
18620 20 2a 2a 20 20 20 20 20 20 20 20 4e 75 6c 6c 20   **        Null 
18630 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  1.    **        
18640 23 20 66 69 6c 6c 20 52 6f 77 53 65 74 20 31 20  # fill RowSet 1 
18650 77 69 74 68 20 65 6e 74 72 69 65 73 20 77 68 65  with entries whe
18660 72 65 20 61 3d 35 20 75 73 69 6e 67 20 69 31 0a  re a=5 using i1.
18670 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 23 20      **        # 
18680 66 69 6c 6c 20 52 6f 77 73 65 74 20 31 20 77 69  fill Rowset 1 wi
18690 74 68 20 65 6e 74 72 69 65 73 20 77 68 65 72 65  th entries where
186a0 20 62 3d 37 20 75 73 69 6e 67 20 69 32 0a 20 20   b=7 using i2.  
186b0 20 20 2a 2a 20 20 20 20 20 20 20 20 23 20 66 69    **        # fi
186c0 6c 6c 20 52 6f 77 73 65 74 20 31 20 77 69 74 68  ll Rowset 1 with
186d0 20 65 6e 74 72 69 65 73 20 77 68 65 72 65 20 63   entries where c
186e0 3d 31 31 20 61 6e 64 20 64 3d 31 33 20 69 33 20  =11 and d=13 i3 
186f0 61 6e 64 20 74 31 0a 20 20 20 20 2a 2a 20 20 20  and t1.    **   
18700 20 20 41 3a 20 52 6f 77 53 65 74 52 65 61 64 20    A: RowSetRead 
18710 31 2c 20 42 2c 20 32 0a 20 20 20 20 2a 2a 20 20  1, B, 2.    **  
18720 20 20 20 20 20 20 53 65 65 6b 20 20 20 20 20 20        Seek      
18730 20 69 2c 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20   i, 2.    **.   
18740 20 2a 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   ** The bottom o
18750 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
18760 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
18770 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
18780 20 47 6f 74 6f 20 20 20 20 20 20 20 30 2c 20 41   Goto       0, A
18790 0a 20 20 20 20 2a 2a 20 20 20 20 20 42 3a 0a 20  .    **     B:. 
187a0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65     */.    int re
187b0 67 4f 72 52 6f 77 73 65 74 3b 20 20 20 20 20 20  gOrRowset;      
187c0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
187d0 64 69 6e 67 20 74 68 65 20 52 6f 77 53 65 74 20  ding the RowSet 
187e0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e  object */.    in
187f0 74 20 72 65 67 4e 65 78 74 52 6f 77 69 64 3b 20  t regNextRowid; 
18800 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
18810 20 68 6f 6c 64 69 6e 67 20 6e 65 78 74 20 72 6f   holding next ro
18820 77 69 64 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  wid */.    Where
18830 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
18840 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75    /* The OR-clau
18850 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  se broken out in
18860 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
18870 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
18880 72 54 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 73  rTerm;    /* A s
18890 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 77 69  ingle subterm wi
188a0 74 68 69 6e 20 74 68 65 20 4f 52 2d 63 6c 61 75  thin the OR-clau
188b0 73 65 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73  se */.    SrcLis
188c0 74 20 6f 6e 65 54 61 62 3b 20 20 20 20 20 20 20  t oneTab;       
188d0 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61   /* Shortened ta
188e0 62 6c 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 0a  ble list */.   .
188f0 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76      pTerm = pLev
18900 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d  el->plan.u.pTerm
18910 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
18920 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
18930 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
18940 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b  erator==WO_OR );
18950 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
18960 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
18970 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29  ERM_ORINFO)!=0 )
18980 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70  ;.    pOrWc = &p
18990 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
189a0 3e 77 63 3b 0a 20 20 20 20 63 6f 64 65 52 6f 77  >wc;.    codeRow
189b0 53 65 74 45 61 72 6c 79 20 3d 20 28 72 65 67 52  SetEarly = (regR
189c0 6f 77 53 65 74 3e 3d 30 20 26 26 20 70 57 43 2d  owSet>=0 && pWC-
189d0 3e 6e 54 65 72 6d 3d 3d 31 29 20 3f 31 3a 30 3b  >nTerm==1) ?1:0;
189e0 0a 0a 20 20 20 20 69 66 28 20 63 6f 64 65 52 6f  ..    if( codeRo
189f0 77 53 65 74 45 61 72 6c 79 20 29 7b 0a 20 20 20  wSetEarly ){.   
18a00 20 20 20 72 65 67 4f 72 52 6f 77 73 65 74 20 3d     regOrRowset =
18a10 20 72 65 67 52 6f 77 53 65 74 3b 0a 20 20 20 20   regRowSet;.    
18a20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 67  }else{.      reg
18a30 4f 72 52 6f 77 73 65 74 20 3d 20 73 71 6c 69 74  OrRowset = sqlit
18a40 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
18a50 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
18a60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18a70 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
18a80 4f 72 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d  OrRowset);.    }
18a90 0a 20 20 20 20 6f 6e 65 54 61 62 2e 6e 53 72 63  .    oneTab.nSrc
18aa0 20 3d 20 31 3b 0a 20 20 20 20 6f 6e 65 54 61 62   = 1;.    oneTab
18ab0 2e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20  .nAlloc = 1;.   
18ac0 20 6f 6e 65 54 61 62 2e 61 5b 30 5d 20 3d 20 2a   oneTab.a[0] = *
18ad0 70 54 61 62 49 74 65 6d 3b 0a 20 20 20 20 66 6f  pTabItem;.    fo
18ae0 72 28 6a 3d 30 2c 20 70 4f 72 54 65 72 6d 3d 70  r(j=0, pOrTerm=p
18af0 4f 72 57 63 2d 3e 61 3b 20 6a 3c 70 4f 72 57 63  OrWc->a; j<pOrWc
18b00 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 4f  ->nTerm; j++, pO
18b10 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
18b20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57  WhereInfo *pSubW
18b30 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
18b40 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
18b50 73 6f 72 21 3d 69 43 75 72 20 26 26 20 70 4f 72  sor!=iCur && pOr
18b60 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
18b70 3d 57 4f 5f 41 4e 44 20 29 20 63 6f 6e 74 69 6e  =WO_AND ) contin
18b80 75 65 3b 0a 20 20 20 20 20 20 70 53 75 62 57 49  ue;.      pSubWI
18b90 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
18ba0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
18bb0 26 6f 6e 65 54 61 62 2c 20 70 4f 72 54 65 72 6d  &oneTab, pOrTerm
18bc0 2d 3e 70 45 78 70 72 2c 20 30 2c 0a 20 20 20 20  ->pExpr, 0,.    
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18be0 20 20 20 20 57 48 45 52 45 5f 46 49 4c 4c 5f 52      WHERE_FILL_R
18bf0 4f 57 53 45 54 20 7c 20 57 48 45 52 45 5f 4f 4d  OWSET | WHERE_OM
18c00 49 54 5f 4f 50 45 4e 20 7c 20 57 48 45 52 45 5f  IT_OPEN | WHERE_
18c10 4f 4d 49 54 5f 43 4c 4f 53 45 2c 0a 20 20 20 20  OMIT_CLOSE,.    
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c30 20 20 20 20 72 65 67 4f 72 52 6f 77 73 65 74 29      regOrRowset)
18c40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 75 62  ;.      if( pSub
18c50 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  WInfo ){.       
18c60 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
18c70 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20  (pSubWInfo);.   
18c80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
18c90 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
18ca0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f  eLabel(v, addrCo
18cb0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 21 63 6f  nt);.    if( !co
18cc0 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20 29 7b  deRowSetEarly ){
18cd0 0a 20 20 20 20 20 20 72 65 67 4e 65 78 74 52 6f  .      regNextRo
18ce0 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  wid = sqlite3Get
18cf0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
18d00 0a 20 20 20 20 20 20 61 64 64 72 43 6f 6e 74 20  .      addrCont 
18d10 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  = .         sqli
18d20 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
18d30 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 2c 20   OP_RowSetRead, 
18d40 72 65 67 4f 72 52 6f 77 73 65 74 2c 61 64 64 72  regOrRowset,addr
18d50 42 72 6b 2c 72 65 67 4e 65 78 74 52 6f 77 69 64  Brk,regNextRowid
18d60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18d70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18d80 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 72 65 67  _Seek, iCur, reg
18d90 4e 65 78 74 52 6f 77 69 64 29 3b 0a 20 20 20 20  NextRowid);.    
18da0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18db0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
18dc0 72 65 67 4e 65 78 74 52 6f 77 69 64 29 3b 0a 20  regNextRowid);. 
18dd0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 52       /* sqlite3R
18de0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
18df0 61 72 73 65 2c 20 72 65 67 4f 72 52 6f 77 73 65  arse, regOrRowse
18e00 74 29 3b 20 2f 2f 20 50 72 65 73 65 72 76 65 20  t); // Preserve 
18e10 74 68 65 20 52 6f 77 53 65 74 20 2a 2f 0a 20 20  the RowSet */.  
18e20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
18e30 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 20 20 20 20   OP_Goto;.      
18e40 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 61 64 64  pLevel->p2 = add
18e50 72 43 6f 6e 74 3b 0a 20 20 20 20 7d 65 6c 73 65  rCont;.    }else
18e60 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
18e70 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
18e80 20 20 7d 0a 20 20 20 20 64 69 73 61 62 6c 65 54    }.    disableT
18e90 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
18ea0 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  m);.  }else.#end
18eb0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
18ec0 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
18ed0 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a  N */..  {.    /*
18ee0 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20   Case 5:  There 
18ef0 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
18f00 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
18f10 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  a complete.    *
18f20 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20  *          scan 
18f30 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61  of the entire ta
18f40 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
18f50 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
18f60 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
18f70 72 74 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a 20  rt( bRev==0 );. 
18f80 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
18f90 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  OP_Next;.    pLe
18fa0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
18fb0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
18fc0 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
18fd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
18fe0 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ind, iCur, addrB
18ff0 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  rk);.    pLevel-
19000 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
19010 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
19020 5f 53 54 45 50 3b 0a 20 20 20 20 63 6f 64 65 52  _STEP;.    codeR
19030 6f 77 53 65 74 45 61 72 6c 79 20 3d 20 30 3b 0a  owSetEarly = 0;.
19040 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79 20 26    }.  notReady &
19050 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e  = ~getMask(pWC->
19060 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  pMaskSet, iCur);
19070 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f  ..  /* Insert co
19080 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79  de to test every
19090 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74   subexpression t
190a0 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  hat can be compl
190b0 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75  etely.  ** compu
190c0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75  ted using the cu
190d0 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62  rrent set of tab
190e0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20  les..  */.  k = 
190f0 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
19100 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54  WC->a, j=pWC->nT
19110 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
19120 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
19130 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63  r *pE;.    testc
19140 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
19150 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
19160 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  AL );.    testca
19170 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
19180 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
19190 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
191a0 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
191b0 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
191c0 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
191d0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
191e0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
191f0 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e  tReady)!=0 ) con
19200 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20  tinue;.    pE = 
19210 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
19220 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
19230 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
19240 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20  l->iLeftJoin && 
19250 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
19260 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
19270 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69  ) ){.      conti
19280 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nue;.    }.    p
19290 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
192a0 6c 43 61 63 68 65 20 2b 3d 20 6b 3b 0a 20 20 20  lCache += k;.   
192b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
192c0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20  lse(pParse, pE, 
192d0 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
192e0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
192f0 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
19300 65 43 6f 6c 43 61 63 68 65 20 2d 3d 20 6b 3b 0a  eColCache -= k;.
19310 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20 70      k = 1;.    p
19320 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
19330 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d   TERM_CODED;.  }
19340 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
19350 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
19360 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
19370 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
19380 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
19390 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
193a0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
193b0 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
193c0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
193d0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
193e0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
193f0 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
19400 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
19410 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
19420 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
19430 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19440 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
19450 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
19460 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
19470 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
19480 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
19490 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c     sqlite3ExprCl
194a0 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  earColumnCache(p
194b0 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Parse, pLevel->i
194c0 54 61 62 43 75 72 29 3b 0a 20 20 20 20 73 71 6c  TabCur);.    sql
194d0 69 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c  ite3ExprClearCol
194e0 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
194f0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
19500 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  );.    for(pTerm
19510 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c  =pWC->a, j=0; j<
19520 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  pWC->nTerm; j++,
19530 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
19540 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
19550 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
19560 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
19570 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
19580 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
19590 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20  M_CODED );.     
195a0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
195b0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
195c0 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
195d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
195e0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
195f0 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
19600 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  dy)!=0 ) continu
19610 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
19620 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
19630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19640 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
19650 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
19660 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
19670 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
19680 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
19690 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
196a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
196b0 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 77 61 73  *.  ** If it was
196c0 20 72 65 71 75 65 73 74 65 64 20 74 6f 20 73 74   requested to st
196d0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
196e0 69 6e 20 61 20 72 6f 77 73 65 74 20 61 6e 64 20  in a rowset and 
196f0 74 68 61 74 20 68 61 73 0a 20 20 2a 2a 20 6e 6f  that has.  ** no
19700 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64  t already been d
19710 6f 2c 20 74 68 65 6e 20 64 6f 20 73 6f 20 6e 6f  o, then do so no
19720 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  w..  */.  if( re
19730 67 52 6f 77 53 65 74 3e 3d 30 20 26 26 20 21 63  gRowSet>=0 && !c
19740 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20 29  odeRowSetEarly )
19750 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73  {.    int r1 = s
19760 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19770 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
19780 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
19790 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
197a0 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  f(  (pLevel->pla
197b0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
197c0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
197d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
197e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
197f0 20 4f 50 5f 56 52 6f 77 69 64 2c 20 69 43 75 72   OP_VRowid, iCur
19800 2c 20 72 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , r1);.    }else
19810 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
19820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19830 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
19840 64 2c 20 69 43 75 72 2c 20 72 31 29 3b 0a 20 20  d, iCur, r1);.  
19850 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
19860 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19870 52 6f 77 53 65 74 41 64 64 2c 20 72 65 67 52 6f  RowSetAdd, regRo
19880 77 53 65 74 2c 20 72 31 29 3b 0a 20 20 20 20 73  wSet, r1);.    s
19890 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
198a0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
198b0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
198c0 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66  notReady;.}..#if
198d0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
198e0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TEST)./*.** The 
198f0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
19900 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20  le holds a text 
19910 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71  description of q
19920 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61  uery plan genera
19930 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f  ted.** by the mo
19940 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74  st recent call t
19950 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
19960 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c  gin().  Each cal
19970 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a  l to WhereBegin.
19980 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ** overwrites th
19990 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69  e previous.  Thi
199a0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
199b0 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
199c0 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69  g and.** analysi
199d0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20  s only..*/.char 
199e0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
199f0 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f  an[BMS*2*40];  /
19a00 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f  * Text of the jo
19a10 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  in */.static int
19a20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20   nQPlan = 0;    
19a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
19a40 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f  t free slow in _
19a50 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a  query_plan[] */.
19a60 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19a70 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  E_TEST */.../*.*
19a80 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
19a90 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
19aa0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
19ab0 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65  eInfoFree(sqlite
19ac0 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f  3 *db, WhereInfo
19ad0 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28   *pWInfo){.  if(
19ae0 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 69   pWInfo ){.    i
19af0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
19b00 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
19b10 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
19b20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
19b30 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49  nfo *pInfo = pWI
19b40 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e  nfo->a[i].pIdxIn
19b50 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
19b60 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 61  nfo ){.        a
19b70 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65  ssert( pInfo->ne
19b80 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d  edToFreeIdxStr==
19b90 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
19ba0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
19bb0 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64   if( pInfo->need
19bc0 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a  ToFreeIdxStr ){.
19bd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19be0 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64  3_free(pInfo->id
19bf0 78 53 74 72 29 3b 0a 09 7d 0a 20 20 20 20 20 20  xStr);..}.      
19c00 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19c10 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20  db, pInfo);.    
19c20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68    }.    }.    wh
19c30 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 70  ereClauseClear(p
19c40 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 20  WInfo->pWC);.   
19c50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19c60 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
19c70 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
19c80 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  te the beginning
19c90 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65   of the loop use
19ca0 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
19cb0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
19cc0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
19cd0 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
19ce0 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72  to an opaque str
19cf0 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
19d00 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ains.** informat
19d10 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65  ion needed to te
19d20 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
19d30 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61  .  Later, the ca
19d40 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
19d50 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
19d60 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
19d70 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
19d80 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
19d90 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72  unction.** in or
19da0 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
19db0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
19dc0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
19dd0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
19de0 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74  ccurs, this rout
19df0 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
19e00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
19e10 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20  c idea is to do 
19e20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f  a nested loop, o
19e30 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68  ne loop for each
19e40 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65   table in.** the
19e50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
19e60 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45  a select.  (INSE
19e70 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  RT and UPDATE st
19e80 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  atements are the
19e90 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45  .** same as a SE
19ea0 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61  LECT with only a
19eb0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
19ec0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19ed0 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  .)  For.** examp
19ee0 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69  le, if the SQL i
19ef0 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  s this:.**.**   
19f00 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
19f10 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
19f20 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68  RE ...;.**.** Th
19f30 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  en the code gene
19f40 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74  rated is concept
19f50 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66  ually like the f
19f60 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
19f70 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
19f80 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20  1 in t1 do      
19f90 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
19fa0 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66  ated.**        f
19fb0 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
19fc0 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79  2 do      |-- by
19fd0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
19fe0 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  in().**         
19ff0 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e   foreach row3 in
1a000 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20   t3 do   /.**   
1a010 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
1a020 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20           end    
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a040 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
1a050 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65  ated.**        e
1a060 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
1a070 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79            |-- by
1a080 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1a090 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20  ().**      end  
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0b0 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e         /.**.** N
1a0c0 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f  ote that the loo
1a0d0 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ps might not be 
1a0e0 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72  nested in the or
1a0f0 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
1a100 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74  y.** appear in t
1a110 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1a120 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  f a different or
1a130 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62  der is better ab
1a140 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73  le to make.** us
1a150 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e  e of indices.  N
1a160 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68  ote also that wh
1a170 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  en the IN operat
1a180 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a  or appears in.**
1a190 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1a1a0 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75  e, it might resu
1a1b0 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  lt in additional
1a1c0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f   nested loops fo
1a1d0 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68  r.** scanning th
1a1e0 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73  rough all values
1a1f0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
1a200 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
1a210 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  N..**.** There a
1a220 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73  re Btree cursors
1a230 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1a240 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31   each table.  t1
1a250 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20   uses cursor.** 
1a260 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d  number pTabList-
1a270 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20  >a[0].iCursor.  
1a280 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73  t2 uses the curs
1a290 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  or pTabList->a[1
1a2a0 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e  ].iCursor..** An
1a2b0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69  d so forth.  Thi
1a2c0 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
1a2d0 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  tes code to open
1a2e0 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73   those VDBE curs
1a2f0 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ors.** and sqlit
1a300 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e  e3WhereEnd() gen
1a310 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
1a320 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a  to close them..*
1a330 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
1a340 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  at sqlite3WhereB
1a350 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73  egin() generates
1a360 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
1a370 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20  ors named.** in 
1a380 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e  pTabList pointin
1a390 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f  g at their appro
1a3a0 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20  priate entries. 
1a3b0 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a   The [...] code.
1a3c0 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f  ** can use OP_Co
1a3d0 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69  lumn and OP_Rowi
1a3e0 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  d opcodes on the
1a3f0 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78  se cursors to ex
1a400 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72  tract.** data fr
1a410 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  om the various t
1a420 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f  ables of the loo
1a430 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
1a440 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
1a450 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61  empty, the forea
1a460 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61  ch loops must ea
1a470 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a  ch scan their.**
1a480 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20   entire tables. 
1a490 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61   Thus a three-wa
1a4a0 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e  y join is an O(N
1a4b0 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ^3) operation.  
1a4c0 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  But if.** the ta
1a4d0 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65  bles have indice
1a4e0 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
1a4f0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
1a500 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a  RE clause that.*
1a510 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65  * refer to those
1a520 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70   indices, a comp
1a530 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20  lete table scan 
1a540 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61  can be avoided a
1a550 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  nd the.** code w
1a560 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73  ill run much fas
1a570 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68  ter.  Most of th
1a580 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72  e work of this r
1a590 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69  outine is checki
1a5a0 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ng.** to see if 
1a5b0 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65  there are indice
1a5c0 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
1a5d0 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74  ed to speed up t
1a5e0 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  he loop..**.** T
1a5f0 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
1a600 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73  E clause are als
1a610 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  o used to limit 
1a620 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61  which rows actua
1a630 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74  lly.** make it t
1a640 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74  o the "..." in t
1a650 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
1a660 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61   loop.  After ea
1a670 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a  ch "foreach",.**
1a680 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
1a690 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
1a6a0 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69  use only terms i
1a6b0 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20  n that loop and 
1a6c0 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61  outer.** loops a
1a6d0 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  re evaluated and
1a6e0 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70   if false a jump
1a6f0 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20   is made around 
1a700 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
1a710 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f  * inner loops (o
1a720 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e  r around the "..
1a730 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f  ." if the test o
1a740 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
1a750 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20   inner-.** most 
1a760 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45  loop).**.** OUTE
1a770 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e  R JOINS.**.** An
1a780 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74   outer join of t
1a790 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20  ables t1 and t2 
1a7a0 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63  is conceptally c
1a7b0 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  oded as follows:
1a7c0 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63  .**.**    foreac
1a7d0 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a  h row1 in t1 do.
1a7e0 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30  **      flag = 0
1a7f0 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
1a800 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a   row2 in t2 do.*
1a810 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a  *        start:.
1a820 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a  **          ....
1a830 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  **          flag
1a840 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64   = 1.**      end
1a850 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67  .**      if flag
1a860 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ==0 then.**     
1a870 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32     move the row2
1a880 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c   cursor to a nul
1a890 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  l row.**        
1a8a0 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20  goto start.**   
1a8b0 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a     fi.**    end.
1a8c0 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43  **.** ORDER BY C
1a8d0 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47  LAUSE PROCESSING
1a8e0 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42  .**.** *ppOrderB
1a8f0 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
1a900 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
1a910 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1a920 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
1a930 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
1a940 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
1a950 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1a960 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
1a970 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
1a980 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
1a990 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
1a9a0 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64 65  ent, then ppOrde
1a9b0 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
1a9c0 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  ** If an index c
1a9d0 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68  an be used so th
1a9e0 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f  at the natural o
1a9f0 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74  utput order of t
1aa00 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e  he table.** scan
1aa10 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20   is correct for 
1aa20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1aa30 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69  use, then that i
1aa40 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64  ndex is used and
1aa50 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69  .** *ppOrderBy i
1aa60 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20  s set to NULL.  
1aa70 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
1aa80 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65  ization that pre
1aa90 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65  vents an.** unne
1aaa0 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20  cessary sort of 
1aab0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  the result set i
1aac0 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f  f an index appro
1aad0 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a 2a  priate for the.*
1aae0 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
1aaf0 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
1ab00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
1ab10 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70  here clause loop
1ab20 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61  s cannot be arra
1ab30 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  nged to provide 
1ab40 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f  the correct.** o
1ab50 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65  utput order, the
1ab60 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42 79  n the *ppOrderBy
1ab70 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
1ab80 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
1ab90 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
1aba0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1abb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1abc0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
1abd0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
1abe0 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69  List,    /* A li
1abf0 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  st of all tables
1ac00 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
1ac10 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
1ac20 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
1ac30 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1ac40 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  .  ExprList **pp
1ac50 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e 20 4f  OrderBy, /* An O
1ac60 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
1ac70 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 38 20  or NULL */.  u8 
1ac80 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
1ac90 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
1aca0 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
1acb0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
1acc0 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 72  Int.h */.  int r
1acd0 65 67 52 6f 77 53 65 74 20 20 20 20 20 20 20 20  egRowSet        
1ace0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1acf0 64 20 52 6f 77 53 65 74 20 69 66 20 57 48 45 52  d RowSet if WHER
1ad00 45 5f 46 49 4c 4c 5f 52 4f 57 53 45 54 20 69 73  E_FILL_ROWSET is
1ad10 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   set */.){.  int
1ad20 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1ad30 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1ad40 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57 68 65  counter */.  Whe
1ad50 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
1ad60 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
1ad70 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
1ad80 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
1ad90 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
1ada0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1adb0 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
1adc0 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
1add0 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74   engine */.  Bit
1ade0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
1adf0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
1ae00 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
1ae10 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
1ae20 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
1ae30 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
1ae40 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
1ae50 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
1ae60 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ae80 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20  * Decomposition 
1ae90 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1aea0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1aeb0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
1aec0 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69  abItem;  /* A si
1aed0 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  ngle entry from 
1aee0 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
1aef0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1af00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1af10 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
1af20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69  in the pWInfo li
1af30 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  st */.  int iFro
1af40 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1af50 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1af60 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61   unused FROM cla
1af70 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  use element */. 
1af80 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20   int andFlags;  
1af90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1afa0 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ND-ed combinatio
1afb0 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b  n of all pWC->a[
1afc0 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73  ].wtFlags */.  s
1afd0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
1afe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1aff0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1b000 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1b010 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20  pOrderBy = 0;.. 
1b020 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1b030 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
1b040 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
1b050 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75  imited by the nu
1b060 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74  mber of.  ** bit
1b070 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a  s in a Bitmask .
1b080 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c    */.  if( pTabL
1b090 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b  ist->nSrc>BMS ){
1b0a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1b0b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74  rMsg(pParse, "at
1b0c0 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20   most %d tables 
1b0d0 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29  in a join", BMS)
1b0e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1b0f0 20 20 7d 0a 0a 20 20 69 66 28 20 70 70 4f 72 64    }..  if( ppOrd
1b100 65 72 42 79 20 29 7b 0a 20 20 20 20 70 4f 72 64  erBy ){.    pOrd
1b110 65 72 42 79 20 3d 20 2a 70 70 4f 72 64 65 72 42  erBy = *ppOrderB
1b120 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  y;.  }..  /* All
1b130 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
1b140 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
1b150 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
1b160 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
1b170 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
1b180 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d  lue..  */.  db =
1b190 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
1b1a0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  WInfo = sqlite3D
1b1b0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1b1c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1b1d0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57          sizeof(W
1b1e0 68 65 72 65 49 6e 66 6f 29 0a 20 20 20 20 20 20  hereInfo).      
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b200 2b 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  + (pTabList->nSr
1b210 63 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72  c-1)*sizeof(Wher
1b220 65 4c 65 76 65 6c 29 0a 20 20 20 20 20 20 20 20  eLevel).        
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
1b240 73 69 7a 65 6f 66 28 57 68 65 72 65 43 6c 61 75  sizeof(WhereClau
1b250 73 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  se).            
1b260 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
1b270 6f 66 28 57 68 65 72 65 4d 61 73 6b 53 65 74 29  of(WhereMaskSet)
1b280 0a 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  .           );. 
1b290 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1b2a0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
1b2b0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
1b2c0 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  r;.  }.  pWInfo-
1b2d0 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62 4c 69  >nLevel = pTabLi
1b2e0 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57 49 6e  st->nSrc;.  pWIn
1b2f0 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
1b300 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
1b310 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
1b320 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  st;.  pWInfo->iB
1b330 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
1b340 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1b350 20 20 70 57 49 6e 66 6f 2d 3e 72 65 67 52 6f 77    pWInfo->regRow
1b360 53 65 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67  Set = (wctrlFlag
1b370 73 20 26 20 57 48 45 52 45 5f 46 49 4c 4c 5f 52  s & WHERE_FILL_R
1b380 4f 57 53 45 54 29 20 3f 20 72 65 67 52 6f 77 53  OWSET) ? regRowS
1b390 65 74 20 3a 20 2d 31 3b 0a 20 20 70 57 49 6e 66  et : -1;.  pWInf
1b3a0 6f 2d 3e 70 57 43 20 3d 20 70 57 43 20 3d 20 28  o->pWC = pWC = (
1b3b0 57 68 65 72 65 43 6c 61 75 73 65 2a 29 26 70 57  WhereClause*)&pW
1b3c0 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  Info->a[pWInfo->
1b3d0 6e 4c 65 76 65 6c 5d 3b 0a 20 20 70 57 49 6e 66  nLevel];.  pWInf
1b3e0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  o->wctrlFlags = 
1b3f0 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 4d  wctrlFlags;.  pM
1b400 61 73 6b 53 65 74 20 3d 20 28 57 68 65 72 65 4d  askSet = (WhereM
1b410 61 73 6b 53 65 74 2a 29 26 70 57 43 5b 31 5d 3b  askSet*)&pWC[1];
1b420 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65  ..  /* Split the
1b430 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
1b440 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65  to separate sube
1b450 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65  xpressions where
1b460 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78   each.  ** subex
1b470 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
1b480 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20  rated by an AND 
1b490 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
1b4a0 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61   initMaskSet(pMa
1b4b0 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43  skSet);.  whereC
1b4c0 6c 61 75 73 65 49 6e 69 74 28 70 57 43 2c 20 70  lauseInit(pWC, p
1b4d0 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29  Parse, pMaskSet)
1b4e0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1b4f0 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61  odeConstants(pPa
1b500 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  rse, pWhere);.  
1b510 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20  whereSplit(pWC, 
1b520 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
1b530 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69  .    .  /* Speci
1b540 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45  al case: a WHERE
1b550 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
1b560 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75  constant.  Evalu
1b570 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70  ate the.  ** exp
1b580 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68  ression and eith
1b590 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c  er jump over all
1b5a0 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20   of the code or 
1b5b0 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a  fall thru..  */.
1b5c0 20 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20    if( pWhere && 
1b5d0 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
1b5e0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70  =0 || sqlite3Exp
1b5f0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
1b600 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20  in(pWhere)) ){. 
1b610 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1b620 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57  False(pParse, pW
1b630 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  here, pWInfo->iB
1b640 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  reak, SQLITE_JUM
1b650 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57  PIFNULL);.    pW
1b660 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  here = 0;.  }.. 
1b670 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74   /* Assign a bit
1b680 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73   from the bitmas
1b690 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  k to every term 
1b6a0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1b6b0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  se..  **.  ** Wh
1b6c0 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74  en assigning bit
1b6d0 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46  mask values to F
1b6e0 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f  ROM clause curso
1b6f0 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20  rs, it must be. 
1b700 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61   ** the case tha
1b710 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  t if X is the bi
1b720 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d  tmask for the N-
1b730 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
1b740 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  erm then.  ** th
1b750 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
1b760 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  l FROM clause te
1b770 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  rms to the left 
1b780 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d  of the N-th term
1b790 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20  .  ** is (X-1). 
1b7a0 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20    An expression 
1b7b0 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
1b7c0 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
1b7d0 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69  N can use.  ** i
1b7e0 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  ts Expr.iRightJo
1b7f0 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f  inTable value to
1b800 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73   find the bitmas
1b810 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  k of the right t
1b820 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  able.  ** of the
1b830 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74   join.  Subtract
1b840 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ing one from the
1b850 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74   right table bit
1b860 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a  mask gives a.  *
1b870 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  * bitmask for al
1b880 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
1b890 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
1b8a0 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62  .  Knowing the b
1b8b0 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20  itmask.  ** for 
1b8c0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
1b8d0 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
1b8e0 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61   join is importa
1b8f0 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
1b900 35 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  5..  */.  for(i=
1b910 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
1b920 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Src; i++){.    c
1b930 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53  reateMask(pMaskS
1b940 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
1b950 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  i].iCursor);.  }
1b960 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1b970 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20    {.    Bitmask 
1b980 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20  toTheLeft = 0;. 
1b990 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
1b9a0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1b9b0 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  +){.      Bitmas
1b9c0 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k m = getMask(pM
1b9d0 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
1b9e0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
1b9f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1ba00 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20  m-1)==toTheLeft 
1ba10 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65  );.      toTheLe
1ba20 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20  ft |= m;.    }. 
1ba30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1ba40 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
1ba50 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
1ba60 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78  s.  Note that ex
1ba70 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68  prAnalyze() migh
1ba80 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76  t.  ** add new v
1ba90 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74  irtual terms ont
1baa0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1bab0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1bac0 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77  We do not.  ** w
1bad0 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74  ant to analyze t
1bae0 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65 72  hese virtual ter
1baf0 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61  ms, so start ana
1bb00 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e  lyzing at the en
1bb10 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20  d.  ** and work 
1bb20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74 20  forward so that 
1bb30 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61  the added virtua
1bb40 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65  l terms are neve
1bb50 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  r processed..  *
1bb60 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  /.  exprAnalyzeA
1bb70 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43  ll(pTabList, pWC
1bb80 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
1bb90 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1bba0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
1bbb0 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Error;.  }..  /*
1bbc0 20 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20   Chose the best 
1bbd0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
1bbe0 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
1bbf0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
1bc00 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
1bc10 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65  oop fills in the
1bc20 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
1bc30 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70  s:.  **.  **   p
1bc40 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20  WInfo->a[].pIdx 
1bc50 20 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74       The index t
1bc60 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c  o use for this l
1bc70 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70  evel of the loop
1bc80 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  ..  **   pWInfo-
1bc90 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20 20 20 57  >a[].wsFlags   W
1bca0 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61  HERE_xxx flags a
1bcb0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1bcc0 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  Idx.  **   pWInf
1bcd0 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20  o->a[].nEq      
1bce0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
1bcf0 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
1bd00 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e  ints.  **   pWIn
1bd10 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20  fo->a[].iFrom   
1bd20 20 20 57 68 69 63 68 20 74 65 72 6d 20 6f 66 20    Which term of 
1bd30 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1bd40 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20  is being coded. 
1bd50 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
1bd60 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20  ].iTabCur   The 
1bd70 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
1bd80 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
1bd90 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  le.  **   pWInfo
1bda0 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20  ->a[].iIdxCur   
1bdb0 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1bdc0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20  for the index.  
1bdd0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
1bde0 2e 70 54 65 72 6d 20 20 20 20 20 57 68 65 6e 20  .pTerm     When 
1bdf0 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20  wsFlags==WO_OR, 
1be00 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 74 65  the OR-clause te
1be10 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  rm.  **.  ** Thi
1be20 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75  s loop also figu
1be30 72 65 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74  res out the nest
1be40 69 6e 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62  ing order of tab
1be50 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
1be60 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a    ** clause..  *
1be70 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
1be80 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 54  (Bitmask)0;.  pT
1be90 61 62 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73  abItem = pTabLis
1bea0 74 2d 3e 61 3b 0a 20 20 70 4c 65 76 65 6c 20 3d  t->a;.  pLevel =
1beb0 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e   pWInfo->a;.  an
1bec0 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57  dFlags = ~0;.  W
1bed0 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
1bee0 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20  Optimizer Start 
1bef0 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28  ***\n"));.  for(
1bf00 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65  i=iFrom=0, pLeve
1bf10 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
1bf20 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1bf30 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
1bf40 20 20 20 57 68 65 72 65 43 6f 73 74 20 62 65 73     WhereCost bes
1bf50 74 50 6c 61 6e 3b 20 20 20 20 20 20 20 20 20 2f  tPlan;         /
1bf60 2a 20 4d 6f 73 74 20 65 66 66 69 63 69 65 6e 74  * Most efficient
1bf70 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66 61   plan seen so fa
1bf80 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  r */.    Index *
1bf90 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
1bfa0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f       /* Index fo
1bfb0 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20  r FROM table at 
1bfc0 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20  pTabItem */.    
1bfd0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
1bfe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1bff0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1c000 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20  FROM tables */. 
1c010 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 30     int bestJ = 0
1c020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c030 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a  * The value of j
1c040 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   */.    Bitmask 
1c050 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1c060 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76      /* Bitmask v
1c070 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65  alue for j or be
1c080 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  stJ */.    int o
1c090 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nce = 0;        
1c0a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
1c0b0 68 65 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20  hen first table 
1c0c0 69 73 20 73 65 65 6e 20 2a 2f 0a 0a 20 20 20 20  is seen */..    
1c0d0 6d 65 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e  memset(&bestPlan
1c0e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74  , 0, sizeof(best
1c0f0 50 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74  Plan));.    best
1c100 50 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c  Plan.rCost = SQL
1c110 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20  ITE_BIG_DBL;.   
1c120 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54   for(j=iFrom, pT
1c130 61 62 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74  abItem=&pTabList
1c140 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69  ->a[j]; j<pTabLi
1c150 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70  st->nSrc; j++, p
1c160 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  TabItem++){.    
1c170 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72 64    int doNotReord
1c180 65 72 3b 20 20 2f 2a 20 54 72 75 65 20 69 66 20  er;  /* True if 
1c190 74 68 69 73 20 74 61 62 6c 65 20 73 68 6f 75 6c  this table shoul
1c1a0 64 20 6e 6f 74 20 62 65 20 72 65 6f 72 64 65 72  d not be reorder
1c1b0 65 64 20 2a 2f 0a 20 20 20 20 20 20 57 68 65 72  ed */.      Wher
1c1c0 65 43 6f 73 74 20 73 43 6f 73 74 3b 20 20 20 2f  eCost sCost;   /
1c1d0 2a 20 43 6f 73 74 20 69 6e 66 6f 72 6d 61 74 69  * Cost informati
1c1e0 6f 6e 20 66 72 6f 6d 20 62 65 73 74 49 6e 64 65  on from bestInde
1c1f0 78 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 64 6f  x() */..      do
1c200 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20 28 70  NotReorder =  (p
1c210 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  TabItem->jointyp
1c220 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
1c230 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20 20  CROSS))!=0;.    
1c240 20 20 69 66 28 20 6f 6e 63 65 20 26 26 20 64 6f    if( once && do
1c250 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72 65  NotReorder ) bre
1c260 61 6b 3b 0a 20 20 20 20 20 20 6d 20 3d 20 67 65  ak;.      m = ge
1c270 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
1c280 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
1c290 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6d  r);.      if( (m
1c2a0 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20   & notReady)==0 
1c2b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  ){.        if( j
1c2c0 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b  ==iFrom ) iFrom+
1c2d0 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  +;.        conti
1c2e0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
1c2f0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49     assert( pTabI
1c300 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66  tem->pTab );.#if
1c310 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c320 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1c330 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
1c340 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  l(pTabItem->pTab
1c350 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
1c360 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1c370 2a 70 56 74 61 62 49 64 78 3b 20 2f 2a 20 43 75  *pVtabIdx; /* Cu
1c380 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 69 6e  rrent virtual in
1c390 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  dex */.        s
1c3a0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1c3b0 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20  o **ppIdxInfo = 
1c3c0 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49  &pWInfo->a[j].pI
1c3d0 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  dxInfo;.        
1c3e0 73 43 6f 73 74 2e 72 43 6f 73 74 20 3d 20 62 65  sCost.rCost = be
1c3f0 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70  stVirtualIndex(p
1c400 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62  Parse, pWC, pTab
1c410 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a  Item, notReady,.
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c440 20 20 20 20 20 20 20 70 70 4f 72 64 65 72 42 79         ppOrderBy
1c450 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20   ? *ppOrderBy : 
1c460 30 2c 20 69 3d 3d 30 2c 0a 20 20 20 20 20 20 20  0, i==0,.       
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 70 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20  ppIdxInfo);.    
1c4a0 20 20 20 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 77      sCost.plan.w
1c4b0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56  sFlags = WHERE_V
1c4c0 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 20  IRTUALTABLE;.   
1c4d0 20 20 20 20 20 73 43 6f 73 74 2e 70 6c 61 6e 2e       sCost.plan.
1c4e0 75 2e 70 56 74 61 62 49 64 78 20 3d 20 70 56 74  u.pVtabIdx = pVt
1c4f0 61 62 49 64 78 20 3d 20 2a 70 70 49 64 78 49 6e  abIdx = *ppIdxIn
1c500 66 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  fo;.        if( 
1c510 70 56 74 61 62 49 64 78 20 26 26 20 70 56 74 61  pVtabIdx && pVta
1c520 62 49 64 78 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  bIdx->orderByCon
1c530 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 20 20 20  sumed ){.       
1c540 20 20 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73     sCost.plan.ws
1c550 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
1c560 52 54 55 41 4c 54 41 42 4c 45 20 7c 20 57 48 45  RTUALTABLE | WHE
1c570 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20  RE_ORDERBY;.    
1c580 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43      }.        sC
1c590 6f 73 74 2e 70 6c 61 6e 2e 6e 45 71 20 3d 20 30  ost.plan.nEq = 0
1c5a0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 28 64 6f  ;.        /* (do
1c5b0 75 62 6c 65 29 32 20 49 6e 20 63 61 73 65 20 6f  uble)2 In case o
1c5c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1c5d0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20  OATING_POINT... 
1c5e0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
1c5f0 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28  SQLITE_BIG_DBL/(
1c600 28 64 6f 75 62 6c 65 29 32 29 29 3c 73 43 6f 73  (double)2))<sCos
1c610 74 2e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20  t.rCost ){.     
1c620 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74       /* The cost
1c630 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
1c640 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  to be larger tha
1c650 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  n SQLITE_BIG_DBL
1c660 20 28 74 68 65 0a 20 20 20 20 20 20 20 20 20 20   (the.          
1c670 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c 75 65 20  ** inital value 
1c680 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e  of lowestCost in
1c690 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69   this loop. If i
1c6a0 74 20 69 73 2c 20 74 68 65 6e 0a 20 20 20 20 20  t is, then.     
1c6b0 20 20 20 20 20 2a 2a 20 74 68 65 20 28 63 6f 73       ** the (cos
1c6c0 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65  t<lowestCost) te
1c6d0 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65  st below will ne
1c6e0 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20 20 20  ver be true..   
1c6f0 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20         */ .     
1c700 20 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29       /* (double)
1c710 32 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c  2 In case of SQL
1c720 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1c730 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20  G_POINT... */.  
1c740 20 20 20 20 20 20 20 20 73 43 6f 73 74 2e 72 43          sCost.rC
1c750 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f 42 49  ost = (SQLITE_BI
1c760 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32  G_DBL/((double)2
1c770 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
1c780 20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69      }else .#endi
1c790 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
1c7a0 20 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72    bestIndex(pPar
1c7b0 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65  se, pWC, pTabIte
1c7c0 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20  m, notReady,.   
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1c7e0 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42  i==0 && ppOrderB
1c7f0 79 29 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20  y) ? *ppOrderBy 
1c800 3a 20 30 2c 20 26 73 43 6f 73 74 29 3b 0a 20 20  : 0, &sCost);.  
1c810 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c820 6f 6e 63 65 3d 3d 30 20 7c 7c 20 73 43 6f 73 74  once==0 || sCost
1c830 2e 72 43 6f 73 74 3c 62 65 73 74 50 6c 61 6e 2e  .rCost<bestPlan.
1c840 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rCost ){.       
1c850 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20   once = 1;.     
1c860 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 43     bestPlan = sC
1c870 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 62 65 73  ost;.        bes
1c880 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a  tJ = j;.      }.
1c890 20 20 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52        if( doNotR
1c8a0 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a  eorder ) break;.
1c8b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1c8c0 28 20 6f 6e 63 65 20 29 3b 0a 20 20 20 20 61 73  ( once );.    as
1c8d0 73 65 72 74 28 20 6e 6f 74 52 65 61 64 79 20 26  sert( notReady &
1c8e0 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
1c8f0 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62  t, pTabList->a[b
1c900 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29  estJ].iCursor) )
1c910 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
1c920 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
1c930 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25   selects table %
1c940 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22  d for loop %d\n"
1c950 2c 20 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20  , bestJ,.       
1c960 20 20 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66      pLevel-pWInf
1c970 6f 2d 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20  o->a));.    if( 
1c980 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77  (bestPlan.plan.w
1c990 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
1c9a0 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20  RDERBY)!=0 ){.  
1c9b0 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
1c9c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e   0;.    }.    an
1c9d0 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 50 6c  dFlags &= bestPl
1c9e0 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b  an.plan.wsFlags;
1c9f0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  .    pLevel->pla
1ca00 6e 20 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  n = bestPlan.pla
1ca10 6e 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74 50  n;.    if( bestP
1ca20 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
1ca30 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
1ca40 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
1ca50 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
1ca60 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1ca70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
1ca80 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d  vel->iIdxCur = -
1ca90 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74  1;.    }.    not
1caa0 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
1cab0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
1cac0 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69  List->a[bestJ].i
1cad0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65  Cursor);.    pLe
1cae0 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28 75 38  vel->iFrom = (u8
1caf0 29 62 65 73 74 4a 3b 0a 0a 20 20 20 20 2f 2a 20  )bestJ;..    /* 
1cb00 43 68 65 63 6b 20 74 68 61 74 20 69 66 20 74 68  Check that if th
1cb10 65 20 74 61 62 6c 65 20 73 63 61 6e 6e 65 64 20  e table scanned 
1cb20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 74 65  by this loop ite
1cb30 72 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20  ration had an.  
1cb40 20 20 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20    ** INDEXED BY 
1cb50 63 6c 61 75 73 65 20 61 74 74 61 63 68 65 64 20  clause attached 
1cb60 74 6f 20 69 74 2c 20 74 68 61 74 20 74 68 65 20  to it, that the 
1cb70 6e 61 6d 65 64 20 69 6e 64 65 78 20 69 73 20 62  named index is b
1cb80 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64  eing.    ** used
1cb90 20 66 6f 72 20 74 68 65 20 73 63 61 6e 2e 20 49   for the scan. I
1cba0 66 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65 72  f not, then quer
1cbb0 79 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61  y compilation ha
1cbc0 73 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a  s failed..    **
1cbd0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
1cbe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64  ..    */.    pId
1cbf0 78 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  x = pTabList->a[
1cc00 62 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20  bestJ].pIndex;. 
1cc10 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20     if( pIdx ){. 
1cc20 20 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c       if( (bestPl
1cc30 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  an.plan.wsFlags 
1cc40 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
1cc50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1cc60 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1cc70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75  Parse, "cannot u
1cc80 73 65 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 70  se index: %s", p
1cc90 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
1cca0 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42       goto whereB
1ccb0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  eginError;.     
1ccc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ccd0 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44  /* If an INDEXED
1cce0 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 75 73   BY clause is us
1ccf0 65 64 2c 20 74 68 65 20 62 65 73 74 49 6e 64 65  ed, the bestInde
1cd00 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  x() function is.
1cd10 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61          ** guara
1cd20 6e 74 65 65 64 20 74 6f 20 66 69 6e 64 20 74 68  nteed to find th
1cd30 65 20 69 6e 64 65 78 20 73 70 65 63 69 66 69 65  e index specifie
1cd40 64 20 69 6e 20 74 68 65 20 49 4e 44 45 58 45 44  d in the INDEXED
1cd50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20   BY clause.     
1cd60 20 20 20 2a 2a 20 69 66 20 69 74 20 66 69 6e 64     ** if it find
1cd70 20 61 6e 20 69 6e 64 65 78 20 61 74 20 61 6c 6c   an index at all
1cd80 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
1cd90 65 72 74 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c  ert( bestPlan.pl
1cda0 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78 20  an.u.pIdx==pIdx 
1cdb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1cdc0 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43  .  }.  WHERETRAC
1cdd0 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
1cde0 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
1cdf0 22 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  "));.  if( db->m
1ce00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1ce10 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
1ce20 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  inError;.  }..  
1ce30 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20  /* If the total 
1ce40 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63  query only selec
1ce50 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c  ts a single row,
1ce60 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20   then the ORDER 
1ce70 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69  BY.  ** clause i
1ce80 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20  s irrelevant..  
1ce90 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61  */.  if( (andFla
1cea0 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55  gs & WHERE_UNIQU
1ceb0 45 29 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72  E)!=0 && ppOrder
1cec0 42 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64  By ){.    *ppOrd
1ced0 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erBy = 0;.  }.. 
1cee0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
1cef0 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  r is an UPDATE o
1cf00 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
1cf10 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65  nt that is reque
1cf20 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73  sting.  ** to us
1cf30 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  e a one-pass alg
1cf40 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e  orithm, determin
1cf50 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70  e if this is app
1cf60 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54  ropriate..  ** T
1cf70 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f  he one-pass algo
1cf80 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73  rithm only works
1cf90 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
1cfa0 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
1cfb0 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  .  ** the statem
1cfc0 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20  ent to update a 
1cfd0 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f  single row..  */
1cfe0 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
1cff0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
1d000 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
1d010 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c  =0 || pWInfo->nL
1d020 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28  evel==1 );.  if(
1d030 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
1d040 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
1d050 49 52 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64  IRED)!=0 && (and
1d060 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e  Flags & WHERE_UN
1d070 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  IQUE)!=0 ){.    
1d080 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
1d090 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66  s = 1;.    pWInf
1d0a0 6f 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46  o->a[0].plan.wsF
1d0b0 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49  lags &= ~WHERE_I
1d0c0 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20  DX_ONLY;.  }..  
1d0d0 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
1d0e0 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
1d0f0 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
1d100 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
1d110 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
1d120 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
1d130 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  /.  sqlite3CodeV
1d140 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
1d150 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65  se, -1); /* Inse
1d160 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  rt the cookie ve
1d170 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20  rifier Goto */. 
1d180 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
1d190 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54  =pWInfo->a; i<pT
1d1a0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1d1b0 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
1d1c0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
1d1d0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f     /* Table to o
1d1e0 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  pen */.    int i
1d1f0 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Db;         /* I
1d200 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
1d210 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
1d220 65 2f 69 6e 64 65 78 20 2a 2f 0a 0a 23 69 66 6e  e/index */..#ifn
1d230 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d240 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20  EXPLAIN.    if( 
1d250 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
1d260 3d 32 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =2 ){.      char
1d270 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73 74   *zMsg;.      st
1d280 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1d290 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
1d2a0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
1d2b0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d  iFrom];.      zM
1d2c0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
1d2d0 6e 74 66 28 64 62 2c 20 22 54 41 42 4c 45 20 25  ntf(db, "TABLE %
1d2e0 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  s", pItem->zName
1d2f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
1d300 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
1d310 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1d320 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1d330 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73   zMsg, "%s AS %s
1d340 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
1d350 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
1d360 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 76  .      if( (pLev
1d370 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1d380 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
1d390 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1d3a0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1d3b0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1d3c0 20 22 25 73 20 57 49 54 48 20 49 4e 44 45 58 20   "%s WITH INDEX 
1d3d0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
1d3e0 7a 4d 73 67 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c  zMsg, pLevel->pl
1d3f0 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
1d400 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1d410 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
1d420 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1d430 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20  MULTI_OR ){.    
1d440 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1d450 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1d460 4d 73 67 2c 20 22 25 73 20 56 49 41 20 4d 55 4c  Msg, "%s VIA MUL
1d470 54 49 2d 49 4e 44 45 58 20 55 4e 49 4f 4e 22 2c  TI-INDEX UNION",
1d480 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
1d490 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
1d4a0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28  plan.wsFlags & (
1d4b0 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
1d4c0 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
1d4d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  ) ){.        zMs
1d4e0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1d4f0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1d500 73 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20  s USING PRIMARY 
1d510 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  KEY", zMsg);.   
1d520 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1d530 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1d540 54 41 42 4c 45 0a 20 20 20 20 20 20 65 6c 73 65  TABLE.      else
1d550 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
1d560 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1d570 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1d580 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
1d590 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1d5a0 6f 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c  o *pVtabIdx = pL
1d5b0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74  evel->plan.u.pVt
1d5c0 61 62 49 64 78 3b 0a 20 20 20 20 20 20 20 20 7a  abIdx;.        z
1d5d0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1d5e0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1d5f0 22 25 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c  "%s VIRTUAL TABL
1d600 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20  E INDEX %d:%s", 
1d610 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  zMsg,.          
1d620 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49            pVtabI
1d630 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 56 74 61  dx->idxNum, pVta
1d640 62 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20  bIdx->idxStr);. 
1d650 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1d660 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
1d670 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1d680 48 45 52 45 5f 4f 52 44 45 52 42 59 20 29 7b 0a  HERE_ORDERBY ){.
1d690 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
1d6a0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1d6b0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 4f 52 44  b, zMsg, "%s ORD
1d6c0 45 52 20 42 59 22 2c 20 7a 4d 73 67 29 3b 0a 20  ER BY", zMsg);. 
1d6d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1d6e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1d6f0 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 2c  , OP_Explain, i,
1d700 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
1d710 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
1d720 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  MIC);.    }.#end
1d730 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1d740 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20  T_EXPLAIN */.   
1d750 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
1d760 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
1d770 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61  >iFrom];.    pTa
1d780 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
1d790 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ab;.    iDb = sq
1d7a0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1d7b0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
1d7c0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
1d7d0 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
1d7e0 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
1d7f0 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61  meral)!=0 || pTa
1d800 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e  b->pSelect ) con
1d810 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53  tinue;.#ifndef S
1d820 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1d830 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
1d840 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
1d850 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
1d860 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
1d870 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  {.      int iCur
1d880 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
1d890 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
1d8a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1d8b0 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
1d8c0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1d8e0 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 61 62  const char*)pTab
1d8f0 2d 3e 70 56 74 61 62 2c 20 50 34 5f 56 54 41 42  ->pVtab, P4_VTAB
1d900 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
1d910 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65  dif.    if( (pLe
1d920 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1d930 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
1d940 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
1d950 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
1d960 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
1d970 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
1d980 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f  t op = pWInfo->o
1d990 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70  kOnePass ? OP_Op
1d9a0 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65  enWrite : OP_Ope
1d9b0 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c  nRead;.      sql
1d9c0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
1d9d0 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
1d9e0 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54  iCursor, iDb, pT
1d9f0 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 69  ab, op);.      i
1da00 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  f( !pWInfo->okOn
1da10 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
1da20 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20  Col<BMS ){.     
1da30 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
1da40 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
1da50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
1da60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
1da70 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
1da80 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
1da90 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1daa0 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
1dab0 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
1dac0 20 28 63 68 61 72 2a 29 6e 2c 20 50 34 5f 49 4e   (char*)n, P4_IN
1dad0 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73  T32);.        as
1dae0 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e  sert( n<=pTab->n
1daf0 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Col );.      }. 
1db00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1db10 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
1db20 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
1db30 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
1db40 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
1db50 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
1db60 62 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  bCur = pTabItem-
1db70 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66  >iCursor;.    if
1db80 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
1db90 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1dba0 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20  INDEXED)!=0 ){. 
1dbb0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20       Index *pIx 
1dbc0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
1dbd0 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 4b 65 79  .pIdx;.      Key
1dbe0 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c  Info *pKey = sql
1dbf0 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
1dc00 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20  (pParse, pIx);. 
1dc10 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72       int iIdxCur
1dc20 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
1dc30 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ur;.      assert
1dc40 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
1dc50 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
1dc60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1dc70 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20  IdxCur>=0 );.   
1dc80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1dc90 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp4(v, OP_OpenR
1dca0 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49  ead, iIdxCur, pI
1dcb0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcd0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
1dce0 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
1dcf0 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64  NDOFF);.      Vd
1dd00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
1dd10 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29  s", pIx->zName))
1dd20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1dd30 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1dd40 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
1dd50 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
1dd60 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  iTop = sqlite3Vd
1dd70 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1dd80 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1dd90 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20   the code to do 
1dda0 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63  the search.  Eac
1ddb0 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  h iteration of t
1ddc0 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70  he for.  ** loop
1ddd0 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73   below generates
1dde0 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
1ddf0 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  le nested loop o
1de00 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72  f the VM.  ** pr
1de10 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ogram..  */.  no
1de20 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
1de30 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sk)0;.  for(i=0;
1de40 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1de50 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 6f 74  c; i++){.    not
1de60 52 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c  Ready = codeOneL
1de70 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c  oopStart(pWInfo,
1de80 20 69 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20   i, wctrlFlags, 
1de90 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70  notReady);.    p
1dea0 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
1deb0 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e   = pWInfo->a[i].
1dec0 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 23  addrCont;.  }..#
1ded0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1dee0 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e  T  /* For testin
1def0 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
1df00 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a  use only */.  /*
1df10 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71   Record in the q
1df20 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d  uery plan inform
1df30 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1df40 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20  current table.  
1df50 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
1df60 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
1df70 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66  it (if any).  If
1df80 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
1df90 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73  f.  ** is not us
1dfa0 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20  ed, its name is 
1dfb0 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e  just '{}'.  If n
1dfc0 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a  o index is used.
1dfd0 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
1dfe0 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22  s listed as "{}"
1dff0 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72  .  If the primar
1e000 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68  y key is used th
1e010 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d  e.  ** index nam
1e020 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20  e is '*'..  */. 
1e030 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1e040 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
1e050 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
1e060 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c     int n;.    pL
1e070 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
1e080 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74  a[i];.    pTabIt
1e090 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
1e0a0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
1e0b0 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74  ;.    z = pTabIt
1e0c0 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  em->zAlias;.    
1e0d0 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
1e0e0 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
1e0f0 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 71  Name;.    n = sq
1e100 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
1e110 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c  ;.    if( n+nQPl
1e120 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69  an < sizeof(sqli
1e130 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d  te3_query_plan)-
1e140 31 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  10 ){.      if( 
1e150 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1e160 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
1e170 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  _ONLY ){.       
1e180 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
1e190 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
1e1a0 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20  an], "{}", 2);. 
1e1b0 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d         nQPlan +=
1e1c0 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   2;.      }else{
1e1d0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1e1e0 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
1e1f0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20  lan[nQPlan], z, 
1e200 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  n);.        nQPl
1e210 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  an += n;.      }
1e220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71  .      sqlite3_q
1e230 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
1e240 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d  ++] = ' ';.    }
1e250 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1e260 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1e270 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
1e280 44 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74  D_EQ );.    test
1e290 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  case( pLevel->pl
1e2a0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1e2b0 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29  RE_ROWID_RANGE )
1e2c0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
1e2d0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
1e2e0 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51   (WHERE_ROWID_EQ
1e2f0 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
1e300 47 45 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  GE) ){.      mem
1e310 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
1e320 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
1e330 20 22 2a 20 22 2c 20 32 29 3b 0a 20 20 20 20 20   "* ", 2);.     
1e340 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
1e350 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 65    }else if( (pLe
1e360 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1e370 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1e380 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  D)!=0 ){.      n
1e390 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1e3a0 33 30 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  30(pLevel->plan.
1e3b0 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  u.pIdx->zName);.
1e3c0 20 20 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c        if( n+nQPl
1e3d0 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69  an < sizeof(sqli
1e3e0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d  te3_query_plan)-
1e3f0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  2 ){.        mem
1e400 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
1e410 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
1e420 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
1e430 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b  pIdx->zName, n);
1e440 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
1e450 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 73 71  += n;.        sq
1e460 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
1e470 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27  [nQPlan++] = ' '
1e480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1e490 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  lse{.      memcp
1e4a0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
1e4b0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
1e4c0 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20 20 20 20  {} ", 3);.      
1e4d0 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20  nQPlan += 3;.   
1e4e0 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20   }.  }.  while( 
1e4f0 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73 71 6c 69  nQPlan>0 && sqli
1e500 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
1e510 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b  QPlan-1]==' ' ){
1e520 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65  .    sqlite3_que
1e530 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e  ry_plan[--nQPlan
1e540 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  ] = 0;.  }.  sql
1e550 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
1e560 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e  nQPlan] = 0;.  n
1e570 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65 6e 64 69  QPlan = 0;.#endi
1e580 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
1e590 20 2f 2f 20 54 65 73 74 69 6e 67 20 61 6e 64 20   // Testing and 
1e5a0 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
1e5b0 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f  ly */..  /* Reco
1e5c0 72 64 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  rd the continuat
1e5d0 69 6f 6e 20 61 64 64 72 65 73 73 20 69 6e 20 74  ion address in t
1e5e0 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
1e5f0 75 63 74 75 72 65 2e 20 20 54 68 65 6e 0a 20 20  ucture.  Then.  
1e600 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** clean up and 
1e610 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 72  return..  */.  r
1e620 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20  eturn pWInfo;.. 
1e630 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1e640 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
1e650 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72  .whereBeginError
1e660 3a 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65  :.  whereInfoFre
1e670 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
1e680 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1e690 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
1e6a0 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
1e6b0 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d  E loop.  See com
1e6c0 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c  ments on .** sql
1e6d0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1e6e0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
1e6f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
1e700 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72  void sqlite3Wher
1e710 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a  eEnd(WhereInfo *
1e720 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65  pWInfo){.  Parse
1e730 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66   *pParse = pWInf
1e740 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62  o->pParse;.  Vdb
1e750 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1e760 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
1e770 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1e780 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  vel;.  SrcList *
1e790 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
1e7a0 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
1e7b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1e7c0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47  rse->db;..  /* G
1e7d0 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72  enerate loop ter
1e7e0 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20  mination code.. 
1e7f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
1e800 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68  rClearColumnCach
1e810 65 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 0a 20  e(pParse, -1);. 
1e820 20 66 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d   for(i=pTabList-
1e830 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  >nSrc-1; i>=0; i
1e840 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20  --){.    pLevel 
1e850 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
1e860 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e870 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1e880 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
1e890 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
1e8a0 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
1e8b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1e8c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65  dbeAddOp2(v, pLe
1e8d0 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
1e8e0 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29  >p1, pLevel->p2)
1e8f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e900 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
1e910 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
1e920 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
1e930 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
1e940 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26   WHERE_IN_ABLE &
1e950 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  & pLevel->u.in.n
1e960 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74  In>0 ){.      st
1e970 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
1e980 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
1e990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e9a0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1e9b0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29  pLevel->addrNxt)
1e9c0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ;.      for(j=pL
1e9d0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20  evel->u.in.nIn, 
1e9e0 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69  pIn=&pLevel->u.i
1e9f0 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20  n.aInLoop[j-1]; 
1ea00 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29  j>0; j--, pIn--)
1ea10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ea20 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1ea30 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b   pIn->addrInTop+
1ea40 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
1ea50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ea60 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e 69   OP_Next, pIn->i
1ea70 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  Cur, pIn->addrIn
1ea80 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Top);.        sq
1ea90 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1eaa0 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
1eab0 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Top-1);.      }.
1eac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1ead0 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  ree(db, pLevel->
1eae0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  u.in.aInLoop);. 
1eaf0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1eb00 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1eb10 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
1eb20 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Brk);.    if( pL
1eb30 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
1eb40 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
1eb50 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  r;.      addr = 
1eb60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1eb70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70  1(v, OP_IfPos, p
1eb80 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1eb90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1eba0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1ebb0 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
1ebc0 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
1ebd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
1ebe0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
1ebf0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ec00 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1ec10 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
1ec20 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
1ec30 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1ec40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ec50 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
1ec60 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
1ec70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ec80 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1ec90 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dr);.    }.  }..
1eca0 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
1ecb0 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
1ecc0 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
1ecd0 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
1ece0 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
1ecf0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1ed00 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1ed10 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
1ed20 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  ak);..  /* Close
1ed30 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73   all of the curs
1ed40 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70  ors that were op
1ed50 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  ened by sqlite3W
1ed60 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a  hereBegin..  */.
1ed70 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
1ed80 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
1ed90 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1eda0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
1edb0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1edc0 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
1edd0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1ede0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1edf0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1ee00 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
1ee10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1ee20 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
1ee30 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
1ee40 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
1ee50 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
1ee60 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lect ) continue;
1ee70 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
1ee80 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
1ee90 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 29  HERE_OMIT_CLOSE)
1eea0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
1eeb0 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
1eec0 61 73 73 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e  ass && (pLevel->
1eed0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1eee0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
1eef0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1ef00 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1ef10 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
1ef20 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
1ef30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1ef40 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
1ef50 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1ef60 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20  INDEXED)!=0 ){. 
1ef70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ef80 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
1ef90 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lose, pLevel->iI
1efa0 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
1efb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1efc0 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20   this scan uses 
1efd0 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63  an index, make c
1efe0 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ode substitution
1eff0 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20  s to read data. 
1f000 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69     ** from the i
1f010 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e  ndex in preferen
1f020 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e  ce to the table.
1f030 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73   Sometimes, this
1f040 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
1f050 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76  e table need nev
1f060 65 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e  er be read from.
1f070 20 54 68 69 73 20 69 73 20 61 20 70 65 72 66 6f   This is a perfo
1f080 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20  rmance boost,.  
1f090 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65    ** as the vdbe
1f0a0 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74   level waits unt
1f0b0 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  il the table is 
1f0c0 72 65 61 64 20 62 65 66 6f 72 65 20 61 63 74 75  read before actu
1f0d0 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b  ally.    ** seek
1f0e0 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63 75  ing the table cu
1f0f0 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f  rsor to the reco
1f100 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  rd corresponding
1f110 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a   to the current.
1f120 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20      ** position 
1f130 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  in the index..  
1f140 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c    ** .    ** Cal
1f150 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ls to the code g
1f160 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77  enerator in betw
1f170 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65  een sqlite3Where
1f180 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a  Begin and.    **
1f190 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1f1a0 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74   will have creat
1f1b0 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66  ed code that ref
1f1c0 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c  erences the tabl
1f1d0 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  e.    ** directl
1f1e0 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63  y.  This loop sc
1f1f0 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64  ans all that cod
1f200 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70  e looking for op
1f210 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  codes.    ** tha
1f220 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  t reference the 
1f230 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72  table and conver
1f240 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63  ts them into opc
1f250 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a  odes that.    **
1f260 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69   reference the i
1f270 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndex..    */.   
1f280 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
1f290 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1f2a0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
1f2b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a  {.      int k, j
1f2c0 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64  , last;.      Vd
1f2d0 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20  beOp *pOp;.     
1f2e0 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70   Index *pIdx = p
1f2f0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
1f300 64 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 75 73  dx;.      int us
1f310 65 49 6e 64 65 78 4f 6e 6c 79 20 3d 20 70 4c 65  eIndexOnly = pLe
1f320 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1f330 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
1f340 4c 59 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  LY;..      asser
1f350 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20  t( pIdx!=0 );.  
1f360 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
1f370 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57  3VdbeGetOp(v, pW
1f380 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20  Info->iTop);.   
1f390 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65     last = sqlite
1f3a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1f3b0 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  (v);.      for(k
1f3c0 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b  =pWInfo->iTop; k
1f3d0 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b  <last; k++, pOp+
1f3e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1f3f0 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d  pOp->p1!=pLevel-
1f400 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69  >iTabCur ) conti
1f410 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1f420 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
1f430 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
1f440 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1f450 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  pIdx->nColumn; j
1f460 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1f470 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49   if( pOp->p2==pI
1f480 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  dx->aiColumn[j] 
1f490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f4a0 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20   pOp->p2 = j;.  
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
1f4c0 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
1f4d0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
1f4e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f4f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f500 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f510 61 73 73 65 72 74 28 21 75 73 65 49 6e 64 65 78  assert(!useIndex
1f520 4f 6e 6c 79 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e  Only || j<pIdx->
1f530 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
1f540 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
1f550 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69  >opcode==OP_Rowi
1f560 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  d ){.          p
1f570 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
1f580 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
1f590 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
1f5a0 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20  = OP_IdxRowid;. 
1f5b0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1f5c0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
1f5d0 5f 4e 75 6c 6c 52 6f 77 20 26 26 20 75 73 65 49  _NullRow && useI
1f5e0 6e 64 65 78 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  ndexOnly ){.    
1f5f0 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
1f600 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
1f610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f620 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1f630 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a  inal cleanup.  *
1f640 2f 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65  /.  whereInfoFre
1f650 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
1f660 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.