/ Hex Artifact Content
Login

Artifact 591db2b9bc4d65b60ab28554eb40dc357358c47a:


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: 32 20 32 30 30 39 2f 30 32 2f 32 33 20 31 37 3a  2 2009/02/23 17:
0350: 33 33 3a 35 30 20 64 61 6e 69 65 6c 6b 31 39 37  33:50 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 28 70 53  ED BY clause (pS
f6b0: 72 63 2d 3e 70 49 6e 64 65 78 29 20 61 74 74 61  rc->pIndex) atta
f6c0: 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  ched to the tabl
f6d0: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  e in.** the SQL 
f6e0: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
f6f0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  this function on
f700: 6c 79 20 63 6f 6e 73 69 64 65 72 73 20 70 6c 61  ly considers pla
f710: 6e 73 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  ns using the .**
f720: 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 49 66   named index. If
f730: 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66   one cannot be f
f740: 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 72  ound, then the r
f750: 65 74 75 72 6e 65 64 20 63 6f 73 74 20 69 73 0a  eturned cost is.
f760: 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  ** SQLITE_BIG_DB
f770: 4c 2e 20 49 66 20 61 20 70 6c 61 6e 20 63 61 6e  L. If a plan can
f780: 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 75   be found that u
f790: 73 65 73 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ses the named in
f7a0: 64 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68  dex, .** then th
f7b0: 65 20 63 6f 73 74 20 69 73 20 63 61 6c 63 75 6c  e cost is calcul
f7c0: 61 74 65 64 20 69 6e 20 74 68 65 20 75 73 75 61  ated in the usua
f7d0: 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  l way..**.** If 
f7e0: 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  a NOT INDEXED cl
f7f0: 61 75 73 65 20 28 70 53 72 63 2d 3e 6e 6f 74 49  ause (pSrc->notI
f800: 6e 64 65 78 65 64 21 3d 30 29 20 77 61 73 20 61  ndexed!=0) was a
f810: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
f820: 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20  able .** in the 
f830: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f840: 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65  , then no indexe
f850: 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
f860: 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a  . However, the .
f870: 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e  ** selected plan
f880: 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20   may still take 
f890: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
f8a0: 20 74 61 62 6c 65 73 20 62 75 69 6c 74 2d 69 6e   tables built-in
f8b0: 20 72 6f 77 69 64 0a 2a 2a 20 69 6e 64 65 78 2e   rowid.** index.
f8c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f8d0: 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72  bestIndex(.  Par
f8e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
f8f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f900: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
f910: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
f920: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
f930: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
f940: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
f950: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
f960: 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
f970: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
f980: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
f990: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
f9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
f9b0: 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
f9c0: 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
f9d0: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
f9e0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
f9f0: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
fa00: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
fa10: 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74  WhereCost *pCost
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
fa30: 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
fa40: 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 57 68   plan */.){.  Wh
fa50: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
fa60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
fa70: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
fa80: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
fa90: 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  /.  int iCur = p
faa0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20  Src->iCursor;   
fab0: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66  /* The cursor of
fac0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
fad0: 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49   accessed */.  I
fae0: 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
faf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
fb00: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
fb10: 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e  aluating */.  in
fb20: 74 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  t rev;          
fb30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
fb40: 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  e to scan in rev
fb50: 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
fb60: 69 6e 74 20 77 73 46 6c 61 67 73 3b 20 20 20 20  int wsFlags;    
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
fb80: 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20  lags associated 
fb90: 77 69 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a 20  with pProbe */. 
fba0: 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20   int nEq;       
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fbc0: 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
fbd0: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  IN constraints *
fbe0: 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61  /.  int eqTermMa
fbf0: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
fc00: 2f 2a 20 4d 61 73 6b 20 6f 66 20 76 61 6c 69 64  /* Mask of valid
fc10: 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74   equality operat
fc20: 6f 72 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ors */.  double 
fc30: 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  cost;           
fc40: 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
fc50: 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a  using pProbe */.
fc60: 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20    double nRow;  
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fc80: 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
fc90: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 72 65 73  r of rows in res
fca0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  ult set */.  int
fcb0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
fcc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
fcd0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 42 69   counter */.  Bi
fce0: 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 3b 20 20  tmask maskSrc;  
fcf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
fd00: 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 70 53 72  mask for the pSr
fd10: 63 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 57 48  c table */..  WH
fd20: 45 52 45 54 52 41 43 45 28 28 22 62 65 73 74 49  ERETRACE(("bestI
fd30: 6e 64 65 78 3a 20 74 62 6c 3d 25 73 20 6e 6f 74  ndex: tbl=%s not
fd40: 52 65 61 64 79 3d 25 6c 6c 78 5c 6e 22 2c 20 70  Ready=%llx\n", p
fd50: 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  Src->pTab->zName
fd60: 2c 6e 6f 74 52 65 61 64 79 29 29 3b 0a 20 20 70  ,notReady));.  p
fd70: 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 54  Probe = pSrc->pT
fd80: 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 69 66  ab->pIndex;.  if
fd90: 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
fda0: 65 64 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65  ed ){.    pProbe
fdb0: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
fdc0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  If the table has
fdd0: 20 6e 6f 20 69 6e 64 69 63 65 73 20 61 6e 64 20   no indices and 
fde0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 65 72  there are no ter
fdf0: 6d 73 20 69 6e 20 74 68 65 20 77 68 65 72 65 0a  ms in the where.
fe00: 20 20 2a 2a 20 63 6c 61 75 73 65 20 74 68 61 74    ** clause that
fe10: 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 52 4f   refer to the RO
fe20: 57 49 44 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  WID, then we wil
fe30: 6c 20 6e 65 76 65 72 20 62 65 20 61 62 6c 65 20  l never be able 
fe40: 74 6f 20 64 6f 0a 20 20 2a 2a 20 61 6e 79 74 68  to do.  ** anyth
fe50: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
fe60: 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
fe70: 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20   on this table. 
fe80: 20 57 65 20 6d 69 67 68 74 20 61 73 0a 20 20 2a   We might as.  *
fe90: 2a 20 77 65 6c 6c 20 70 75 74 20 69 74 20 66 69  * well put it fi
fea0: 72 73 74 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rst in the join 
feb0: 6f 72 64 65 72 2e 20 20 54 68 61 74 20 77 61 79  order.  That way
fec0: 2c 20 70 65 72 68 61 70 73 20 69 74 20 63 61 6e  , perhaps it can
fed0: 20 62 65 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e   be.  ** referen
fee0: 63 65 64 20 62 79 20 6f 74 68 65 72 20 74 61 62  ced by other tab
fef0: 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2e  les in the join.
ff00: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70  .  */.  memset(p
ff10: 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Cost, 0, sizeof(
ff20: 2a 70 43 6f 73 74 29 29 3b 0a 20 20 69 66 28 20  *pCost));.  if( 
ff30: 70 50 72 6f 62 65 3d 3d 30 20 26 26 0a 20 20 20  pProbe==0 &&.   
ff40: 20 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20    findTerm(pWC, 
ff50: 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f  iCur, -1, 0, WO_
ff60: 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c 54 7c 57  EQ|WO_IN|WO_LT|W
ff70: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
ff80: 2c 30 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 28  ,0)==0 &&.     (
ff90: 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 21  pOrderBy==0 || !
ffa0: 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28  sortableByRowid(
ffb0: 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  iCur, pOrderBy, 
ffc0: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 26  pWC->pMaskSet, &
ffd0: 72 65 76 29 29 20 29 7b 0a 20 20 20 20 72 65 74  rev)) ){.    ret
ffe0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74  urn;.  }.  pCost
fff0: 2d 3e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  ->rCost = SQLITE
10000 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20  _BIG_DBL;..  /* 
10010 43 68 65 63 6b 20 66 6f 72 20 61 20 72 6f 77 69  Check for a rowi
10020 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20  d=EXPR or rowid 
10030 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61  IN (...) constra
10040 69 6e 74 73 2e 20 49 66 20 74 68 65 72 65 20 77  ints. If there w
10050 61 73 0a 20 20 2a 2a 20 61 6e 20 49 4e 44 45 58  as.  ** an INDEX
10060 45 44 20 42 59 20 63 6c 61 75 73 65 20 61 74 74  ED BY clause att
10070 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61  ached to this ta
10080 62 6c 65 2c 20 73 6b 69 70 20 74 68 69 73 20 73  ble, skip this s
10090 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tep..  */.  if( 
100a0 21 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b  !pSrc->pIndex ){
100b0 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
100c0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
100d0 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
100e0 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a  O_EQ|WO_IN, 0);.
100f0 20 20 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b      if( pTerm ){
10100 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
10110 70 72 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  pr;.      pCost-
10120 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20  >plan.wsFlags = 
10130 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a  WHERE_ROWID_EQ;.
10140 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
10150 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
10160 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  EQ ){.        /*
10170 20 52 6f 77 69 64 3d 3d 20 69 73 20 61 6c 77 61   Rowid== is alwa
10180 79 73 20 74 68 65 20 62 65 73 74 20 70 69 63 6b  ys the best pick
10190 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72 74 68  .  Look no furth
101a0 65 72 2e 20 20 42 65 63 61 75 73 65 20 6f 6e 6c  er.  Because onl
101b0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73  y.        ** a s
101c0 69 6e 67 6c 65 20 72 6f 77 20 69 73 20 67 65 6e  ingle row is gen
101d0 65 72 61 74 65 64 2c 20 6f 75 74 70 75 74 20 69  erated, output i
101e0 73 20 61 6c 77 61 79 73 20 69 6e 20 73 6f 72 74  s always in sort
101f0 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ed order */.    
10200 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
10210 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
10220 52 4f 57 49 44 5f 45 51 20 7c 20 57 48 45 52 45  ROWID_EQ | WHERE
10230 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20  _UNIQUE;.       
10240 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71   pCost->plan.nEq
10250 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 57 48   = 1;.        WH
10260 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 62  ERETRACE(("... b
10270 65 73 74 20 69 73 20 72 6f 77 69 64 5c 6e 22 29  est is rowid\n")
10280 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  );.        pCost
10290 2d 3e 72 43 6f 73 74 20 3d 20 30 3b 0a 20 20 20  ->rCost = 0;.   
102a0 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77       pCost->nRow
102b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
102c0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  turn;.      }els
102d0 65 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72  e if( !ExprHasPr
102e0 6f 70 65 72 74 79 28 28 70 45 78 70 72 20 3d 20  operty((pExpr = 
102f0 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 2c 20 45  pTerm->pExpr), E
10300 50 5f 78 49 73 53 65 6c 65 63 74 29 20 0a 20 20  P_xIsSelect) .  
10310 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 45             && pE
10320 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 0a 20 20  xpr->x.pList .  
10330 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
10340 2a 20 52 6f 77 69 64 20 49 4e 20 28 4c 49 53 54  * Rowid IN (LIST
10350 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e  ): cost is NlogN
10360 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
10370 6e 75 6d 62 65 72 20 6f 66 20 6c 69 73 74 0a 20  number of list. 
10380 20 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e         ** elemen
10390 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ts.  */.        
103a0 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 70  pCost->rCost = p
103b0 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 70 45 78  Cost->nRow = pEx
103c0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
103d0 70 72 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73  pr;.        pCos
103e0 74 2d 3e 72 43 6f 73 74 20 2a 3d 20 65 73 74 4c  t->rCost *= estL
103f0 6f 67 28 70 43 6f 73 74 2d 3e 72 43 6f 73 74 29  og(pCost->rCost)
10400 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10410 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
10420 49 4e 20 28 53 45 4c 45 43 54 29 3a 20 63 6f 73  IN (SELECT): cos
10430 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65  t is NlogN where
10440 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
10450 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 20   of rows.       
10460 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
10470 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  t of the inner s
10480 65 6c 65 63 74 2e 20 20 57 65 20 68 61 76 65 20  elect.  We have 
10490 6e 6f 20 77 61 79 20 74 6f 20 65 73 74 69 6d 61  no way to estima
104a0 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  te.        ** th
104b0 61 74 20 76 61 6c 75 65 20 73 6f 20 6d 61 6b 65  at value so make
104c0 20 61 20 77 69 6c 64 20 67 75 65 73 73 2e 20 2a   a wild guess. *
104d0 2f 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  /.        pCost-
104e0 3e 6e 52 6f 77 20 3d 20 31 30 30 3b 0a 20 20 20  >nRow = 100;.   
104f0 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73       pCost->rCos
10500 74 20 3d 20 32 30 30 3b 0a 20 20 20 20 20 20 7d  t = 200;.      }
10510 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
10520 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20 49 4e  E(("... rowid IN
10530 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20   cost: %.9g\n", 
10540 70 43 6f 73 74 2d 3e 72 43 6f 73 74 29 29 3b 0a  pCost->rCost));.
10550 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
10560 45 73 74 69 6d 61 74 65 20 74 68 65 20 63 6f 73  Estimate the cos
10570 74 20 6f 66 20 61 20 74 61 62 6c 65 20 73 63 61  t of a table sca
10580 6e 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  n.  If we do not
10590 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20   know how many. 
105a0 20 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 61 72     ** entries ar
105b0 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  e in the table, 
105c0 75 73 65 20 31 20 6d 69 6c 6c 69 6f 6e 20 61 73  use 1 million as
105d0 20 61 20 67 75 65 73 73 2e 0a 20 20 20 20 2a 2f   a guess..    */
105e0 0a 20 20 20 20 63 6f 73 74 20 3d 20 70 50 72 6f  .    cost = pPro
105f0 62 65 20 3f 20 70 50 72 6f 62 65 2d 3e 61 69 52  be ? pProbe->aiR
10600 6f 77 45 73 74 5b 30 5d 20 3a 20 31 30 30 30 30  owEst[0] : 10000
10610 30 30 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  00;.    WHERETRA
10620 43 45 28 28 22 2e 2e 2e 20 74 61 62 6c 65 20 73  CE(("... table s
10630 63 61 6e 20 62 61 73 65 20 63 6f 73 74 3a 20 25  can base cost: %
10640 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
10650 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20 57 48      wsFlags = WH
10660 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b  ERE_ROWID_RANGE;
10670 0a 20 20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  .  .    /* Check
10680 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
10690 20 6f 6e 20 61 20 72 61 6e 67 65 20 6f 66 20 72   on a range of r
106a0 6f 77 69 64 73 20 69 6e 20 61 20 74 61 62 6c 65  owids in a table
106b0 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   scan..    */.  
106c0 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
106d0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
106e0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
106f0 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
10700 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  _GE, 0);.    if(
10710 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20   pTerm ){.      
10720 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
10730 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
10740 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
10750 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  E, 0) ){.       
10760 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
10770 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
10780 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20       cost /= 3; 
10790 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20 72   /* Guess that r
107a0 6f 77 69 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e  owid<EXPR elimin
107b0 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20  ates two-thirds 
107c0 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  of rows */.     
107d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 69 6e   }.      if( fin
107e0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
107f0 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
10800 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 20 29  O_GT|WO_GE, 0) )
10810 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67  {.        wsFlag
10820 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c  s |= WHERE_BTM_L
10830 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 63 6f  IMIT;.        co
10840 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65  st /= 3;  /* Gue
10850 73 73 20 74 68 61 74 20 72 6f 77 69 64 3e 45 58  ss that rowid>EX
10860 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77  PR eliminates tw
10870 6f 2d 74 68 69 72 64 73 20 6f 66 20 72 6f 77 73  o-thirds of rows
10880 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
10890 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
108a0 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65 20 72  .. rowid range r
108b0 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25  educes cost to %
108c0 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
108d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
108e0 20 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20   wsFlags = 0;.  
108f0 20 20 7d 0a 20 20 20 20 6e 52 6f 77 20 3d 20 63    }.    nRow = c
10900 6f 73 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  ost;.  .    /* I
10910 66 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e  f the table scan
10920 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66   does not satisf
10930 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  y the ORDER BY c
10940 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73 65 0a  lause, increase.
10950 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 73 74 20      ** the cost 
10960 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f 76 65  by NlogN to cove
10970 72 20 74 68 65 20 65 78 70 65 6e 73 65 20 6f 66  r the expense of
10980 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20   sorting. */.   
10990 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
109a0 0a 20 20 20 20 20 20 69 66 28 20 73 6f 72 74 61  .      if( sorta
109b0 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c  bleByRowid(iCur,
109c0 20 70 4f 72 64 65 72 42 79 2c 20 70 57 43 2d 3e   pOrderBy, pWC->
109d0 70 4d 61 73 6b 53 65 74 2c 20 26 72 65 76 29 20  pMaskSet, &rev) 
109e0 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  ){.        wsFla
109f0 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45  gs |= WHERE_ORDE
10a00 52 42 59 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  RBY|WHERE_ROWID_
10a10 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 69  RANGE;.        i
10a20 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20  f( rev ){.      
10a30 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
10a40 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20  HERE_REVERSE;.  
10a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
10a60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 73  lse{.        cos
10a70 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67  t += cost*estLog
10a80 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  (cost);.        
10a90 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
10aa0 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73   sorting increas
10ab0 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c  es cost to %.9g\
10ac0 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20  n", cost));.    
10ad0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
10ae0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
10af0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76  ags & SQLITE_Rev
10b00 65 72 73 65 4f 72 64 65 72 20 29 7b 0a 20 20 20  erseOrder ){.   
10b10 20 20 20 2f 2a 20 46 6f 72 20 61 70 70 6c 69 63     /* For applic
10b20 61 74 69 6f 6e 20 74 65 73 74 69 6e 67 2c 20 72  ation testing, r
10b30 61 6e 64 6f 6d 6c 79 20 72 65 76 65 72 73 65 20  andomly reverse 
10b40 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72  the output order
10b50 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 53 45   for.      ** SE
10b60 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
10b70 74 68 61 74 20 6f 6d 69 74 20 74 68 65 20 4f 52  that omit the OR
10b80 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
10b90 54 68 69 73 20 77 69 6c 6c 20 68 65 6c 70 0a 20  This will help. 
10ba0 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20       ** to find 
10bb0 63 61 73 65 73 20 77 68 65 72 65 0a 20 20 20 20  cases where.    
10bc0 20 20 2a 2f 0a 20 20 20 20 20 20 77 73 46 6c 61    */.      wsFla
10bd0 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
10be0 52 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  RSE;.    }..    
10bf0 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 69 73  /* Remember this
10c00 20 63 61 73 65 20 69 66 20 69 74 20 69 73 20 74   case if it is t
10c10 68 65 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a  he best so far *
10c20 2f 0a 20 20 20 20 69 66 28 20 63 6f 73 74 3c 70  /.    if( cost<p
10c30 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20  Cost->rCost ){. 
10c40 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73       pCost->rCos
10c50 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20  t = cost;.      
10c60 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52  pCost->nRow = nR
10c70 6f 77 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  ow;.      pCost-
10c80 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20  >plan.wsFlags = 
10c90 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  wsFlags;.    }. 
10ca0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
10cb0 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
10cc0 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 53 65 61  IZATION.  /* Sea
10cd0 72 63 68 20 66 6f 72 20 61 6e 20 4f 52 2d 63 6c  rch for an OR-cl
10ce0 61 75 73 65 20 74 68 61 74 20 63 61 6e 20 62 65  ause that can be
10cf0 20 75 73 65 64 20 74 6f 20 6c 6f 6f 6b 20 75 70   used to look up
10d00 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f   the table..  */
10d10 0a 20 20 6d 61 73 6b 53 72 63 20 3d 20 67 65 74  .  maskSrc = get
10d20 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53  Mask(pWC->pMaskS
10d30 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 66 6f 72  et, iCur);.  for
10d40 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
10d50 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
10d60 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
10d70 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65  .    WhereClause
10d80 20 74 65 6d 70 57 43 3b 0a 20 20 20 20 74 65 6d   tempWC;.    tem
10d90 70 57 43 20 3d 20 2a 70 57 43 3b 0a 20 20 20 20  pWC = *pWC;.    
10da0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
10db0 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20  ator==WO_OR .   
10dc0 20 20 20 20 20 26 26 20 28 28 70 54 65 72 6d 2d       && ((pTerm-
10dd0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61  >prereqAll & ~ma
10de0 73 6b 53 72 63 29 20 26 20 6e 6f 74 52 65 61 64  skSrc) & notRead
10df0 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26  y)==0.        &&
10e00 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   (pTerm->u.pOrIn
10e10 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20  fo->indexable & 
10e20 6d 61 73 6b 53 72 63 29 21 3d 30 20 29 7b 0a 20  maskSrc)!=0 ){. 
10e30 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
10e40 20 2a 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d   *pOrWC = &pTerm
10e50 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
10e60 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
10e70 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20   *pOrTerm;.     
10e80 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e   int j;.      in
10e90 74 20 73 6f 72 74 61 62 6c 65 20 3d 20 30 3b 0a  t sortable = 0;.
10ea0 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f        double rTo
10eb0 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  tal = 0;.      n
10ec0 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  Row = 0;.      f
10ed0 6f 72 28 6a 3d 30 2c 20 70 4f 72 54 65 72 6d 3d  or(j=0, pOrTerm=
10ee0 70 4f 72 57 43 2d 3e 61 3b 20 6a 3c 70 4f 72 57  pOrWC->a; j<pOrW
10ef0 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
10f00 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
10f10 20 20 20 57 68 65 72 65 43 6f 73 74 20 73 54 65     WhereCost sTe
10f20 72 6d 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  rmCost;.        
10f30 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
10f40 20 4d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20   Multi-index OR 
10f50 74 65 73 74 69 6e 67 20 66 6f 72 20 74 65 72 6d  testing for term
10f60 20 25 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c 6e 22   %d of %d....\n"
10f70 2c 20 6a 2c 69 29 29 3b 0a 20 20 20 20 20 20 20  , j,i));.       
10f80 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f   if( pOrTerm->eO
10f90 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20  perator==WO_AND 
10fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65  ){.          Whe
10fb0 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43  reClause *pAndWC
10fc0 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70   = &pOrTerm->u.p
10fd0 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
10fe0 20 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78         bestIndex
10ff0 28 70 50 61 72 73 65 2c 20 70 41 6e 64 57 43 2c  (pParse, pAndWC,
11000 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
11010 20 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b   0, &sTermCost);
11020 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11030 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
11040 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
11050 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
11060 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20  .a = pOrTerm;.  
11070 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e          tempWC.n
11080 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
11090 20 20 20 20 62 65 73 74 49 6e 64 65 78 28 70 50      bestIndex(pP
110a0 61 72 73 65 2c 20 26 74 65 6d 70 57 43 2c 20 70  arse, &tempWC, p
110b0 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 30  Src, notReady, 0
110c0 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20  , &sTermCost);. 
110d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
110e0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
110f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11100 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 54      rTotal += sT
11110 65 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b 0a 20  ermCost.rCost;. 
11120 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73         nRow += s
11130 54 65 72 6d 43 6f 73 74 2e 6e 52 6f 77 3b 0a 20  TermCost.nRow;. 
11140 20 20 20 20 20 20 20 69 66 28 20 72 54 6f 74 61         if( rTota
11150 6c 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20  l>=pCost->rCost 
11160 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
11170 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
11180 72 42 79 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy!=0 ){.      
11190 20 20 69 66 28 20 73 6f 72 74 61 62 6c 65 42 79    if( sortableBy
111a0 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64  Rowid(iCur, pOrd
111b0 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61 73 6b  erBy, pWC->pMask
111c0 53 65 74 2c 20 26 72 65 76 29 20 26 26 20 21 72  Set, &rev) && !r
111d0 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
111e0 73 6f 72 74 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sortable = 1;.  
111f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11200 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d         rTotal +=
11210 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f   nRow*estLog(nRo
11220 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 57 48  w);.          WH
11230 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73  ERETRACE(("... s
11240 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73  orting increases
11250 20 4f 52 20 63 6f 73 74 20 74 6f 20 25 2e 39 67   OR cost to %.9g
11260 5c 6e 22 2c 20 72 54 6f 74 61 6c 29 29 3b 0a 20  \n", rTotal));. 
11270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11280 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
11290 45 28 28 22 2e 2e 2e 20 6d 75 6c 74 69 2d 69 6e  E(("... multi-in
112a0 64 65 78 20 4f 52 20 63 6f 73 74 3d 25 2e 39 67  dex OR cost=%.9g
112b0 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e 22 2c 0a 20   nrow=%.9g\n",. 
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77 29 29 3b   rTotal, nRow));
112e0 0a 20 20 20 20 20 20 69 66 28 20 72 54 6f 74 61  .      if( rTota
112f0 6c 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29  l<pCost->rCost )
11300 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  {.        pCost-
11310 3e 72 43 6f 73 74 20 3d 20 72 54 6f 74 61 6c 3b  >rCost = rTotal;
11320 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
11330 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20  nRow = nRow;.   
11340 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
11350 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  .wsFlags = WHERE
11360 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20  _MULTI_OR;.     
11370 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75     pCost->plan.u
11380 2e 70 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a  .pTerm = pTerm;.
11390 20 20 20 20 20 20 20 20 69 66 28 20 73 6f 72 74          if( sort
113a0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
113b0 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73    pCost->plan.ws
113c0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4f 52  Flags = WHERE_OR
113d0 44 45 52 42 59 7c 57 48 45 52 45 5f 4d 55 4c 54  DERBY|WHERE_MULT
113e0 49 5f 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  I_OR;.        }.
113f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11400 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11410 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
11420 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 2f 2a  IZATION */..  /*
11430 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61 62   If the pSrc tab
11440 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20  le is the right 
11450 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
11460 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79  JOIN then we may
11470 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e   not.  ** use an
11480 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66   index to satisf
11490 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  y IS NULL constr
114a0 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61  aints on that ta
114b0 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20  ble.  This is.  
114c0 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d  ** because colum
114d0 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ns might end up 
114e0 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68  being NULL if th
114f0 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
11500 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20   match -.  ** a 
11510 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69  circumstance whi
11520 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  ch the index can
11530 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73 63  not help us disc
11540 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32  over.  Ticket #2
11550 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  177..  */.  if( 
11560 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20  (pSrc->jointype 
11570 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
11580 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20  .    eqTermMask 
11590 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20  = WO_EQ|WO_IN;. 
115a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 71 54 65   }else{.    eqTe
115b0 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  rmMask = WO_EQ|W
115c0 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a  O_IN|WO_ISNULL;.
115d0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61    }..  /* Look a
115e0 74 20 65 61 63 68 20 69 6e 64 65 78 2e 0a 20 20  t each index..  
115f0 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70  */.  if( pSrc->p
11600 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 70 50 72  Index ){.    pPr
11610 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
11620 65 78 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20  ex;.  }.  for(; 
11630 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 28  pProbe; pProbe=(
11640 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 3f 20 30  pSrc->pIndex ? 0
11650 20 3a 20 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74   : pProbe->pNext
11660 29 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 69  )){.    double i
11670 6e 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20 31 3b  nMultiplier = 1;
11680 0a 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ..    WHERETRACE
11690 28 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25 73 3a  (("... index %s:
116a0 5c 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61  \n", pProbe->zNa
116b0 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  me));..    /* Co
116c0 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
116d0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
116e0 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20   index that are 
116f0 73 61 74 69 73 66 69 65 64 0a 20 20 20 20 2a 2a  satisfied.    **
11700 20 62 79 20 78 3d 45 58 50 52 20 63 6f 6e 73 74   by x=EXPR const
11710 72 61 69 6e 74 73 20 6f 72 20 78 20 49 4e 20 28  raints or x IN (
11720 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73  ...) constraints
11730 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 73 46  ..    */.    wsF
11740 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  lags = 0;.    fo
11750 72 28 69 3d 30 3b 20 69 3c 70 50 72 6f 62 65 2d  r(i=0; i<pProbe-
11760 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
11770 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
11780 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  robe->aiColumn[i
11790 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ];.      pTerm =
117a0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
117b0 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
117c0 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70 50  , eqTermMask, pP
117d0 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28  robe);.      if(
117e0 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
117f0 6b 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73  k;.      wsFlags
11800 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
11810 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 70  _EQ;.      if( p
11820 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
11830 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
11840 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
11850 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
11860 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
11870 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  = WHERE_COLUMN_I
11880 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  N;.        if( E
11890 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
118a0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
118b0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ct) ){.         
118c0 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d   inMultiplier *=
118d0 20 32 35 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   25;.        }el
118e0 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e  se if( pExpr->x.
118f0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
11900 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20     inMultiplier 
11910 2a 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  *= pExpr->x.pLis
11920 74 2d 3e 6e 45 78 70 72 20 2b 20 31 3b 0a 20 20  t->nExpr + 1;.  
11930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11940 20 20 20 20 7d 0a 20 20 20 20 6e 52 6f 77 20 3d      }.    nRow =
11950 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73   pProbe->aiRowEs
11960 74 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74 69 70 6c  t[i] * inMultipl
11970 69 65 72 3b 0a 20 20 20 20 63 6f 73 74 20 3d 20  ier;.    cost = 
11980 6e 52 6f 77 20 2a 20 65 73 74 4c 6f 67 28 69 6e  nRow * estLog(in
11990 4d 75 6c 74 69 70 6c 69 65 72 29 3b 0a 20 20 20  Multiplier);.   
119a0 20 6e 45 71 20 3d 20 69 3b 0a 20 20 20 20 69 66   nEq = i;.    if
119b0 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f  ( pProbe->onErro
119c0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 28 77  r!=OE_None && (w
119d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
119e0 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20  OLUMN_IN)==0.   
119f0 20 20 20 20 20 20 26 26 20 6e 45 71 3d 3d 70 50        && nEq==pP
11a00 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  robe->nColumn ){
11a10 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c  .      wsFlags |
11a20 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a  = WHERE_UNIQUE;.
11a30 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52 45 54      }.    WHERET
11a40 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e 45  RACE(("...... nE
11a50 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25 2e 39 67  q=%d inMult=%.9g
11a60 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c 6e 45   cost=%.9g\n",nE
11a70 71 2c 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c 63  q,inMultiplier,c
11a80 6f 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ost));..    /* L
11a90 6f 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20 63 6f  ook for range co
11aa0 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2f  nstraints.    */
11ab0 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72  .    if( nEq<pPr
11ac0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  obe->nColumn ){.
11ad0 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
11ae0 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  robe->aiColumn[n
11af0 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  Eq];.      pTerm
11b00 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
11b10 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
11b20 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  dy, WO_LT|WO_LE|
11b30 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72  WO_GT|WO_GE, pPr
11b40 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  obe);.      if( 
11b50 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  pTerm ){.       
11b60 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
11b70 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a  E_COLUMN_RANGE;.
11b80 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e 64          if( find
11b90 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
11ba0 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
11bb0 4c 54 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65  LT|WO_LE, pProbe
11bc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  ) ){.          w
11bd0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
11be0 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
11bf0 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a       cost /= 3;.
11c00 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2f            nRow /
11c10 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 3;.        }. 
11c20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54         if( findT
11c30 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
11c40 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47  , notReady, WO_G
11c50 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29  T|WO_GE, pProbe)
11c60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 73   ){.          ws
11c70 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42  Flags |= WHERE_B
11c80 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
11c90 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20      cost /= 3;. 
11ca0 20 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d           nRow /=
11cb0 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   3;.        }.  
11cc0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
11cd0 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20  (("...... range 
11ce0 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20  reduces cost to 
11cf0 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
11d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
11d10 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61      /* Add the a
11d20 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74 20 6f  dditional cost o
11d30 66 20 73 6f 72 74 69 6e 67 20 69 66 20 74 68 61  f sorting if tha
11d40 74 20 69 73 20 61 20 66 61 63 74 6f 72 2e 0a 20  t is a factor.. 
11d50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f     */.    if( pO
11d60 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
11d70 69 66 28 20 28 77 73 46 6c 61 67 73 20 26 20 57  if( (wsFlags & W
11d80 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d  HERE_COLUMN_IN)=
11d90 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
11da0 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28   isSortingIndex(
11db0 70 50 61 72 73 65 2c 70 57 43 2d 3e 70 4d 61 73  pParse,pWC->pMas
11dc0 6b 53 65 74 2c 70 50 72 6f 62 65 2c 69 43 75 72  kSet,pProbe,iCur
11dd0 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c 26 72  ,pOrderBy,nEq,&r
11de0 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ev) ){.        i
11df0 66 28 20 77 73 46 6c 61 67 73 3d 3d 30 20 29 7b  f( wsFlags==0 ){
11e00 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c 61  .          wsFla
11e10 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
11e20 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20  N_RANGE;.       
11e30 20 7d 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61   }.        wsFla
11e40 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45  gs |= WHERE_ORDE
11e50 52 42 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28  RBY;.        if(
11e60 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20   rev ){.        
11e70 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
11e80 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20  RE_REVERSE;.    
11e90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
11ea0 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20  e{.        cost 
11eb0 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63  += cost*estLog(c
11ec0 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 57 48  ost);.        WH
11ed0 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e  ERETRACE((".....
11ee0 2e 20 6f 72 64 65 72 62 79 20 69 6e 63 72 65 61  . orderby increa
11ef0 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67  ses cost to %.9g
11f00 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20  \n", cost));.   
11f10 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
11f20 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
11f30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
11f40 76 65 72 73 65 4f 72 64 65 72 20 29 7b 0a 20 20  verseOrder ){.  
11f50 20 20 20 20 2f 2a 20 46 6f 72 20 61 70 70 6c 69      /* For appli
11f60 63 61 74 69 6f 6e 20 74 65 73 74 69 6e 67 2c 20  cation testing, 
11f70 72 61 6e 64 6f 6d 6c 79 20 72 65 76 65 72 73 65  randomly reverse
11f80 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65   the output orde
11f90 72 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 53  r for.      ** S
11fa0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
11fb0 20 74 68 61 74 20 6f 6d 69 74 20 74 68 65 20 4f   that omit the O
11fc0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
11fd0 20 54 68 69 73 20 77 69 6c 6c 20 68 65 6c 70 0a   This will help.
11fe0 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64        ** to find
11ff0 20 63 61 73 65 73 20 77 68 65 72 65 0a 20 20 20   cases where.   
12000 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 73 46 6c     */.      wsFl
12010 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56  ags |= WHERE_REV
12020 45 52 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ERSE;.    }..   
12030 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
12040 20 69 66 20 77 65 20 63 61 6e 20 67 65 74 20 61   if we can get a
12050 77 61 79 20 77 69 74 68 20 75 73 69 6e 67 20 6a  way with using j
12060 75 73 74 20 74 68 65 20 69 6e 64 65 78 20 77 69  ust the index wi
12070 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65 76 65  thout.    ** eve
12080 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 61  r reading the ta
12090 62 6c 65 2e 20 20 49 66 20 74 68 61 74 20 69 73  ble.  If that is
120a0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
120b0 68 61 6c 76 65 20 74 68 65 0a 20 20 20 20 2a 2a  halve the.    **
120c0 20 63 6f 73 74 20 6f 66 20 74 68 69 73 20 69 6e   cost of this in
120d0 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dex..    */.    
120e0 69 66 28 20 77 73 46 6c 61 67 73 20 26 26 20 70  if( wsFlags && p
120f0 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 3c 20 28  Src->colUsed < (
12100 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42  ((Bitmask)1)<<(B
12110 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 20 20  MS-1)) ){.      
12120 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63  Bitmask m = pSrc
12130 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
12140 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
12150 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62 65 2d  r(j=0; j<pProbe-
12160 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  >nColumn; j++){.
12170 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
12180 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
12190 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
121a0 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20   x<BMS-1 ){.    
121b0 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42        m &= ~(((B
121c0 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20  itmask)1)<<x);. 
121d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
121e0 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20  .      if( m==0 
121f0 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  ){.        wsFla
12200 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
12210 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 63 6f  ONLY;.        co
12220 73 74 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20  st /= 2;.       
12230 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
12240 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20 72 65  .... idx-only re
12250 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e  duces cost to %.
12260 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20  9g\n", cost));. 
12270 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
12280 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
12290 65 78 20 68 61 73 20 61 63 68 69 65 76 65 64 20  ex has achieved 
122a0 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
122b0 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 75 73 65  so far, then use
122c0 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
122d0 69 66 28 20 77 73 46 6c 61 67 73 21 3d 30 20 26  if( wsFlags!=0 &
122e0 26 20 63 6f 73 74 20 3c 20 70 43 6f 73 74 2d 3e  & cost < pCost->
122f0 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 70  rCost ){.      p
12300 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f  Cost->rCost = co
12310 73 74 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  st;.      pCost-
12320 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20  >nRow = nRow;.  
12330 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
12340 77 73 46 6c 61 67 73 20 3d 20 77 73 46 6c 61 67  wsFlags = wsFlag
12350 73 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  s;.      pCost->
12360 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 45 71 3b 0a  plan.nEq = nEq;.
12370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
12380 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
12390 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
123a0 44 20 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  D );.      pCost
123b0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20  ->plan.u.pIdx = 
123c0 70 50 72 6f 62 65 3b 0a 20 20 20 20 7d 0a 20 20  pProbe;.    }.  
123d0 7d 0a 0a 20 20 69 66 28 20 70 43 6f 73 74 2d 3e  }..  if( pCost->
123e0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3d 3d 30 20  plan.wsFlags==0 
123f0 26 26 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  && pSrc->colUsed
12400 3d 3d 30 20 26 26 20 70 53 72 63 2d 3e 75 73 65  ==0 && pSrc->use
12410 73 52 6f 77 69 64 3d 3d 30 20 29 7b 0a 20 20 20  sRowid==0 ){.   
12420 20 49 6e 64 65 78 20 2a 70 53 6d 61 6c 6c 65 73   Index *pSmalles
12430 74 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  t = 0;.    asser
12440 74 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d  t( pSrc->pIndex=
12450 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 70 50  =0 );.    for(pP
12460 72 6f 62 65 3d 70 53 72 63 2d 3e 70 54 61 62 2d  robe=pSrc->pTab-
12470 3e 70 49 6e 64 65 78 3b 20 70 50 72 6f 62 65 3b  >pIndex; pProbe;
12480 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e   pProbe=pProbe->
12490 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
124a0 28 20 21 70 53 6d 61 6c 6c 65 73 74 20 7c 7c 20  ( !pSmallest || 
124b0 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3c  pProbe->nColumn<
124c0 70 53 6d 61 6c 6c 65 73 74 2d 3e 6e 43 6f 6c 75  pSmallest->nColu
124d0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  mn ){.        pS
124e0 6d 61 6c 6c 65 73 74 20 3d 20 70 50 72 6f 62 65  mallest = pProbe
124f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12500 20 20 20 20 69 66 28 20 70 53 6d 61 6c 6c 65 73      if( pSmalles
12510 74 20 26 26 20 70 53 6d 61 6c 6c 65 73 74 2d 3e  t && pSmallest->
12520 6e 43 6f 6c 75 6d 6e 3c 70 53 72 63 2d 3e 70 54  nColumn<pSrc->pT
12530 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
12540 20 20 61 73 73 65 72 74 28 20 70 43 6f 73 74 2d    assert( pCost-
12550 3e 70 6c 61 6e 2e 6e 45 71 3d 3d 30 20 29 3b 0a  >plan.nEq==0 );.
12560 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
12570 6e 2e 75 2e 70 49 64 78 20 3d 20 70 53 6d 61 6c  n.u.pIdx = pSmal
12580 6c 65 73 74 3b 0a 20 20 20 20 20 20 70 43 6f 73  lest;.      pCos
12590 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
125a0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
125b0 41 4e 47 45 7c 57 48 45 52 45 5f 49 44 58 5f 4f  ANGE|WHERE_IDX_O
125c0 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  NLY;.    }.  }..
125d0 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20    /* Report the 
125e0 62 65 73 74 20 72 65 73 75 6c 74 0a 20 20 2a 2f  best result.  */
125f0 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77  .  pCost->plan.w
12600 73 46 6c 61 67 73 20 7c 3d 20 65 71 54 65 72 6d  sFlags |= eqTerm
12610 4d 61 73 6b 3b 0a 20 20 57 48 45 52 45 54 52 41  Mask;.  WHERETRA
12620 43 45 28 28 22 62 65 73 74 20 69 6e 64 65 78 20  CE(("best index 
12630 69 73 20 25 73 2c 20 63 6f 73 74 3d 25 2e 39 67  is %s, cost=%.9g
12640 2c 20 6e 72 6f 77 3d 25 2e 39 67 2c 20 77 73 46  , nrow=%.9g, wsF
12650 6c 61 67 73 3d 25 78 2c 20 6e 45 71 3d 25 64 5c  lags=%x, nEq=%d\
12660 6e 22 2c 0a 20 20 20 20 20 20 20 20 28 70 43 6f  n",.        (pCo
12670 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
12680 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
12690 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
126a0 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
126b0 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  u.pIdx->zName : 
126c0 22 28 6e 6f 6e 65 29 22 2c 20 70 43 6f 73 74 2d  "(none)", pCost-
126d0 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 70  >nRow,.        p
126e0 43 6f 73 74 2d 3e 72 43 6f 73 74 2c 20 70 43 6f  Cost->rCost, pCo
126f0 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
12700 2c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45  , pCost->plan.nE
12710 71 29 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44  q));.}.../*.** D
12720 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e  isable a term in
12730 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
12740 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  e.  Except, do n
12750 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ot disable the t
12760 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e  erm.** if it con
12770 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54  trols a LEFT OUT
12780 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64  ER JOIN and it d
12790 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
127a0 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72   in the ON.** or
127b0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
127c0 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   that join..**.*
127d0 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74  * Consider the t
127e0 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e  erm t2.z='ok' in
127f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
12800 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ueries:.**.**   
12810 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (1)  SELECT * FR
12820 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
12830 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
12840 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a  WHERE t2.z='ok'.
12850 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54  **   (2)  SELECT
12860 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
12870 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
12880 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
12890 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c  k'.**   (3)  SEL
128a0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
128b0 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e  2 WHERE t1.a=t2.
128c0 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
128d0 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27  **.** The t2.z='
128e0 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20  ok' is disabled 
128f0 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65  in the in (2) be
12900 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61  cause it origina
12910 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  tes.** in the ON
12920 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65   clause.  The te
12930 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  rm is disabled i
12940 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74  n (3) because it
12950 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20   is not part.** 
12960 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
12970 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74  JOIN.  In (1), t
12980 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64  he term is not d
12990 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44  isabled..**.** D
129a0 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20  isabling a term 
129b0 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d  causes that term
129c0 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65   to not be teste
129d0 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  d in the inner l
129e0 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  oop.** of the jo
129f0 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69  in.  Disabling i
12a00 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
12a10 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61  n.  When terms a
12a20 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
12a30 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64  by indices, we d
12a40 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70  isable them to p
12a50 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74  revent redundant
12a60 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e   tests in the in
12a70 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65  ner.** loop.  We
12a80 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63   would get the c
12a90 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69  orrect results i
12aa0 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65  f nothing were e
12ab0 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a  ver disabled,.**
12ac0 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74   but joins might
12ad0 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
12ae0 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b  ower.  The trick
12af0 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61   is to disable a
12b00 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20  s much.** as we 
12b10 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61  can without disa
12b20 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20  bling too much. 
12b30 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20   If we disabled 
12b40 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74  in (1), we'd get
12b50 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e  .** the wrong an
12b60 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65  swer.  See ticke
12b70 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69  t #813..*/.stati
12b80 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65  c void disableTe
12b90 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  rm(WhereLevel *p
12ba0 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d  Level, WhereTerm
12bb0 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20   *pTerm){.  if( 
12bc0 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 41  pTerm.      && A
12bd0 4c 57 41 59 53 28 28 70 54 65 72 6d 2d 3e 77 74  LWAYS((pTerm->wt
12be0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
12bf0 45 44 29 3d 3d 30 29 0a 20 20 20 20 20 20 26 26  ED)==0).      &&
12c00 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a   (pLevel->iLeftJ
12c10 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61  oin==0 || ExprHa
12c20 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
12c30 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
12c40 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70  oin)).  ){.    p
12c50 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
12c60 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
12c70 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72   if( pTerm->iPar
12c80 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ent>=0 ){.      
12c90 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
12ca0 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d  r = &pTerm->pWC-
12cb0 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  >a[pTerm->iParen
12cc0 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d  t];.      if( (-
12cd0 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29  -pOther->nChild)
12ce0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==0 ){.        d
12cf0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
12d00 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20  l, pOther);.    
12d10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
12d20 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 74 68 65  ./*.** Apply the
12d30 20 61 66 66 69 6e 69 74 69 65 73 20 61 73 73 6f   affinities asso
12d40 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
12d50 66 69 72 73 74 20 6e 20 63 6f 6c 75 6d 6e 73 20  first n columns 
12d60 6f 66 20 69 6e 64 65 78 0a 2a 2a 20 70 49 64 78  of index.** pIdx
12d70 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 69   to the values i
12d80 6e 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72  n the n register
12d90 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61  s starting at ba
12da0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
12db0 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69  id codeApplyAffi
12dc0 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
12dd0 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e  se, int base, in
12de0 74 20 6e 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  t n, Index *pIdx
12df0 29 7b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  ){.  if( n>0 ){.
12e00 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
12e10 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
12e20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
12e30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12e40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66  AddOp2(v, OP_Aff
12e50 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b  inity, base, n);
12e60 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65  .    sqlite3Inde
12e70 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20  xAffinityStr(v, 
12e80 70 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  pIdx);.    sqlit
12e90 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
12ea0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
12eb0 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a  , base, n);.  }.
12ec0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
12ed0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
12ee0 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
12ef0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
12f00 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
12f10 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
12f20 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
12f30 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
12f40 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
12f50 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
12f60 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
12f70 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
12f80 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
12f90 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
12fa0 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a  ster iReg..**.**
12fb0 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
12fc0 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
12fd0 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
12fe0 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
12ff0 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
13000 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
13010 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
13020 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
13030 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
13040 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
13050 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
13060 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
13070 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
13080 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
13090 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c  ic int codeEqual
130a0 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
130b0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
130c0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
130d0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
130e0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
130f0 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
13100 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
13110 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
13120 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
13130 65 6c 2c 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65  el, /* When leve
13140 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
13150 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
13160 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
13170 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20 20  iTarget         
13180 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65  /* Attempt to le
13190 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ave results in t
131a0 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
131b0 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20  ){.  Expr *pX = 
131c0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
131d0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
131e0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
131f0 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
13200 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
13210 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  r holding result
13220 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
13230 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69  iTarget>0 );.  i
13240 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  f( pX->op==TK_EQ
13250 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73   ){.    iReg = s
13260 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
13270 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d  rget(pParse, pX-
13280 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74  >pRight, iTarget
13290 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
132a0 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  X->op==TK_ISNULL
132b0 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   ){.    iReg = i
132c0 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69  Target;.    sqli
132d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
132e0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65   OP_Null, 0, iRe
132f0 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
13300 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13310 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
13320 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74  t eType;.    int
13330 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63   iTab;.    struc
13340 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a  t InLoop *pIn;..
13350 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
13360 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op==TK_IN );.   
13370 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
13380 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c  .    eType = sql
13390 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
133a0 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a  pParse, pX, 0);.
133b0 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
133c0 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
133d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
133e0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
133f0 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d   0);.    VdbeCom
13400 6d 65 6e 74 28 28 76 2c 20 22 25 2e 2a 73 22 2c  ment((v, "%.*s",
13410 20 70 58 2d 3e 73 70 61 6e 2e 6e 2c 20 70 58 2d   pX->span.n, pX-
13420 3e 73 70 61 6e 2e 7a 29 29 3b 0a 20 20 20 20 61  >span.z));.    a
13430 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
13440 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
13450 45 52 45 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a 20  ERE_IN_ABLE );. 
13460 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75     if( pLevel->u
13470 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20  .in.nIn==0 ){.  
13480 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
13490 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
134a0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
134b0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
134c0 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20  >u.in.nIn++;.   
134d0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
134e0 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73  nLoop =.       s
134f0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
13500 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  rFree(pParse->db
13510 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
13520 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  InLoop,.        
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13540 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65        sizeof(pLe
13550 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
13560 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e  p[0])*pLevel->u.
13570 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e  in.nIn);.    pIn
13580 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e   = pLevel->u.in.
13590 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  aInLoop;.    if(
135a0 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49   pIn ){.      pI
135b0 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  n += pLevel->u.i
135c0 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20  n.nIn - 1;.     
135d0 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61   pIn->iCur = iTa
135e0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  b;.      if( eTy
135f0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
13600 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  ID ){.        pI
13610 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
13620 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13630 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
13640 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20  ab, iReg);.     
13650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13660 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
13670 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13680 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
13690 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b   iTab, 0, iReg);
136a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
136b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
136c0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69  (v, OP_IsNull, i
136d0 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Reg);.    }else{
136e0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  .      pLevel->u
136f0 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  .in.nIn = 0;.   
13700 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
13710 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
13720 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65  el, pTerm);.  re
13730 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
13740 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
13750 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
13760 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20  uate all == and 
13770 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  IN constraints f
13780 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  or an.** index. 
13790 20 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   The values for 
137a0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  all constraints 
137b0 61 72 65 20 6c 65 66 74 20 6f 6e 20 74 68 65 20  are left on the 
137c0 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  stack..**.** For
137d0 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64   example, consid
137e0 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c  er table t1(a,b,
137f0 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e  c,d,e,f) with in
13800 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a  dex i1(a,b,c)..*
13810 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48  * Suppose the WH
13820 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68  ERE clause is th
13830 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20  is:  a==5 AND b 
13840 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63  IN (1,2,3) AND c
13850 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54  >5 AND c<10.** T
13860 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20  he index has as 
13870 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71  many as three eq
13880 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
13890 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a  ts, but in this.
138a0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  ** example, the 
138b0 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20  third "c" value 
138c0 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  is an inequality
138d0 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a  .  So only two .
138e0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ** constraints a
138f0 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20  re coded.  This 
13900 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e  routine will gen
13910 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
13920 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61  aluate.** a==5 a
13930 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e  nd b IN (1,2,3).
13940 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61    The current va
13950 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62  lues for a and b
13960 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a   will be stored.
13970 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76  ** in consecutiv
13980 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  e registers and 
13990 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
139a0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
139b0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
139c0 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
139d0 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20  e above nEq==2. 
139e0 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75   But this subrou
139f0 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
13a00 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e  ny value.** of n
13a10 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20  Eq including 0. 
13a20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73   If nEq==0, this
13a30 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72   routine is near
13a40 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54  ly a no-op..** T
13a50 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74  he only thing it
13a60 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74   does is allocat
13a70 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d  e the pLevel->iM
13a80 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a  em memory cell..
13a90 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13aa0 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ne always alloca
13ab0 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  tes at least one
13ac0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
13ad0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
13ae0 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65  index of that me
13af0 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63  mory cell. The c
13b00 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c  ode that.** call
13b10 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
13b20 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d  ill use that mem
13b30 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72  ory cell to stor
13b40 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f  e the terminatio
13b50 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f  n.** key value o
13b60 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
13b70 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f  one or more IN o
13b80 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c  perators appear,
13b90 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
13ba0 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
13bb0 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45  an additional nE
13bc0 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  q memory cells f
13bd0 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75  or internal.** u
13be0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
13bf0 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  t codeAllEqualit
13c00 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20  yTerms(.  Parse 
13c10 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
13c20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
13c30 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  xt */.  WhereLev
13c40 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a  el *pLevel,   /*
13c50 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f   Which nested lo
13c60 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77  op of the FROM w
13c70 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a  e are coding */.
13c80 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
13c90 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  WC,     /* The W
13ca0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
13cb0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
13cc0 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  y,     /* Which 
13cd0 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61  parts of FROM ha
13ce0 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
13cf0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  coded */.  int n
13d00 45 78 74 72 61 52 65 67 20 20 20 20 20 20 20 20  ExtraReg        
13d10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
13d20 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f  tra registers to
13d30 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 29 7b 0a   allocate */.){.
13d40 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
13d50 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20  el->plan.nEq;   
13d60 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
13d70 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
13d80 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
13d90 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
13da0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
13db0 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72   /* The vm under
13dc0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
13dd0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13df0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65   /* The index be
13e00 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69  ing used for thi
13e10 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  s loop */.  int 
13e20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  iCur = pLevel->i
13e30 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68 65  TabCur;   /* The
13e40 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
13e50 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  able */.  WhereT
13e60 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
13e70 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
13e80 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  gle constraint t
13e90 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  erm */.  int j; 
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13eb0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
13ec0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
13ed0 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
13ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73            /* Bas
13ef0 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  e register */.  
13f00 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20  int nReg;       
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13f20 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   Number of regis
13f30 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
13f40 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   */..  /* This m
13f50 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61  odule is only ca
13f60 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c  lled on query pl
13f70 61 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  ans that use an 
13f80 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 73 73 65  index. */.  asse
13f90 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  rt( pLevel->plan
13fa0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
13fb0 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 70 49  _INDEXED );.  pI
13fc0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
13fd0 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 2f 2a 20  n.u.pIdx;..  /* 
13fe0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
13ff0 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  any memory cells
14000 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68   we will need th
14010 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d  en allocate them
14020 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65  ..  */.  regBase
14030 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
14040 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c  + 1;.  nReg = pL
14050 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b  evel->plan.nEq +
14060 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50   nExtraReg;.  pP
14070 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
14080 65 67 3b 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61  eg;..  /* Evalua
14090 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  te the equality 
140a0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f  constraints.  */
140b0 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
140c0 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b  >nColumn>=nEq );
140d0 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45  .  for(j=0; j<nE
140e0 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  q; j++){.    int
140f0 20 72 31 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d   r1;.    int k =
14100 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
14110 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  j];.    pTerm = 
14120 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
14130 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
14140 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
14150 46 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a 20 20  Flags, pIdx);.  
14160 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 65 72    if( NEVER(pTer
14170 6d 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20  m==0) ) break;. 
14180 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
14190 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
141a0 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20  M_CODED)==0 );. 
141b0 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61     r1 = codeEqua
141c0 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
141d0 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
141e0 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
141f0 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b  if( r1!=regBase+
14200 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  j ){.      if( n
14210 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Reg==1 ){.      
14220 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
14230 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
14240 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20  regBase);.      
14250 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a    regBase = r1;.
14260 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14270 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14280 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
14290 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b  py, r1, regBase+
142a0 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
142b0 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
142c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
142d0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
142e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
142f0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
14300 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66   WO_IN );.    if
14310 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
14320 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
14330 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20  |WO_IN))==0 ){. 
14340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14350 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
14360 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20  ull, regBase+j, 
14370 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
14380 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
14390 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a  turn regBase;.}.
143a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
143b0 55 45 20 69 66 20 74 68 65 20 57 68 65 72 65 43  UE if the WhereC
143c0 6c 61 75 73 65 20 70 57 43 20 63 6f 6e 74 61 69  lause pWC contai
143d0 6e 73 20 6e 6f 20 74 65 72 6d 73 20 74 68 61 74  ns no terms that
143e0 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 76 69 72 74  .** are not virt
143f0 75 61 6c 20 61 6e 64 20 77 68 69 63 68 20 68 61  ual and which ha
14400 76 65 20 6e 6f 74 20 62 65 65 6e 20 63 6f 64 65  ve not been code
14410 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 70 75 74 20  d..**.** To put 
14420 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
14430 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
14440 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 57 48 45  o additional WHE
14450 52 45 20 63 6c 61 75 73 65 73 0a 2a 2a 20 74 65  RE clauses.** te
14460 73 74 73 20 61 72 65 20 72 65 71 75 69 72 65 64  sts are required
14470 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 73 74   in order to est
14480 61 62 6c 69 73 68 20 74 68 61 74 20 74 68 65 20  ablish that the 
14490 63 75 72 72 65 6e 74 20 72 6f 77 0a 2a 2a 20 73  current row.** s
144a0 68 6f 75 6c 64 20 67 6f 20 74 6f 20 6f 75 74 70  hould go to outp
144b0 75 74 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41  ut and return FA
144c0 4c 53 45 20 69 66 20 74 68 65 72 65 20 61 72 65  LSE if there are
144d0 20 73 6f 6d 65 20 74 65 72 6d 73 20 6f 66 0a 2a   some terms of.*
144e0 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
144f0 73 65 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  se that need to 
14500 62 65 20 76 61 6c 69 64 61 74 65 64 20 62 65 66  be validated bef
14510 6f 72 65 20 6f 75 74 70 75 74 69 6e 67 20 74 68  ore outputing th
14520 65 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  e row..*/.static
14530 20 69 6e 74 20 77 68 65 72 65 52 6f 77 52 65 61   int whereRowRea
14540 64 79 46 6f 72 4f 75 74 70 75 74 28 57 68 65 72  dyForOutput(Wher
14550 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20  eClause *pWC){. 
14560 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
14570 6d 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 0a 20 20  m;.  int j;. .  
14580 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
14590 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
145a0 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
145b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65  +){.    if( (pTe
145c0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
145d0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
145e0 5f 43 4f 44 45 44 29 29 3d 3d 30 20 29 20 72 65  _CODED))==0 ) re
145f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
14600 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
14610 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
14620 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
14630 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f  the iLevel-th lo
14640 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  op in the WHERE 
14650 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d  clause.** implem
14660 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62  entation describ
14670 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f  ed by pWInfo..*/
14680 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
14690 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  codeOneLoopStart
146a0 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
146b0 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70  WInfo,   /* Comp
146c0 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  lete information
146d0 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45   about the WHERE
146e0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
146f0 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
14700 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c    /* Which level
14710 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   of pWInfo->a[] 
14720 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20  should be coded 
14730 2a 2f 0a 20 20 75 38 20 77 63 74 72 6c 46 6c 61  */.  u8 wctrlFla
14740 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs,       /* One
14750 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
14760 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
14770 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
14780 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
14790 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  dy     /* Which 
147a0 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65  tables are curre
147b0 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a  ntly available *
147c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b  /.){.  int j, k;
147d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
147e0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
147f0 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
14800 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
14810 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
14820 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
14830 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20   addrNxt;       
14840 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75    /* Where to ju
14850 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  mp to continue w
14860 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
14870 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d  case */.  int om
14880 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f  itTable;       /
14890 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65  * True if we use
148a0 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   the index only 
148b0 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20  */.  int bRev;  
148c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
148d0 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
148e0 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  scan in reverse 
148f0 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  order */.  Where
14900 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
14910 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76  /* The where lev
14920 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  el to be coded *
14930 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
14940 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f  *pWC;    /* Deco
14950 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65  mposition of the
14960 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c   entire WHERE cl
14970 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  ause */.  WhereT
14980 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
14990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
149a0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
149b0 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
149c0 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
149d0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
149e0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64   context */.  Vd
149f0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a10 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
14a20 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
14a30 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75  ctions */.  stru
14a40 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
14a50 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46  *pTabItem;  /* F
14a60 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
14a70 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
14a80 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20   int addrBrk;   
14a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14aa0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
14ab0 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
14ac0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
14ad0 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20  addrCont;       
14ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
14af0 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
14b00 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63  inue with next c
14b10 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ycle */.  int re
14b20 67 52 6f 77 53 65 74 3b 20 20 20 20 20 20 20 2f  gRowSet;       /
14b30 2a 20 57 72 69 74 65 20 72 6f 77 69 64 73 20 74  * Write rowids t
14b40 6f 20 74 68 69 73 20 52 6f 77 53 65 74 20 69 66  o this RowSet if
14b50 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 2a 2f   non-negative */
14b60 0a 20 20 69 6e 74 20 63 6f 64 65 52 6f 77 53 65  .  int codeRowSe
14b70 74 45 61 72 6c 79 3b 20 2f 2a 20 54 72 75 65 20  tEarly; /* True 
14b80 69 66 20 69 6e 64 65 78 20 66 75 6c 6c 79 20 63  if index fully c
14b90 6f 6e 73 74 72 61 69 6e 73 20 74 68 65 20 73 65  onstrains the se
14ba0 61 72 63 68 20 2a 2f 0a 20 20 0a 0a 20 20 70 50  arch */.  ..  pP
14bb0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
14bc0 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61  Parse;.  v = pPa
14bd0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57  rse->pVdbe;.  pW
14be0 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b  C = pWInfo->pWC;
14bf0 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49  .  pLevel = &pWI
14c00 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a  nfo->a[iLevel];.
14c10 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57    pTabItem = &pW
14c20 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
14c30 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
14c40 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49  ;.  iCur = pTabI
14c50 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
14c60 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  bRev = (pLevel->
14c70 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
14c80 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30  HERE_REVERSE)!=0
14c90 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
14ca0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
14cb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
14cc0 58 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 20 20 72 65  X_ONLY)!=0;.  re
14cd0 67 52 6f 77 53 65 74 20 3d 20 70 57 49 6e 66 6f  gRowSet = pWInfo
14ce0 2d 3e 72 65 67 52 6f 77 53 65 74 3b 0a 20 20 63  ->regRowSet;.  c
14cf0 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20 3d  odeRowSetEarly =
14d00 20 30 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   0;..  /* Create
14d10 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
14d20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
14d30 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
14d40 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ons.  ** for the
14d50 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20   current loop.  
14d60 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20  Jump to addrBrk 
14d70 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
14d80 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d  a loop..  ** Jum
14d90 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
14da0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
14db0 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
14dc0 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
14dd0 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  op..  **.  ** Wh
14de0 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
14df0 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
14e00 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72  lso have a "addr
14e10 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a  Nxt" label that.
14e20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f    ** means to co
14e30 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
14e40 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f  next IN value co
14e50 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e  mbination.  When
14e60 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20  .  ** there are 
14e70 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  no IN operators 
14e80 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  in the constrain
14e90 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74  ts, the "addrNxt
14ea0 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20  " label.  ** is 
14eb0 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64  the same as "add
14ec0 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64  rBrk"..  */.  ad
14ed0 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
14ee0 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
14ef0 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
14f00 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14f10 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20  (v);.  addrCont 
14f20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
14f30 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
14f40 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
14f50 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
14f60 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
14f70 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
14f80 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  OIN, allocate an
14f90 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  d.  ** initializ
14fa0 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
14fb0 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
14fc0 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
14fd0 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20  es any.  ** row 
14fe0 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  of the left tabl
14ff0 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  e of the join.. 
15000 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
15010 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
15020 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79  abItem[0].jointy
15030 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
15040 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
15050 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50  iLeftJoin = ++pP
15060 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
15070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15080 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
15090 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   0, pLevel->iLef
150a0 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
150b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69  Comment((v, "ini
150c0 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d  t LEFT JOIN no-m
150d0 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20  atch flag"));.  
150e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
150f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
15100 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 65 76  BLE.  if(  (pLev
15110 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
15120 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
15130 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
15140 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65   /* Case 0:  The
15150 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74   table is a virt
15160 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20  ual-table.  Use 
15170 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20  the VFilter and 
15180 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20  VNext.    **    
15190 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20        to access 
151a0 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  the data..    */
151b0 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20  .    int iReg;  
151c0 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72   /* P3 Value for
151d0 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20   OP_VFilter */. 
151e0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
151f0 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20  _info *pVtabIdx 
15200 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
15210 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20 69  .pVtabIdx;.    i
15220 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  nt nConstraint =
15230 20 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f 6e 73   pVtabIdx->nCons
15240 74 72 61 69 6e 74 3b 0a 20 20 20 20 73 74 72 75  traint;.    stru
15250 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
15260 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
15270 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20 20  e *aUsage =.    
15280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152a0 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61              pVta
152b0 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  bIdx->aConstrain
152c0 74 55 73 61 67 65 3b 0a 20 20 20 20 63 6f 6e 73  tUsage;.    cons
152d0 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  t struct sqlite3
152e0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
152f0 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  t *aConstraint =
15300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15330 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73   pVtabIdx->aCons
15340 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 69 52 65  traint;..    iRe
15350 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
15360 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
15370 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a  nConstraint+2);.
15380 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
15390 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  bleColCache++;. 
153a0 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e     for(j=1; j<=n
153b0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29  Constraint; j++)
153c0 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  {.      for(k=0;
153d0 20 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   k<nConstraint; 
153e0 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  k++){.        if
153f0 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76  ( aUsage[k].argv
15400 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20  Index==j ){.    
15410 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20        int iTerm 
15420 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d  = aConstraint[k]
15430 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  .iTermOffset;.  
15440 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15450 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
15460 6f 6c 43 61 63 68 65 20 29 3b 0a 20 20 20 20 20  olCache );.     
15470 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15480 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 57 43  Code(pParse, pWC
15490 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72  ->a[iTerm].pExpr
154a0 2d 3e 70 52 69 67 68 74 2c 20 69 52 65 67 2b 6a  ->pRight, iReg+j
154b0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  +1);.          b
154c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
154d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
154e0 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( k==nConstraint
154f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
15500 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
15510 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
15520 63 68 65 20 29 3b 0a 20 20 20 20 70 50 61 72 73  che );.    pPars
15530 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
15540 68 65 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  he--;.    sqlite
15550 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15560 50 5f 49 6e 74 65 67 65 72 2c 20 70 56 74 61 62  P_Integer, pVtab
15570 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65  Idx->idxNum, iRe
15580 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
15590 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
155a0 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52  Integer, j-1, iR
155b0 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eg+1);.    sqlit
155c0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
155d0 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
155e0 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 65 67 2c  , addrBrk, iReg,
155f0 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74   pVtabIdx->idxSt
15600 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
15610 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64           pVtabId
15620 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  x->needToFreeIdx
15630 53 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46  Str ? P4_MPRINTF
15640 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20   : P4_STATIC);. 
15650 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65     pVtabIdx->nee
15660 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
15670 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
15680 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
15690 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
156a0 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b  Usage[j].omit ){
156b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65  .        int iTe
156c0 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74  rm = aConstraint
156d0 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b  [j].iTermOffset;
156e0 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
156f0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70 57  Term(pLevel, &pW
15700 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20 20  C->a[iTerm]);.  
15710 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15720 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
15730 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  VNext;.    pLeve
15740 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
15750 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
15760 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15770 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 63 6f  tAddr(v);.    co
15780 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20 3d 20  deRowSetEarly = 
15790 72 65 67 52 6f 77 53 65 74 3e 3d 30 20 3f 20 77  regRowSet>=0 ? w
157a0 68 65 72 65 52 6f 77 52 65 61 64 79 46 6f 72 4f  hereRowReadyForO
157b0 75 74 70 75 74 28 70 57 43 29 20 3a 20 30 3b 0a  utput(pWC) : 0;.
157c0 20 20 20 20 69 66 28 20 63 6f 64 65 52 6f 77 53      if( codeRowS
157d0 65 74 45 61 72 6c 79 20 29 7b 0a 20 20 20 20 20  etEarly ){.     
157e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
157f0 70 32 28 76 2c 20 4f 50 5f 56 52 6f 77 69 64 2c  p2(v, OP_VRowid,
15800 20 69 43 75 72 2c 20 69 52 65 67 29 3b 0a 20 20   iCur, iReg);.  
15810 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15820 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53  ddOp2(v, OP_RowS
15830 65 74 41 64 64 2c 20 72 65 67 52 6f 77 53 65 74  etAdd, regRowSet
15840 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20  , iReg);.    }. 
15850 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
15860 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
15870 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72  e, iReg, nConstr
15880 61 69 6e 74 2b 32 29 3b 0a 20 20 7d 65 6c 73 65  aint+2);.  }else
15890 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
158a0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
158b0 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c  BLE */..  if( pL
158c0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
158d0 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
158e0 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _EQ ){.    /* Ca
158f0 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69  se 1:  We can di
15900 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65  rectly reference
15910 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73   a single row us
15920 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20  ing an.    **   
15930 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
15940 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
15950 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
15960 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20  ld.  Or.    **  
15970 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
15980 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
15990 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
159a0 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
159b0 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  **          cons
159c0 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  truct..    */.  
159d0 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e    int r1;.    in
159e0 74 20 72 74 6d 70 20 3d 20 73 71 6c 69 74 65 33  t rtmp = sqlite3
159f0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
15a00 65 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  e);.    pTerm = 
15a10 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
15a20 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
15a30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
15a40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15a50 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61  Term!=0 );.    a
15a60 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
15a70 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  xpr!=0 );.    as
15a80 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66  sert( pTerm->lef
15a90 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
15aa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69  .    assert( omi
15ab0 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
15ac0 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69   r1 = codeEquali
15ad0 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
15ae0 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 74  Term, pLevel, rt
15af0 6d 70 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  mp);.    addrNxt
15b00 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
15b10 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  xt;.    sqlite3V
15b20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15b30 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 61  MustBeInt, r1, a
15b40 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c  ddrNxt);.    sql
15b50 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15b60 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
15b70 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  iCur, addrNxt, r
15b80 31 29 3b 0a 20 20 20 20 63 6f 64 65 52 6f 77 53  1);.    codeRowS
15b90 65 74 45 61 72 6c 79 20 3d 20 28 70 57 43 2d 3e  etEarly = (pWC->
15ba0 6e 54 65 72 6d 3d 3d 31 20 26 26 20 72 65 67 52  nTerm==1 && regR
15bb0 6f 77 53 65 74 3e 3d 30 29 20 3f 31 3a 30 3b 0a  owSet>=0) ?1:0;.
15bc0 20 20 20 20 69 66 28 20 63 6f 64 65 52 6f 77 53      if( codeRowS
15bd0 65 74 45 61 72 6c 79 20 29 7b 0a 20 20 20 20 20  etEarly ){.     
15be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15bf0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 41  p2(v, OP_RowSetA
15c00 64 64 2c 20 72 65 67 52 6f 77 53 65 74 2c 20 72  dd, regRowSet, r
15c10 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
15c20 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
15c30 52 65 67 28 70 50 61 72 73 65 2c 20 72 74 6d 70  Reg(pParse, rtmp
15c40 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
15c50 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
15c60 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
15c70 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  OP_Noop;.  }else
15c80 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
15c90 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
15ca0 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b  E_ROWID_RANGE ){
15cb0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20  .    /* Case 2: 
15cc0 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
15cd0 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
15ce0 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
15cf0 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a  WID field..    *
15d00 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70  /.    int testOp
15d10 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
15d20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69  int start;.    i
15d30 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d  nt memEndValue =
15d40 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72   0;.    WhereTer
15d50 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
15d60 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ;..    assert( o
15d70 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
15d80 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64     pStart = find
15d90 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
15da0 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
15db0 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20  _GT|WO_GE, 0);. 
15dc0 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65     pEnd = findTe
15dd0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
15de0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
15df0 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20  T|WO_LE, 0);.   
15e00 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
15e10 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72     pTerm = pStar
15e20 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20  t;.      pStart 
15e30 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45  = pEnd;.      pE
15e40 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  nd = pTerm;.    
15e50 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  }.    if( pStart
15e60 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
15e70 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
15e80 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
15e90 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  n that defines t
15ea0 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a  he start bound *
15eb0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20  /.      int r1, 
15ec0 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a  rTemp;        /*
15ed0 20 52 65 67 69 73 74 65 72 73 20 66 6f 72 20 68   Registers for h
15ee0 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72 74  olding the start
15ef0 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20   boundary */..  
15f00 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
15f10 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61  wing constant ma
15f20 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69  ps TK_xx codes i
15f30 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  nto correspondin
15f40 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b  g .      ** seek
15f50 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65   opcodes.  It de
15f60 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69  pends on a parti
15f70 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f  cular ordering o
15f80 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f  f TK_xx.      */
15f90 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
15fa0 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20  aMoveOp[] = {.  
15fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
15fc0 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c  T */  OP_SeekGt,
15fd0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
15fe0 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LE */  OP_Seek
15ff0 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Le,.           /
16000 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53  * TK_LT */  OP_S
16010 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20  eekLt,.         
16020 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f    /* TK_GE */  O
16030 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d  P_SeekGe.      }
16040 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16050 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29  TK_LE==TK_GT+1 )
16060 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;      /* Make s
16070 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67  ure the ordering
16080 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .. */.      asse
16090 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
160a0 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e  +2 );      /*  .
160b0 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20  .. of the TK_xx 
160c0 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20  values... */.   
160d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
160e0 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20  ==TK_GT+3 );    
160f0 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72    /*  ... is cor
16100 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20  recct. */..     
16110 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45   pX = pStart->pE
16120 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
16130 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
16140 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
16150 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
16160 75 72 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  ur );.      r1 =
16170 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16180 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d  Temp(pParse, pX-
16190 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29  >pRight, &rTemp)
161a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
161b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f  dbeAddOp3(v, aMo
161c0 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47  veOp[pX->op-TK_G
161d0 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  T], iCur, addrBr
161e0 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  k, r1);.      Vd
161f0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
16200 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  k"));.      sqli
16210 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
16220 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
16230 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  e, r1, 1);.     
16240 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16250 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16260 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73  Temp);.      dis
16270 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
16280 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65   pStart);.    }e
16290 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
162a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
162b0 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
162c0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
162d0 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
162e0 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29  }.    if( pEnd )
162f0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
16300 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e  ;.      pX = pEn
16310 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  d->pExpr;.      
16320 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
16330 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16340 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  End->leftCursor=
16350 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 6d  =iCur );.      m
16360 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70  emEndValue = ++p
16370 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
16380 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
16390 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
163a0 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c  Right, memEndVal
163b0 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ue);.      if( p
163c0 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  X->op==TK_LT || 
163d0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b  pX->op==TK_GT ){
163e0 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
163f0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a  = bRev ? OP_Le :
16400 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65   OP_Ge;.      }e
16410 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
16420 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
16430 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20  Lt : OP_Gt;.    
16440 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c    }.      disabl
16450 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45  eTerm(pLevel, pE
16460 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nd);.    }.    s
16470 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
16480 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
16490 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
164a0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
164b0 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
164c0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
164d0 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
164e0 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
164f0 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 28 70 53  pLevel->p5 = (pS
16500 74 61 72 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d  tart==0 && pEnd=
16510 3d 30 29 20 3f 31 3a 30 3b 0a 20 20 20 20 63 6f  =0) ?1:0;.    co
16520 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20 3d 20  deRowSetEarly = 
16530 72 65 67 52 6f 77 53 65 74 3e 3d 30 20 3f 20 77  regRowSet>=0 ? w
16540 68 65 72 65 52 6f 77 52 65 61 64 79 46 6f 72 4f  hereRowReadyForO
16550 75 74 70 75 74 28 70 57 43 29 20 3a 20 30 3b 0a  utput(pWC) : 0;.
16560 20 20 20 20 69 66 28 20 63 6f 64 65 52 6f 77 53      if( codeRowS
16570 65 74 45 61 72 6c 79 20 7c 7c 20 74 65 73 74 4f  etEarly || testO
16580 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
16590 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
165a0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
165b0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
165c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
165d0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
165e0 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69 66  r, r1);.      if
165f0 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f  ( testOp!=OP_Noo
16600 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  p ){.        sql
16610 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16620 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64  , testOp, memEnd
16630 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20  Value, addrBrk, 
16640 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
16650 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
16660 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  (v, SQLITE_AFF_N
16670 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f  UMERIC | SQLITE_
16680 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
16690 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
166a0 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20 29  odeRowSetEarly )
166b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
166c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
166d0 50 5f 52 6f 77 53 65 74 41 64 64 2c 20 72 65 67  P_RowSetAdd, reg
166e0 52 6f 77 53 65 74 2c 20 72 31 29 3b 0a 20 20 20  RowSet, r1);.   
166f0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
16700 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16710 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
16720 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
16730 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
16740 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
16750 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
16760 5f 43 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20  _COLUMN_EQ) ){. 
16770 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 41 20     /* Case 3: A 
16780 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e  scan using an in
16790 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
167a0 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 57  **         The W
167b0 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20  HERE clause may 
167c0 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20  contain zero or 
167d0 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20  more equality . 
167e0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65     **         te
167f0 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e  rms ("==" or "IN
16800 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61  " operators) tha
16810 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e  t refer to the N
16820 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
16830 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
16840 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  s of the index. 
16850 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  It may also cont
16860 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ain.    **      
16870 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f     inequality co
16880 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c  nstraints (>, <,
16890 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68   >= or <=) on th
168a0 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a  e indexed.    **
168b0 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
168c0 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  that immediately
168d0 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65   follows the N e
168e0 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20  qualities. Only 
168f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
16900 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
16910 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20  olumn can be an 
16920 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65  inequality - the
16930 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a   rest must.    *
16940 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68  *         use th
16950 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20  e "==" and "IN" 
16960 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65  operators. For e
16970 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a  xample, if the .
16980 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
16990 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c  ndex is on (x,y,
169a0 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  z), then the fol
169b0 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61  lowing clauses a
169c0 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20  re all .    **  
169d0 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64         optimized
169e0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
169f0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20             x=5. 
16a00 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
16a10 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20   x=5 AND y=10.  
16a20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
16a30 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20  x=5 AND y<10.   
16a40 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
16a50 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79  =5 AND y>5 AND y
16a60 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
16a70 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
16a80 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20  5 AND z<=10.    
16a90 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
16aa0 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20    The z<10 term 
16ab0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16ac0 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
16ad0 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20   only.    **    
16ae0 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72       the x=5 ter
16af0 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m:.    **.    **
16b00 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
16b10 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a  AND z<10.    **.
16b20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e      **         N
16b30 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20   may be zero if 
16b40 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
16b50 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
16b60 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
16b70 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
16b80 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
16b90 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20  traints, then N 
16ba0 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20  is at.    **    
16bb0 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a       least one..
16bc0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
16bd0 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20        This case 
16be0 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65  is also used whe
16bf0 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  n there are no W
16c00 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20  HERE clause.    
16c10 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
16c20 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
16c30 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
16c40 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
16c50 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
16c60 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74  to force the out
16c70 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e  put order to con
16c80 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52  form to an ORDER
16c90 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20   BY..    */  .  
16ca0 20 20 69 6e 74 20 61 53 74 61 72 74 4f 70 5b 5d    int aStartOp[]
16cb0 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20   = {.      0,.  
16cc0 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f      0,.      OP_
16cd0 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20  Rewind,         
16ce0 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f    /* 2: (!start_
16cf0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
16d00 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76  tartEq &&  !bRev
16d10 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61  ) */.      OP_La
16d20 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
16d30 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
16d40 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
16d50 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
16d60 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
16d70 47 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Gt,           /*
16d80 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   4: (start_const
16d90 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
16da0 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
16db0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74  .      OP_SeekLt
16dc0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35  ,           /* 5
16dd0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
16de0 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
16df0 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
16e00 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20       OP_SeekGe, 
16e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20            /* 6: 
16e20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
16e30 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
16e40 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
16e50 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20     OP_SeekLe    
16e60 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73          /* 7: (s
16e70 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
16e80 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
16e90 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d    bRev) */.    }
16ea0 3b 0a 20 20 20 20 69 6e 74 20 61 45 6e 64 4f 70  ;.    int aEndOp
16eb0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f  [] = {.      OP_
16ec0 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  Noop,           
16ed0 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f    /* 0: (!end_co
16ee0 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20  nstraints) */.  
16ef0 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20      OP_IdxGE,   
16f00 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28           /* 1: (
16f10 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
16f20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
16f30 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20     OP_IdxLT     
16f40 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65          /* 2: (e
16f50 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
16f60 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d  & bRev) */.    }
16f70 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20  ;.    int nEq = 
16f80 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
16f90 3b 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51  ;.    int isMinQ
16fa0 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  uery = 0;       
16fb0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
16fc0 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45   an optimized SE
16fd0 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f  LECT min(x).. */
16fe0 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65  .    int regBase
16ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17000 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
17010 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74  er holding const
17020 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a  raint values */.
17030 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20      int r1;     
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17050 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
17060 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  r */.    WhereTe
17070 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20  rm *pRangeStart 
17080 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c  = 0;  /* Inequal
17090 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
170a0 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f  t range start */
170b0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
170c0 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20  pRangeEnd = 0;  
170d0 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
170e0 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
170f0 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69  nge end */.    i
17100 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20  nt startEq;     
17110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17120 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61  rue if range sta
17130 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  rt uses ==, >= o
17140 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
17150 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20  endEq;          
17160 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
17170 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73   if range end us
17180 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
17190 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
171a0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20  _constraints;   
171b0 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
171c0 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61  range is constra
171d0 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ined */.    int 
171e0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
171f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17200 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  er of constraint
17210 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e   terms */.    In
17220 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
17230 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
17240 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
17250 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
17260 43 75 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Cur;         /* 
17270 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
17280 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
17290 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52  .    int nExtraR
172a0 65 67 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  eg = 0;   /* Num
172b0 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
172c0 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f  isters needed */
172d0 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  .    int op;    
172e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
172f0 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  truction opcode 
17300 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70  */..    pIdx = p
17310 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
17320 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20  dx;.    iIdxCur 
17330 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
17340 72 3b 0a 20 20 20 20 6b 20 3d 20 70 49 64 78 2d  r;.    k = pIdx-
17350 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 20  >aiColumn[nEq]; 
17360 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f      /* Column fo
17370 72 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  r inequality con
17380 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20  straints */..   
17390 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70   /* If this loop
173a0 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72   satisfies a sor
173b0 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42  t order (pOrderB
173c0 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20  y) request that 
173d0 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73  .    ** was pass
173e0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
173f0 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ion to implement
17400 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
17410 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71  ) ..." .    ** q
17420 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63  uery, then the c
17430 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  aller will only 
17440 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74  allow the loop t
17450 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a  o run for.    **
17460 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74   a single iterat
17470 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
17480 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72  that the first r
17490 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20  ow returned.    
174a0 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  ** should not ha
174b0 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ve a NULL value 
174c0 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49  stored in 'x'. I
174d0 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a  f column 'x' is.
174e0 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
174f0 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e   one after the n
17500 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  Eq equality cons
17510 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69  traints in the i
17520 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69  ndex,.    ** thi
17530 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20  s requires some 
17540 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
17550 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
17560 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
17570 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21  RE_ORDERBY_MIN)!
17580 3d 30 0a 20 20 20 20 20 26 26 20 28 70 4c 65 76  =0.     && (pLev
17590 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
175a0 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 0a  &WHERE_ORDERBY).
175b0 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e       && (pIdx->n
175c0 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20  Column>nEq).    
175d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  ){.      /* asse
175e0 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rt( pOrderBy->nE
175f0 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20  xpr==1 ); */.   
17600 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f     /* assert( pO
17610 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78  rderBy->a[0].pEx
17620 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64  pr->iColumn==pId
17630 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  x->aiColumn[nEq]
17640 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d   ); */.      isM
17650 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20  inQuery = 1;.   
17660 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
17670 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17680 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c  Find any inequal
17690 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ity constraint t
176a0 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61  erms for the sta
176b0 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20  rt and end .    
176c0 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  ** of the range.
176d0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
176e0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
176f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
17700 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  P_LIMIT ){.     
17710 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e   pRangeEnd = fin
17720 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
17730 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57   k, notReady, (W
17740 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64  O_LT|WO_LE), pId
17750 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  x);.      nExtra
17760 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Reg = 1;.    }. 
17770 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
17780 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
17790 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
177a0 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74 61  .      pRangeSta
177b0 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rt = findTerm(pW
177c0 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
177d0 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f  eady, (WO_GT|WO_
177e0 47 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  GE), pIdx);.    
177f0 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
17800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
17810 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
17820 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e  evaluate all con
17830 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73  straint terms us
17840 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20  ing == or IN.   
17850 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68   ** and store th
17860 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73  e values of thos
17870 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72  e terms in an ar
17880 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
17890 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
178a0 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20   at regBase..   
178b0 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20   */.    regBase 
178c0 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  = codeAllEqualit
178d0 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70  yTerms(pParse, p
178e0 4c 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52  Level, pWC, notR
178f0 65 61 64 79 2c 20 6e 45 78 74 72 61 52 65 67 29  eady, nExtraReg)
17900 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
17910 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
17920 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  ...    /* If we 
17930 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65  are doing a reve
17940 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  rse order scan o
17950 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69  n an ascending i
17960 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ndex, or.    ** 
17970 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20  a forward order 
17980 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e  scan on a descen
17990 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65  ding index, inte
179a0 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20  rchange the .   
179b0 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e   ** start and en
179c0 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53  d terms (pRangeS
179d0 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45  tart and pRangeE
179e0 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nd)..    */.    
179f0 69 66 28 20 62 52 65 76 3d 3d 28 70 49 64 78 2d  if( bRev==(pIdx-
17a00 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
17a10 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29  ==SQLITE_SO_ASC)
17a20 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57   ){.      SWAP(W
17a30 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e  hereTerm *, pRan
17a40 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61  geEnd, pRangeSta
17a50 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rt);.    }..    
17a60 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
17a70 53 74 61 72 74 20 26 26 20 70 52 61 6e 67 65 53  Start && pRangeS
17a80 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
17a90 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74  & WO_LE );.    t
17aa0 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
17ab0 74 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74  tart && pRangeSt
17ac0 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
17ad0 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 74 65   WO_GE );.    te
17ae0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
17af0 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e  d && pRangeEnd->
17b00 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
17b10 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
17b20 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
17b30 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
17b40 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a  ator & WO_GE );.
17b50 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70      startEq = !p
17b60 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52  RangeStart || pR
17b70 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72  angeStart->eOper
17b80 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
17b90 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20  _GE);.    endEq 
17ba0 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c  =   !pRangeEnd |
17bb0 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  | pRangeEnd->eOp
17bc0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
17bd0 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72  WO_GE);.    star
17be0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
17bf0 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e  pRangeStart || n
17c00 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  Eq>0;..    /* Se
17c10 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  ek the index cur
17c20 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  sor to the start
17c30 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
17c40 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e  /.    nConstrain
17c50 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  t = nEq;.    if(
17c60 20 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a   pRangeStart ){.
17c70 20 20 20 20 20 20 69 6e 74 20 64 63 63 20 3d 20        int dcc = 
17c80 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
17c90 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69  olCache;.      i
17ca0 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a  f( pRangeEnd ){.
17cb0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
17cc0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b  disableColCache+
17cd0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
17ce0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17cf0 28 70 50 61 72 73 65 2c 20 70 52 61 6e 67 65 53  (pParse, pRangeS
17d00 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69  tart->pExpr->pRi
17d10 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
17d20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
17d30 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
17d40 20 3d 20 64 63 63 3b 0a 20 20 20 20 20 20 73 71   = dcc;.      sq
17d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17d60 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
17d70 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
17d80 78 74 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  xt);.      nCons
17d90 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65  traint++;.    }e
17da0 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65  lse if( isMinQue
17db0 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
17dc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17dd0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
17de0 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
17df0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
17e00 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20        startEq = 
17e10 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63  0;.      start_c
17e20 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a  onstraints = 1;.
17e30 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70      }.    codeAp
17e40 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
17e50 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
17e60 6e 73 74 72 61 69 6e 74 2c 20 70 49 64 78 29 3b  nstraint, pIdx);
17e70 0a 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74  .    op = aStart
17e80 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  Op[(start_constr
17e90 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61  aints<<2) + (sta
17ea0 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d  rtEq<<1) + bRev]
17eb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
17ec0 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
17ed0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69  ase( op==OP_Rewi
17ee0 6e 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  nd );.    testca
17ef0 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20  se( op==OP_Last 
17f00 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
17f10 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29   op==OP_SeekGt )
17f20 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
17f30 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b  op==OP_SeekGe );
17f40 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
17f50 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a  p==OP_SeekLe );.
17f60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17f70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20  ==OP_SeekLt );. 
17f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17f90 64 4f 70 34 28 76 2c 20 6f 70 2c 20 69 49 64 78  dOp4(v, op, iIdx
17fa0 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
17fb0 67 42 61 73 65 2c 20 0a 20 20 20 20 20 20 20 20  gBase, .        
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
17fd0 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
17fe0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 2c 20 50 34  nConstraint), P4
17ff0 5f 49 4e 54 33 32 29 3b 0a 0a 20 20 20 20 2f 2a  _INT32);..    /*
18000 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20   Load the value 
18010 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69  for the inequali
18020 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
18030 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
18040 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66      ** range (if
18050 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20   any)..    */.  
18060 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
18070 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61  nEq;.    if( pRa
18080 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ngeEnd ){.      
18090 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
180a0 70 50 61 72 73 65 2c 20 70 52 61 6e 67 65 45 6e  pParse, pRangeEn
180b0 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  d->pExpr->pRight
180c0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
180d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
180e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
180f0 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45  Null, regBase+nE
18100 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
18110 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
18120 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
18130 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 70 49 64  Base, nEq+1, pId
18140 78 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  x);.      nConst
18150 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  raint++;.    }..
18160 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
18170 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  e loop body */. 
18180 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
18190 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
181a0 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20  ntAddr(v);..    
181b0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
181c0 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20  index cursor is 
181d0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
181e0 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
181f0 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70    op = aEndOp[(p
18200 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29  RangeEnd || nEq)
18210 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a   * (1 + bRev)];.
18220 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
18230 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20  ==OP_Noop );.   
18240 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
18250 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74  P_IdxGE );.    t
18260 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
18270 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28  IdxLT );.    if(
18280 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a   op!=OP_Noop ){.
18290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
182a0 65 41 64 64 4f 70 34 28 76 2c 20 6f 70 2c 20 69  eAddOp4(v, op, i
182b0 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  IdxCur, addrNxt,
182c0 20 72 65 67 42 61 73 65 2c 0a 20 20 20 20 20 20   regBase,.      
182d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182e0 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f    SQLITE_INT_TO_
182f0 50 54 52 28 6e 43 6f 6e 73 74 72 61 69 6e 74 29  PTR(nConstraint)
18300 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
18310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
18320 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21  angeP5(v, endEq!
18330 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20  =bRev ?1:0);.   
18340 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
18350 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69  ere are inequali
18360 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
18370 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
18380 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  alue.    ** of t
18390 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
183a0 74 68 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c  that the inequal
183b0 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73  ity contrains is
183c0 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a   not NULL..    *
183d0 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70  * If it is, jump
183e0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
183f0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
18400 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
18410 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
18420 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
18430 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
18440 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
18450 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
18460 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63  MIT );.    testc
18470 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ase( pLevel->pla
18480 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
18490 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20  E_TOP_LIMIT );. 
184a0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
184b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57  lan.wsFlags & (W
184c0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57  HERE_BTM_LIMIT|W
184d0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20  HERE_TOP_LIMIT) 
184e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
184f0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18500 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72  _Column, iIdxCur
18510 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20  , nEq, r1);.    
18520 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18530 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
18540 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b  , r1, addrCont);
18550 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
18560 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75  eek the table cu
18570 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65  rsor, if require
18580 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65  d */.    disable
18590 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
185a0 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64  ngeStart);.    d
185b0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
185c0 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20  l, pRangeEnd);. 
185d0 20 20 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72     codeRowSetEar
185e0 6c 79 20 3d 20 72 65 67 52 6f 77 53 65 74 3e 3d  ly = regRowSet>=
185f0 30 20 3f 20 77 68 65 72 65 52 6f 77 52 65 61 64  0 ? whereRowRead
18600 79 46 6f 72 4f 75 74 70 75 74 28 70 57 43 29 20  yForOutput(pWC) 
18610 3a 20 30 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d  : 0;.    if( !om
18620 69 74 54 61 62 6c 65 20 7c 7c 20 63 6f 64 65 52  itTable || codeR
18630 6f 77 53 65 74 45 61 72 6c 79 20 29 7b 0a 20 20  owSetEarly ){.  
18640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18650 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
18660 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 72  owid, iIdxCur, r
18670 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f  1);.      if( co
18680 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20 29 7b  deRowSetEarly ){
18690 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
186a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
186b0 5f 52 6f 77 53 65 74 41 64 64 2c 20 72 65 67 52  _RowSetAdd, regR
186c0 6f 77 53 65 74 2c 20 72 31 29 3b 0a 20 20 20 20  owSet, r1);.    
186d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
186e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
186f0 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69  p2(v, OP_Seek, i
18700 43 75 72 2c 20 72 31 29 3b 20 20 2f 2a 20 44 65  Cur, r1);  /* De
18710 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20  ferred seek */. 
18720 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18730 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
18740 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
18750 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f  1);..    /* Reco
18760 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  rd the instructi
18770 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69  on used to termi
18780 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44  nate the loop. D
18790 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57  isable .    ** W
187a0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
187b0 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74  s made redundant
187c0 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61   by the index ra
187d0 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f  nge scan..    */
187e0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
187f0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
18800 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
18810 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
18820 78 43 75 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23  xCur;.  }else..#
18830 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18840 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
18850 4f 4e 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  ON.  if( pLevel-
18860 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
18870 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29  WHERE_MULTI_OR )
18880 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a  {.    /* Case 4:
18890 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65    Two or more se
188a0 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64  parately indexed
188b0 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
188c0 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20   by OR.    **.  
188d0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
188e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52    **.    **   CR
188f0 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
18900 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20  b,c,d);.    **  
18910 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
18920 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a   ON t1(a);.    *
18930 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
18940 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20   i2 ON t1(b);.  
18950 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
18960 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b  DEX i3 ON t1(c);
18970 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
18980 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
18990 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62  1 WHERE a=5 OR b
189a0 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20  =7 OR (c=11 AND 
189b0 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20  d=13).    **.   
189c0 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70   ** In the examp
189d0 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20 74 68  le, there are th
189e0 72 65 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ree indexed term
189f0 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
18a00 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f  R..    ** The to
18a10 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73  p of the loop is
18a20 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
18a30 63 72 65 61 74 69 6e 67 20 61 20 52 6f 77 53 65  creating a RowSe
18a40 74 20 6f 62 6a 65 63 74 0a 20 20 20 20 2a 2a 20  t object.    ** 
18a50 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 20 69  and populating i
18a60 74 2e 20 20 54 68 65 6e 20 6c 6f 6f 70 69 6e 67  t.  Then looping
18a70 20 6f 76 65 72 20 65 6c 65 6d 65 6e 74 73 20 6f   over elements o
18a80 66 20 74 68 65 20 72 6f 77 73 65 74 2e 0a 20 20  f the rowset..  
18a90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
18aa0 20 20 20 4e 75 6c 6c 20 31 0a 20 20 20 20 2a 2a     Null 1.    **
18ab0 20 20 20 20 20 20 20 20 23 20 66 69 6c 6c 20 52          # fill R
18ac0 6f 77 53 65 74 20 31 20 77 69 74 68 20 65 6e 74  owSet 1 with ent
18ad0 72 69 65 73 20 77 68 65 72 65 20 61 3d 35 20 75  ries where a=5 u
18ae0 73 69 6e 67 20 69 31 0a 20 20 20 20 2a 2a 20 20  sing i1.    **  
18af0 20 20 20 20 20 20 23 20 66 69 6c 6c 20 52 6f 77        # fill Row
18b00 73 65 74 20 31 20 77 69 74 68 20 65 6e 74 72 69  set 1 with entri
18b10 65 73 20 77 68 65 72 65 20 62 3d 37 20 75 73 69  es where b=7 usi
18b20 6e 67 20 69 32 0a 20 20 20 20 2a 2a 20 20 20 20  ng i2.    **    
18b30 20 20 20 20 23 20 66 69 6c 6c 20 52 6f 77 73 65      # fill Rowse
18b40 74 20 31 20 77 69 74 68 20 65 6e 74 72 69 65 73  t 1 with entries
18b50 20 77 68 65 72 65 20 63 3d 31 31 20 61 6e 64 20   where c=11 and 
18b60 64 3d 31 33 20 69 33 20 61 6e 64 20 74 31 0a 20  d=13 i3 and t1. 
18b70 20 20 20 2a 2a 20 20 20 20 20 41 3a 20 52 6f 77     **     A: Row
18b80 53 65 74 52 65 61 64 20 31 2c 20 42 2c 20 32 0a  SetRead 1, B, 2.
18b90 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 53 65      **        Se
18ba0 65 6b 20 20 20 20 20 20 20 69 2c 20 32 0a 20 20  ek       i, 2.  
18bb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
18bc0 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
18bd0 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  op looks like th
18be0 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
18bf0 2a 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20  *        Goto   
18c00 20 20 20 20 30 2c 20 41 0a 20 20 20 20 2a 2a 20      0, A.    ** 
18c10 20 20 20 20 42 3a 0a 20 20 20 20 2a 2f 0a 20 20      B:.    */.  
18c20 20 20 69 6e 74 20 72 65 67 4f 72 52 6f 77 73 65    int regOrRowse
18c30 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  t;       /* Regi
18c40 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
18c50 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a   RowSet object *
18c60 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4e 65 78  /.    int regNex
18c70 74 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a 20  tRowid;      /* 
18c80 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
18c90 20 6e 65 78 74 20 72 6f 77 69 64 20 2a 2f 0a 20   next rowid */. 
18ca0 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
18cb0 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65  pOrWc;    /* The
18cc0 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65   OR-clause broke
18cd0 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65  n out into subte
18ce0 72 6d 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  rms */.    Where
18cf0 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20  Term *pOrTerm;  
18d00 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 73 75    /* A single su
18d10 62 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  bterm within the
18d20 20 4f 52 2d 63 6c 61 75 73 65 20 2a 2f 0a 20 20   OR-clause */.  
18d30 20 20 53 72 63 4c 69 73 74 20 6f 6e 65 54 61 62    SrcList oneTab
18d40 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72  ;        /* Shor
18d50 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74  tened table list
18d60 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70 54 65 72   */.   .    pTer
18d70 6d 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  m = pLevel->plan
18d80 2e 75 2e 70 54 65 72 6d 3b 0a 20 20 20 20 61 73  .u.pTerm;.    as
18d90 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
18da0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
18db0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
18dc0 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73  WO_OR );.    ass
18dd0 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
18de0 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e  lags & TERM_ORIN
18df0 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f  FO)!=0 );.    pO
18e00 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWc = &pTerm->u.
18e10 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
18e20 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79   codeRowSetEarly
18e30 20 3d 20 28 72 65 67 52 6f 77 53 65 74 3e 3d 30   = (regRowSet>=0
18e40 20 26 26 20 70 57 43 2d 3e 6e 54 65 72 6d 3d 3d   && pWC->nTerm==
18e50 31 29 20 3f 31 3a 30 3b 0a 0a 20 20 20 20 69 66  1) ?1:0;..    if
18e60 28 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c  ( codeRowSetEarl
18e70 79 20 29 7b 0a 20 20 20 20 20 20 72 65 67 4f 72  y ){.      regOr
18e80 52 6f 77 73 65 74 20 3d 20 72 65 67 52 6f 77 53  Rowset = regRowS
18e90 65 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  et;.    }else{. 
18ea0 20 20 20 20 20 72 65 67 4f 72 52 6f 77 73 65 74       regOrRowset
18eb0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
18ec0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
18ed0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18ee0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
18ef0 2c 20 30 2c 20 72 65 67 4f 72 52 6f 77 73 65 74  , 0, regOrRowset
18f00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6e 65  );.    }.    one
18f10 54 61 62 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20  Tab.nSrc = 1;.  
18f20 20 20 6f 6e 65 54 61 62 2e 6e 41 6c 6c 6f 63 20    oneTab.nAlloc 
18f30 3d 20 31 3b 0a 20 20 20 20 6f 6e 65 54 61 62 2e  = 1;.    oneTab.
18f40 61 5b 30 5d 20 3d 20 2a 70 54 61 62 49 74 65 6d  a[0] = *pTabItem
18f50 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70  ;.    for(j=0, p
18f60 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b  OrTerm=pOrWc->a;
18f70 20 6a 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b   j<pOrWc->nTerm;
18f80 20 6a 2b 2b 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   j++, pOrTerm++)
18f90 7b 0a 20 20 20 20 20 20 57 68 65 72 65 49 6e 66  {.      WhereInf
18fa0 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 0a 20 20  o *pSubWInfo;.  
18fb0 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
18fc0 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
18fd0 72 20 26 26 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  r && pOrTerm->eO
18fe0 70 65 72 61 74 6f 72 21 3d 57 4f 5f 41 4e 44 20  perator!=WO_AND 
18ff0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
19000 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71    pSubWInfo = sq
19010 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
19020 70 50 61 72 73 65 2c 20 26 6f 6e 65 54 61 62 2c  pParse, &oneTab,
19030 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c   pOrTerm->pExpr,
19040 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
19050 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
19060 45 5f 46 49 4c 4c 5f 52 4f 57 53 45 54 20 7c 20  E_FILL_ROWSET | 
19070 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 20  WHERE_OMIT_OPEN 
19080 7c 20 57 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f  | WHERE_OMIT_CLO
19090 53 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  SE,.            
190a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4f              regO
190b0 72 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 20 20  rRowset);.      
190c0 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b  if( pSubWInfo ){
190d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
190e0 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e  WhereEnd(pSubWIn
190f0 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  fo);.      }.   
19100 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
19110 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19120 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  , addrCont);.   
19130 20 69 66 28 20 21 63 6f 64 65 52 6f 77 53 65 74   if( !codeRowSet
19140 45 61 72 6c 79 20 29 7b 0a 20 20 20 20 20 20 72  Early ){.      r
19150 65 67 4e 65 78 74 52 6f 77 69 64 20 3d 20 73 71  egNextRowid = sq
19160 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19170 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 61  pParse);.      a
19180 64 64 72 43 6f 6e 74 20 3d 20 0a 20 20 20 20 20  ddrCont = .     
19190 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
191a0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 6f 77 53  ddOp3(v, OP_RowS
191b0 65 74 52 65 61 64 2c 20 72 65 67 4f 72 52 6f 77  etRead, regOrRow
191c0 73 65 74 2c 61 64 64 72 42 72 6b 2c 72 65 67 4e  set,addrBrk,regN
191d0 65 78 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  extRowid);.     
191e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
191f0 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69  p2(v, OP_Seek, i
19200 43 75 72 2c 20 72 65 67 4e 65 78 74 52 6f 77 69  Cur, regNextRowi
19210 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
19220 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19230 70 50 61 72 73 65 2c 20 72 65 67 4e 65 78 74 52  pParse, regNextR
19240 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 2f 2a 20  owid);.      /* 
19250 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
19260 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
19270 67 4f 72 52 6f 77 73 65 74 29 3b 20 2f 2f 20 50  gOrRowset); // P
19280 72 65 73 65 72 76 65 20 74 68 65 20 52 6f 77 53  reserve the RowS
19290 65 74 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76  et */.      pLev
192a0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f  el->op = OP_Goto
192b0 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
192c0 70 32 20 3d 20 61 64 64 72 43 6f 6e 74 3b 0a 20  p2 = addrCont;. 
192d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
192e0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
192f0 4e 6f 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Noop;.    }.    
19300 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
19310 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65  el, pTerm);.  }e
19320 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
19330 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
19340 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20  IMIZATION */..  
19350 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a  {.    /* Case 5:
19360 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73    There is no us
19370 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20  able index.  We 
19380 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65  must do a comple
19390 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
193a0 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65     scan of the e
193b0 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20  ntire table..   
193c0 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
193d0 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20  onst u8 aStep[] 
193e0 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f  = { OP_Next, OP_
193f0 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74  Prev };.    stat
19400 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61  ic const u8 aSta
19410 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69  rt[] = { OP_Rewi
19420 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20  nd, OP_Last };. 
19430 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d     assert( bRev=
19440 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b  =0 || bRev==1 );
19450 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69  .    assert( omi
19460 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
19470 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53   pLevel->op = aS
19480 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70  tep[bRev];.    p
19490 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
194a0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
194b0 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
194c0 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61  beAddOp2(v, aSta
194d0 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20  rt[bRev], iCur, 
194e0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c  addrBrk);.    pL
194f0 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54  evel->p5 = SQLIT
19500 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
19510 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20  LSCAN_STEP;.    
19520 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20  codeRowSetEarly 
19530 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65  = 0;.  }.  notRe
19540 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
19550 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69  pWC->pMaskSet, i
19560 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65  Cur);..  /* Inse
19570 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
19580 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73  every subexpress
19590 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20  ion that can be 
195a0 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20  completely.  ** 
195b0 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74  computed using t
195c0 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f  he current set o
195d0 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  f tables..  */. 
195e0 20 6b 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54   k = 0;.  for(pT
195f0 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57  erm=pWC->a, j=pW
19600 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  C->nTerm; j>0; j
19610 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
19620 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
19630 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
19640 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
19650 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 74  VIRTUAL );.    t
19660 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
19670 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
19680 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ODED );.    if( 
19690 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
196a0 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
196b0 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
196c0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
196d0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
196e0 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
196f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
19700 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
19710 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
19720 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  E!=0 );.    if( 
19730 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
19740 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  n && !ExprHasPro
19750 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
19760 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
19770 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
19780 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
19790 62 6c 65 43 6f 6c 43 61 63 68 65 20 2b 3d 20 6b  bleColCache += k
197a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
197b0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
197c0 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53   pE, addrCont, S
197d0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
197e0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  );.    pParse->d
197f0 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 20 2d  isableColCache -
19800 3d 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 31 3b 0a  = k;.    k = 1;.
19810 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
19820 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
19830 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
19840 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
19850 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  N, generate code
19860 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72   that will recor
19870 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a  d the fact that.
19880 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
19890 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67  e row of the rig
198a0 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74  ht table has mat
198b0 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61  ched the left ta
198c0 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  ble.  .  */.  if
198d0 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
198e0 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65  oin ){.    pLeve
198f0 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73  l->addrFirst = s
19900 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
19910 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
19920 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19930 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
19940 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
19950 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
19960 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72  mment((v, "recor
19970 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22  d LEFT JOIN hit"
19980 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ));.    sqlite3E
19990 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61  xprClearColumnCa
199a0 63 68 65 28 70 50 61 72 73 65 2c 20 70 4c 65 76  che(pParse, pLev
199b0 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20  el->iTabCur);.  
199c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65    sqlite3ExprCle
199d0 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  arColumnCache(pP
199e0 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  arse, pLevel->iI
199f0 64 78 43 75 72 29 3b 0a 20 20 20 20 66 6f 72 28  dxCur);.    for(
19a00 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
19a10 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  0; j<pWC->nTerm;
19a20 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
19a30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19a40 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
19a50 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
19a60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19a70 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
19a80 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
19a90 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
19aa0 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
19ab0 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
19ac0 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
19ad0 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
19ae0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
19af0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f  otReady)!=0 ) co
19b00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
19b10 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
19b20 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pr );.      sqli
19b30 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
19b40 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45  Parse, pTerm->pE
19b50 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53  xpr, addrCont, S
19b60 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
19b70 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  );.      pTerm->
19b80 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
19b90 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  CODED;.    }.  }
19ba0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  /*.  ** If i
19bb0 74 20 77 61 73 20 72 65 71 75 65 73 74 65 64 20  t was requested 
19bc0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
19bd0 75 6c 74 73 20 69 6e 20 61 20 72 6f 77 73 65 74  ults in a rowset
19be0 20 61 6e 64 20 74 68 61 74 20 68 61 73 0a 20 20   and that has.  
19bf0 2a 2a 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  ** not already b
19c00 65 65 6e 20 64 6f 2c 20 74 68 65 6e 20 64 6f 20  een do, then do 
19c10 73 6f 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  so now..  */.  i
19c20 66 28 20 72 65 67 52 6f 77 53 65 74 3e 3d 30 20  f( regRowSet>=0 
19c30 26 26 20 21 63 6f 64 65 52 6f 77 53 65 74 45 61  && !codeRowSetEa
19c40 72 6c 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  rly ){.    int r
19c50 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
19c60 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 23  mpReg(pParse);.#
19c70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19c80 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
19c90 20 20 20 20 69 66 28 20 20 28 70 4c 65 76 65 6c      if(  (pLevel
19ca0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
19cb0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
19cc0 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  BLE)!=0 ){.     
19cd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19ce0 70 32 28 76 2c 20 4f 50 5f 56 52 6f 77 69 64 2c  p2(v, OP_VRowid,
19cf0 20 69 43 75 72 2c 20 72 31 29 3b 0a 20 20 20 20   iCur, r1);.    
19d00 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
19d10 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
19d20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19d30 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 72 31  _Rowid, iCur, r1
19d40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
19d50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19d60 2c 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 2c 20  , OP_RowSetAdd, 
19d70 72 65 67 52 6f 77 53 65 74 2c 20 72 31 29 3b 0a  regRowSet, r1);.
19d80 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
19d90 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
19da0 2c 20 72 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  , r1);.  }..  re
19db0 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d  turn notReady;.}
19dc0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
19dd0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
19de0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
19df0 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20  ariable holds a 
19e00 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e  text description
19e10 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67   of query plan g
19e20 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74  enerated.** by t
19e30 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
19e40 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
19e50 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63  ereBegin().  Eac
19e60 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42  h call to WhereB
19e70 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74  egin.** overwrit
19e80 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e  es the previous.
19e90 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
19ea0 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  on is used for t
19eb0 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e  esting and.** an
19ec0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
19ed0 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65  char sqlite3_que
19ee0 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30  ry_plan[BMS*2*40
19ef0 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74  ];  /* Text of t
19f00 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69  he join */.stati
19f10 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30  c int nQPlan = 0
19f20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19f30 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77  * Next free slow
19f40 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b   in _query_plan[
19f50 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ] */..#endif /* 
19f60 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a  SQLITE_TEST */..
19f70 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68  ./*.** Free a Wh
19f80 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
19f90 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
19fa0 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73   whereInfoFree(s
19fb0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
19fc0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
19fd0 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a    if( pWInfo ){.
19fe0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
19ff0 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f  or(i=0; i<pWInfo
1a000 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
1a010 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
1a020 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20  dex_info *pInfo 
1a030 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70  = pWInfo->a[i].p
1a040 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  IdxInfo;.      i
1a050 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
1a060 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 66      assert( pInf
1a070 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
1a080 53 74 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  Str==0 || db->ma
1a090 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1a0a0 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d        if( pInfo-
1a0b0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1a0c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
1a0d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 66  qlite3_free(pInf
1a0e0 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 09 7d 0a 20  o->idxStr);..}. 
1a0f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
1a100 46 72 65 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b  Free(db, pInfo);
1a110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a120 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c     whereClauseCl
1a130 65 61 72 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29  ear(pWInfo->pWC)
1a140 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1a150 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
1a160 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
1a170 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69  enerate the begi
1a180 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
1a190 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45  p used for WHERE
1a1a0 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
1a1b0 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ng..** The retur
1a1c0 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
1a1d0 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75  nter to an opaqu
1a1e0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
1a1f0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66   contains.** inf
1a200 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ormation needed 
1a210 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
1a220 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74   loop.  Later, t
1a230 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
1a240 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76  ne.** should inv
1a250 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  oke sqlite3Where
1a260 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72  End() with the r
1a270 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
1a280 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
1a290 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
1a2a0 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63  lete the WHERE c
1a2b0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
1a2c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1a2d0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
1a2e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1a2f0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
1a300 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74   basic idea is t
1a310 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f  o do a nested lo
1a320 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72  op, one loop for
1a330 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a   each table in.*
1a340 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
1a350 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  e of a select.  
1a360 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41  (INSERT and UPDA
1a370 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
1a380 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  e the.** same as
1a390 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f   a SELECT with o
1a3a0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
1a3b0 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
1a3c0 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20  lause.)  For.** 
1a3d0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1a3e0 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a  SQL is this:.**.
1a3f0 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  **       SELECT 
1a400 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
1a410 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a  3 WHERE ...;.**.
1a420 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65  ** Then the code
1a430 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f   generated is co
1a440 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20  nceptually like 
1a450 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
1a460 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  *.**      foreac
1a470 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20  h row1 in t1 do 
1a480 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
1a490 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
1a4a0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
1a4b0 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c   in t2 do      |
1a4c0 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
1a4d0 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20  reBegin().**    
1a4e0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
1a4f0 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a  w3 in t3 do   /.
1a500 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  **            ..
1a510 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e  ..**          en
1a520 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
1a530 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
1a540 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
1a550 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1a570 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
1a580 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20  reEnd().**      
1a590 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
1a5b0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
1a5c0 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f  e loops might no
1a5d0 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74  t be nested in t
1a5e0 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
1a5f0 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72  h they.** appear
1a600 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1a610 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65  use if a differe
1a620 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74  nt order is bett
1a630 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a  er able to make.
1a640 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ** use of indice
1a650 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  s.  Note also th
1a660 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f  at when the IN o
1a670 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20  perator appears 
1a680 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
1a690 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74  clause, it might
1a6a0 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74   result in addit
1a6b0 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f  ional nested loo
1a6c0 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69  ps for.** scanni
1a6d0 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76  ng through all v
1a6e0 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67  alues on the rig
1a6f0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
1a700 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  the IN..**.** Th
1a710 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75  ere are Btree cu
1a720 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
1a730 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65   with each table
1a740 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f  .  t1 uses curso
1a750 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62  r.** number pTab
1a760 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
1a770 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65  or.  t2 uses the
1a780 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74   cursor pTabList
1a790 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a  ->a[1].iCursor..
1a7a0 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** And so forth.
1a7b0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67    This routine g
1a7c0 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
1a7d0 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45   open those VDBE
1a7e0 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20   cursors.** and 
1a7f0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1a800 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  ) generates the 
1a810 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  code to close th
1a820 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  em..**.** The co
1a830 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57  de that sqlite3W
1a840 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65  hereBegin() gene
1a850 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65  rates leaves the
1a860 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a   cursors named.*
1a870 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f  * in pTabList po
1a880 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20  inting at their 
1a890 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
1a8a0 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20  ies.  The [...] 
1a8b0 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20  code.** can use 
1a8c0 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50  OP_Column and OP
1a8d0 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f  _Rowid opcodes o
1a8e0 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20  n these cursors 
1a8f0 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61  to extract.** da
1a900 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69  ta from the vari
1a910 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ous tables of th
1a920 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  e loop..**.** If
1a930 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1a940 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
1a950 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75  foreach loops mu
1a960 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65  st each scan the
1a970 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62  ir.** entire tab
1a980 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72  les.  Thus a thr
1a990 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61  ee-way join is a
1a9a0 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69  n O(N^3) operati
1a9b0 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74  on.  But if.** t
1a9c0 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  he tables have i
1a9d0 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
1a9e0 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68   are terms in th
1a9f0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
1aa00 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20  hat.** refer to 
1aa10 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61  those indices, a
1aa20 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20   complete table 
1aa30 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69  scan can be avoi
1aa40 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  ded and the.** c
1aa50 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63  ode will run muc
1aa60 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20  h faster.  Most 
1aa70 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  of the work of t
1aa80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1aa90 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65  hecking.** to se
1aaa0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  e if there are i
1aab0 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20  ndices that can 
1aac0 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64  be used to speed
1aad0 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   up the loop..**
1aae0 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65  .** Terms of the
1aaf0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72   WHERE clause ar
1ab00 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c  e also used to l
1ab10 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20  imit which rows 
1ab20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  actually.** make
1ab30 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22   it to the "..."
1ab40 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
1ab50 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74  f the loop.  Aft
1ab60 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68  er each "foreach
1ab70 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74  ",.** terms of t
1ab80 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ab90 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65  that use only te
1aba0 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70  rms in that loop
1abb0 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f   and outer.** lo
1abc0 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65  ops are evaluate
1abd0 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61  d and if false a
1abe0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72   jump is made ar
1abf0 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75  ound all subsequ
1ac00 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f  ent.** inner loo
1ac10 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68  ps (or around th
1ac20 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74  e "..." if the t
1ac30 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  est occurs withi
1ac40 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20  n the inner-.** 
1ac50 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a  most loop).**.**
1ac60 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a   OUTER JOINS.**.
1ac70 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  ** An outer join
1ac80 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e   of tables t1 an
1ac90 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61  d t2 is concepta
1aca0 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c  lly coded as fol
1acb0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  lows:.**.**    f
1acc0 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
1acd0 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61  1 do.**      fla
1ace0 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f  g = 0.**      fo
1acf0 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
1ad00 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74   do.**        st
1ad10 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  art:.**         
1ad20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
1ad30 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20   flag = 1.**    
1ad40 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66    end.**      if
1ad50 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a   flag==0 then.**
1ad60 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65          move the
1ad70 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20   row2 cursor to 
1ad80 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20  a null row.**   
1ad90 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a       goto start.
1ada0 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20  **      fi.**   
1adb0 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52   end.**.** ORDER
1adc0 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45   BY CLAUSE PROCE
1add0 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f  SSING.**.** *ppO
1ade0 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e  rderBy is a poin
1adf0 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ter to the ORDER
1ae00 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20   BY clause of a 
1ae10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ae20 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  ,.** if there is
1ae30 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20   one.  If there 
1ae40 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
1ae50 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73  lause or if this
1ae60 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
1ae70 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50  alled from an UP
1ae80 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
1ae90 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70  tatement, then p
1aea0 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
1aeb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ..**.** If an in
1aec0 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
1aed0 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74 75  so that the natu
1aee0 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72  ral output order
1aef0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   of the table.**
1af00 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74   scan is correct
1af10 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42   for the ORDER B
1af20 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
1af30 68 61 74 20 69 6e 64 65 78 20 69 73 20 75 73 65  hat index is use
1af40 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65  d and.** *ppOrde
1af50 72 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55  rBy is set to NU
1af60 4c 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  LL.  This is an 
1af70 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61  optimization tha
1af80 74 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a  t prevents an.**
1af90 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72   unnecessary sor
1afa0 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  t of the result 
1afb0 73 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20  set if an index 
1afc0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
1afd0 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  the.** ORDER BY 
1afe0 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65  clause already e
1aff0 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  xists..**.** If 
1b000 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
1b010 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65   loops cannot be
1b020 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f   arranged to pro
1b030 76 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74  vide the correct
1b040 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72  .** output order
1b050 2c 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72  , then the *ppOr
1b060 64 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67  derBy is unchang
1b070 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f  ed..*/.WhereInfo
1b080 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
1b090 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
1b0a0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
1b0b0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
1b0c0 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
1b0d0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a  *pTabList,    /*
1b0e0 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
1b0f0 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
1b100 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
1b110 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
1b120 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1b130 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
1b140 20 2a 2a 70 70 4f 72 64 65 72 42 79 2c 20 2f 2a   **ppOrderBy, /*
1b150 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   An ORDER BY cla
1b160 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
1b170 20 20 75 38 20 77 63 74 72 6c 46 6c 61 67 73 2c    u8 wctrlFlags,
1b180 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
1b190 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
1b1a0 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
1b1b0 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
1b1c0 69 6e 74 20 72 65 67 52 6f 77 53 65 74 20 20 20  int regRowSet   
1b1d0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1b1e0 72 20 68 6f 6c 64 20 52 6f 77 53 65 74 20 69 66  r hold RowSet if
1b1f0 20 57 48 45 52 45 5f 46 49 4c 4c 5f 52 4f 57 53   WHERE_FILL_ROWS
1b200 45 54 20 69 73 20 73 65 74 20 2a 2f 0a 29 7b 0a  ET is set */.){.
1b210 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1b220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b230 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1b240 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1b250 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo;         /* 
1b260 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  Will become the 
1b270 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
1b280 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
1b290 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1b2a0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a  rse->pVdbe;   /*
1b2b0 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
1b2c0 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
1b2d0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
1b2e0 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
1b2f0 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
1b300 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
1b310 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  ned */.  WhereMa
1b320 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
1b330 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
1b340 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
1b350 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
1b360 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
1b370 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
1b380 74 69 6f 6e 20 6f 66 20 74 68 65 20 57 48 45 52  tion of the WHER
1b390 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
1b3a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1b3b0 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a  m *pTabItem;  /*
1b3c0 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20   A single entry 
1b3d0 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f  from pTabList */
1b3e0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
1b3f0 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Level;          
1b400 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
1b410 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57 49 6e  evel in the pWIn
1b420 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  fo list */.  int
1b430 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   iFrom;         
1b440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b450 46 69 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f  First unused FRO
1b460 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
1b470 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61   */.  int andFla
1b480 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1b490 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69   /* AND-ed combi
1b4a0 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57  nation of all pW
1b4b0 43 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a  C->a[].wtFlags *
1b4c0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b4e0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
1b4f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c  ction */.  ExprL
1b500 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
1b510 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d  0;..  /* The num
1b520 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
1b530 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1b540 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
1b550 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
1b560 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
1b570 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ask .  */.  if( 
1b580 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
1b590 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
1b5a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b5b0 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
1b5c0 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
1b5d0 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
1b5e0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  n 0;.  }..  if( 
1b5f0 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  ppOrderBy ){.   
1b600 20 70 4f 72 64 65 72 42 79 20 3d 20 2a 70 70 4f   pOrderBy = *ppO
1b610 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f  rderBy;.  }..  /
1b620 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
1b630 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68  nitialize the Wh
1b640 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
1b650 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  e that will beco
1b660 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75  me the.  ** retu
1b670 72 6e 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  rn value..  */. 
1b680 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1b690 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
1b6a0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1b6b0 28 64 62 2c 20 20 0a 20 20 20 20 20 20 20 20 20  (db,  .         
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
1b6d0 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 0a 20  eof(WhereInfo). 
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6f0 20 20 20 20 20 2b 20 28 70 54 61 62 4c 69 73 74       + (pTabList
1b700 2d 3e 6e 53 72 63 2d 31 29 2a 73 69 7a 65 6f 66  ->nSrc-1)*sizeof
1b710 28 57 68 65 72 65 4c 65 76 65 6c 29 0a 20 20 20  (WhereLevel).   
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 20 20 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72     + sizeof(Wher
1b740 65 43 6c 61 75 73 65 29 0a 20 20 20 20 20 20 20  eClause).       
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
1b760 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4d 61 73   sizeof(WhereMas
1b770 6b 53 65 74 29 0a 20 20 20 20 20 20 20 20 20 20  kSet).          
1b780 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
1b790 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1b7a0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
1b7b0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
1b7c0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70  Info->nLevel = p
1b7d0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 20  TabList->nSrc;. 
1b7e0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20   pWInfo->pParse 
1b7f0 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e  = pParse;.  pWIn
1b800 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70  fo->pTabList = p
1b810 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
1b820 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69  o->iBreak = sqli
1b830 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1b840 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 72  (v);.  pWInfo->r
1b850 65 67 52 6f 77 53 65 74 20 3d 20 28 77 63 74 72  egRowSet = (wctr
1b860 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46  lFlags & WHERE_F
1b870 49 4c 4c 5f 52 4f 57 53 45 54 29 20 3f 20 72 65  ILL_ROWSET) ? re
1b880 67 52 6f 77 53 65 74 20 3a 20 2d 31 3b 0a 20 20  gRowSet : -1;.  
1b890 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 70 57  pWInfo->pWC = pW
1b8a0 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75 73 65  C = (WhereClause
1b8b0 2a 29 26 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49  *)&pWInfo->a[pWI
1b8c0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  nfo->nLevel];.  
1b8d0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1b8e0 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b  gs = wctrlFlags;
1b8f0 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 28 57  .  pMaskSet = (W
1b900 68 65 72 65 4d 61 73 6b 53 65 74 2a 29 26 70 57  hereMaskSet*)&pW
1b910 43 5b 31 5d 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69  C[1];..  /* Spli
1b920 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
1b930 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
1b940 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
1b950 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
1b960 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
1b970 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
1b980 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
1b990 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
1b9a0 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77  t(pMaskSet);.  w
1b9b0 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70  hereClauseInit(p
1b9c0 57 43 2c 20 70 50 61 72 73 65 2c 20 70 4d 61 73  WC, pParse, pMas
1b9d0 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  kSet);.  sqlite3
1b9e0 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
1b9f0 73 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  s(pParse, pWhere
1ba00 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28  );.  whereSplit(
1ba10 70 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f  pWC, pWhere, TK_
1ba20 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20  AND);.    .  /* 
1ba30 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20  Special case: a 
1ba40 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
1ba50 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t is constant.  
1ba60 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a  Evaluate the.  *
1ba70 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
1ba80 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65   either jump ove
1ba90 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64  r all of the cod
1baa0 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a  e or fall thru..
1bab0 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72    */.  if( pWher
1bac0 65 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e  e && (pTabList->
1bad0 6e 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  nSrc==0 || sqlit
1bae0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1baf0 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29  NotJoin(pWhere))
1bb00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1bb10 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1bb20 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66  e, pWhere, pWInf
1bb30 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54  o->iBreak, SQLIT
1bb40 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1bb50 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
1bb60 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20   }..  /* Assign 
1bb70 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62  a bit from the b
1bb80 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20  itmask to every 
1bb90 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
1bba0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
1bbb0 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e  ** When assignin
1bbc0 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73  g bitmask values
1bbd0 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   to FROM clause 
1bbe0 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74  cursors, it must
1bbf0 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73   be.  ** the cas
1bc00 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74  e that if X is t
1bc10 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74  he bitmask for t
1bc20 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61  he N-th FROM cla
1bc30 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20  use term then.  
1bc40 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  ** the bitmask f
1bc50 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  or all FROM clau
1bc60 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  se terms to the 
1bc70 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68  left of the N-th
1bc80 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58   term.  ** is (X
1bc90 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73  -1).   An expres
1bca0 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e  sion from the ON
1bcb0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
1bcc0 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20  T JOIN can use. 
1bcd0 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69   ** its Expr.iRi
1bce0 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c  ghtJoinTable val
1bcf0 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62  ue to find the b
1bd00 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69  itmask of the ri
1bd10 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ght table.  ** o
1bd20 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62  f the join.  Sub
1bd30 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f  tracting one fro
1bd40 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  m the right tabl
1bd50 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20  e bitmask gives 
1bd60 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66  a.  ** bitmask f
1bd70 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
1bd80 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
1bd90 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20   join.  Knowing 
1bda0 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a  the bitmask.  **
1bdb0 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
1bdc0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61  to the left of a
1bdd0 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d   left join is im
1bde0 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74  portant.  Ticket
1bdf0 20 23 33 30 31 35 2e 0a 20 20 2a 2f 0a 20 20 66   #3015..  */.  f
1be00 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
1be10 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
1be20 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
1be30 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
1be40 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
1be50 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
1be60 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74  EBUG.  {.    Bit
1be70 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d  mask toTheLeft =
1be80 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
1be90 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1bea0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  c; i++){.      B
1beb0 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61  itmask m = getMa
1bec0 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
1bed0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
1bee0 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  sor);.      asse
1bef0 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65  rt( (m-1)==toThe
1bf00 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f  Left );.      to
1bf10 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20  TheLeft |= m;.  
1bf20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1bf30 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c    /* Analyze all
1bf40 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65   of the subexpre
1bf50 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68  ssions.  Note th
1bf60 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29  at exprAnalyze()
1bf70 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20   might.  ** add 
1bf80 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
1bf90 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  s onto the end o
1bfa0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
1bfb0 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20  se.  We do not. 
1bfc0 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c   ** want to anal
1bfd0 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61  yze these virtua
1bfe0 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72  l terms, so star
1bff0 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74  t analyzing at t
1c000 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20  he end.  ** and 
1c010 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20  work forward so 
1c020 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76  that the added v
1c030 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65  irtual terms are
1c040 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64   never processed
1c050 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61  ..  */.  exprAna
1c060 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74  lyzeAll(pTabList
1c070 2c 20 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62  , pWC);.  if( db
1c080 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1c090 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
1c0a0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
1c0b0 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20  .  /* Chose the 
1c0c0 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73  best index to us
1c0d0 65 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  e for each table
1c0e0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1c0f0 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  use..  **.  ** T
1c100 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69  his loop fills i
1c110 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1c120 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a  fields:.  **.  *
1c130 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
1c140 70 49 64 78 20 20 20 20 20 20 54 68 65 20 69 6e  pIdx      The in
1c150 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
1c160 68 69 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  his level of the
1c170 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57   loop..  **   pW
1c180 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67  Info->a[].wsFlag
1c190 73 20 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c  s   WHERE_xxx fl
1c1a0 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ags associated w
1c1b0 69 74 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20  ith pIdx.  **   
1c1c0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20  pWInfo->a[].nEq 
1c1d0 20 20 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72        The number
1c1e0 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f   of == and IN co
1c1f0 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20  nstraints.  **  
1c200 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72   pWInfo->a[].iFr
1c210 6f 6d 20 20 20 20 20 57 68 69 63 68 20 74 65 72  om     Which ter
1c220 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
1c230 61 75 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f  ause is being co
1c240 64 65 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  ded.  **   pWInf
1c250 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20  o->a[].iTabCur  
1c260 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
1c270 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1c280 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70  e table.  **   p
1c290 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43  WInfo->a[].iIdxC
1c2a0 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
1c2b0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
1c2c0 65 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ex.  **   pWInfo
1c2d0 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20  ->a[].pTerm     
1c2e0 57 68 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f  When wsFlags==WO
1c2f0 5f 4f 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75  _OR, the OR-clau
1c300 73 65 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a  se term.  **.  *
1c310 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
1c320 20 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65   figures out the
1c330 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f   nesting order o
1c340 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
1c350 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65  FROM.  ** clause
1c360 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
1c370 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
1c380 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54  .  pTabItem = pT
1c390 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65  abList->a;.  pLe
1c3a0 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b  vel = pWInfo->a;
1c3b0 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30  .  andFlags = ~0
1c3c0 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  ;.  WHERETRACE((
1c3d0 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53  "*** Optimizer S
1c3e0 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  tart ***\n"));. 
1c3f0 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20   for(i=iFrom=0, 
1c400 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
1c410 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
1c420 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  rc; i++, pLevel+
1c430 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 43 6f 73  +){.    WhereCos
1c440 74 20 62 65 73 74 50 6c 61 6e 3b 20 20 20 20 20  t bestPlan;     
1c450 20 20 20 20 2f 2a 20 4d 6f 73 74 20 65 66 66 69      /* Most effi
1c460 63 69 65 6e 74 20 70 6c 61 6e 20 73 65 65 6e 20  cient plan seen 
1c470 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 49 6e  so far */.    In
1c480 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
1c490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1c4a0 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c  ex for FROM tabl
1c4b0 65 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f  e at pTabItem */
1c4c0 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  .    int j;     
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4e0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1c4f0 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73  over FROM tables
1c500 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74   */.    int best
1c510 4a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  J = 0;          
1c520 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
1c530 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74   of j */.    Bit
1c540 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20 20 20 20  mask m;         
1c550 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
1c560 61 73 6b 20 76 61 6c 75 65 20 66 6f 72 20 6a 20  ask value for j 
1c570 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20 20 20 20  or bestJ */.    
1c580 69 6e 74 20 6f 6e 63 65 20 3d 20 30 3b 20 20 20  int once = 0;   
1c590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c5a0 72 75 65 20 77 68 65 6e 20 66 69 72 73 74 20 74  rue when first t
1c5b0 61 62 6c 65 20 69 73 20 73 65 65 6e 20 2a 2f 0a  able is seen */.
1c5c0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62 65 73  .    memset(&bes
1c5d0 74 50 6c 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66  tPlan, 0, sizeof
1c5e0 28 62 65 73 74 50 6c 61 6e 29 29 3b 0a 20 20 20  (bestPlan));.   
1c5f0 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20   bestPlan.rCost 
1c600 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
1c610 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f  ;.    for(j=iFro
1c620 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61  m, pTabItem=&pTa
1c630 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70  bList->a[j]; j<p
1c640 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a  TabList->nSrc; j
1c650 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b  ++, pTabItem++){
1c660 0a 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74  .      int doNot
1c670 52 65 6f 72 64 65 72 3b 20 20 2f 2a 20 54 72 75  Reorder;  /* Tru
1c680 65 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  e if this table 
1c690 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65  should not be re
1c6a0 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1c6b0 20 57 68 65 72 65 43 6f 73 74 20 73 43 6f 73 74   WhereCost sCost
1c6c0 3b 20 20 20 2f 2a 20 43 6f 73 74 20 69 6e 66 6f  ;   /* Cost info
1c6d0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 73  rmation from bes
1c6e0 74 49 6e 64 65 78 28 29 20 2a 2f 0a 0a 20 20 20  tIndex() */..   
1c6f0 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20     doNotReorder 
1c700 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f  =  (pTabItem->jo
1c710 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1c720 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b  T|JT_CROSS))!=0;
1c730 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20  .      if( once 
1c740 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  && doNotReorder 
1c750 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d  ) break;.      m
1c760 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
1c770 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  Set, pTabItem->i
1c780 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69  Cursor);.      i
1c790 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79  f( (m & notReady
1c7a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1c7b0 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69  if( j==iFrom ) i
1c7c0 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  From++;.        
1c7d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1c7e0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
1c7f0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29  pTabItem->pTab )
1c800 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1c810 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1c820 4c 45 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  LE.      if( IsV
1c830 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d  irtual(pTabItem-
1c840 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
1c850 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
1c860 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 3b 20  info *pVtabIdx; 
1c870 2f 2a 20 43 75 72 72 65 6e 74 20 76 69 72 74 75  /* Current virtu
1c880 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  al index */.    
1c890 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
1c8a0 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e  x_info **ppIdxIn
1c8b0 66 6f 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  fo = &pWInfo->a[
1c8c0 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20  j].pIdxInfo;.   
1c8d0 20 20 20 20 20 73 43 6f 73 74 2e 72 43 6f 73 74       sCost.rCost
1c8e0 20 3d 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e   = bestVirtualIn
1c8f0 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
1c900 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65   pTabItem, notRe
1c910 61 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ady,.           
1c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c930 20 20 20 20 20 20 20 20 20 20 20 20 70 70 4f 72              ppOr
1c940 64 65 72 42 79 20 3f 20 2a 70 70 4f 72 64 65 72  derBy ? *ppOrder
1c950 42 79 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20  By : 0, i==0,.  
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c980 20 20 20 20 20 70 70 49 64 78 49 6e 66 6f 29 3b       ppIdxInfo);
1c990 0a 20 20 20 20 20 20 20 20 73 43 6f 73 74 2e 70  .        sCost.p
1c9a0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48  lan.wsFlags = WH
1c9b0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1c9c0 3b 0a 20 20 20 20 20 20 20 20 73 43 6f 73 74 2e  ;.        sCost.
1c9d0 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 20  plan.u.pVtabIdx 
1c9e0 3d 20 70 56 74 61 62 49 64 78 20 3d 20 2a 70 70  = pVtabIdx = *pp
1c9f0 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  IdxInfo;.       
1ca00 20 69 66 28 20 70 56 74 61 62 49 64 78 20 26 26   if( pVtabIdx &&
1ca10 20 70 56 74 61 62 49 64 78 2d 3e 6f 72 64 65 72   pVtabIdx->order
1ca20 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20  ByConsumed ){.  
1ca30 20 20 20 20 20 20 20 20 73 43 6f 73 74 2e 70 6c          sCost.pl
1ca40 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  an.wsFlags = WHE
1ca50 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
1ca60 7c 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b  | WHERE_ORDERBY;
1ca70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ca80 20 20 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e 45     sCost.plan.nE
1ca90 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f  q = 0;.        /
1caa0 2a 20 28 64 6f 75 62 6c 65 29 32 20 49 6e 20 63  * (double)2 In c
1cab0 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  ase of SQLITE_OM
1cac0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1cad0 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  T... */.        
1cae0 69 66 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f  if( (SQLITE_BIG_
1caf0 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29  DBL/((double)2))
1cb00 3c 73 43 6f 73 74 2e 72 43 6f 73 74 20 29 7b 0a  <sCost.rCost ){.
1cb10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1cb20 20 63 6f 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c   cost is not all
1cb30 6f 77 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65  owed to be large
1cb40 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 49  r than SQLITE_BI
1cb50 47 5f 44 42 4c 20 28 74 68 65 0a 20 20 20 20 20  G_DBL (the.     
1cb60 20 20 20 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76       ** inital v
1cb70 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f  alue of lowestCo
1cb80 73 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e  st in this loop.
1cb90 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 0a   If it is, then.
1cba0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1cbb0 20 28 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73   (cost<lowestCos
1cbc0 74 29 20 74 65 73 74 20 62 65 6c 6f 77 20 77 69  t) test below wi
1cbd0 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75 65  ll never be true
1cbe0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a  ..          */ .
1cbf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 64 6f            /* (do
1cc00 75 62 6c 65 29 32 20 49 6e 20 63 61 73 65 20 6f  uble)2 In case o
1cc10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1cc20 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20  OATING_POINT... 
1cc30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 43 6f  */.          sCo
1cc40 73 74 2e 72 43 6f 73 74 20 3d 20 28 53 51 4c 49  st.rCost = (SQLI
1cc50 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75  TE_BIG_DBL/((dou
1cc60 62 6c 65 29 32 29 29 3b 0a 20 20 20 20 20 20 20  ble)2));.       
1cc70 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 0a   }.      }else .
1cc80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
1cc90 20 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78         bestIndex
1cca0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54  (pParse, pWC, pT
1ccb0 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79  abItem, notReady
1ccc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ccd0 20 20 20 20 28 69 3d 3d 30 20 26 26 20 70 70 4f      (i==0 && ppO
1cce0 72 64 65 72 42 79 29 20 3f 20 2a 70 70 4f 72 64  rderBy) ? *ppOrd
1ccf0 65 72 42 79 20 3a 20 30 2c 20 26 73 43 6f 73 74  erBy : 0, &sCost
1cd00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1cd10 20 69 66 28 20 6f 6e 63 65 3d 3d 30 20 7c 7c 20   if( once==0 || 
1cd20 73 43 6f 73 74 2e 72 43 6f 73 74 3c 62 65 73 74  sCost.rCost<best
1cd30 50 6c 61 6e 2e 72 43 6f 73 74 20 29 7b 0a 20 20  Plan.rCost ){.  
1cd40 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 31 3b 0a        once = 1;.
1cd50 20 20 20 20 20 20 20 20 62 65 73 74 50 6c 61 6e          bestPlan
1cd60 20 3d 20 73 43 6f 73 74 3b 0a 20 20 20 20 20 20   = sCost;.      
1cd70 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20    bestJ = j;.   
1cd80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
1cd90 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72  oNotReorder ) br
1cda0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  eak;.    }.    a
1cdb0 73 73 65 72 74 28 20 6f 6e 63 65 20 29 3b 0a 20  ssert( once );. 
1cdc0 20 20 20 61 73 73 65 72 74 28 20 6e 6f 74 52 65     assert( notRe
1cdd0 61 64 79 20 26 20 67 65 74 4d 61 73 6b 28 70 4d  ady & getMask(pM
1cde0 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
1cdf0 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73  ->a[bestJ].iCurs
1ce00 6f 72 29 20 29 3b 0a 20 20 20 20 57 48 45 52 45  or) );.    WHERE
1ce10 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69  TRACE(("*** Opti
1ce20 6d 69 7a 65 72 20 73 65 6c 65 63 74 73 20 74 61  mizer selects ta
1ce30 62 6c 65 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20  ble %d for loop 
1ce40 25 64 5c 6e 22 2c 20 62 65 73 74 4a 2c 0a 20 20  %d\n", bestJ,.  
1ce50 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d           pLevel-
1ce60 70 57 49 6e 66 6f 2d 3e 61 29 29 3b 0a 20 20 20  pWInfo->a));.   
1ce70 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70   if( (bestPlan.p
1ce80 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1ce90 45 52 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20  ERE_ORDERBY)!=0 
1cea0 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65  ){.      *ppOrde
1ceb0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  rBy = 0;.    }. 
1cec0 20 20 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62     andFlags &= b
1ced0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
1cee0 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
1cef0 2d 3e 70 6c 61 6e 20 3d 20 62 65 73 74 50 6c 61  ->plan = bestPla
1cf00 6e 2e 70 6c 61 6e 3b 0a 20 20 20 20 69 66 28 20  n.plan;.    if( 
1cf10 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
1cf20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1cf30 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 70  DEXED ){.      p
1cf40 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
1cf50 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1cf60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cf70 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
1cf80 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  r = -1;.    }.  
1cf90 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67    notReady &= ~g
1cfa0 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
1cfb0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
1cfc0 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  tJ].iCursor);.  
1cfd0 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20    pLevel->iFrom 
1cfe0 3d 20 28 75 38 29 62 65 73 74 4a 3b 0a 0a 20 20  = (u8)bestJ;..  
1cff0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1d000 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  if the table sca
1d010 6e 6e 65 64 20 62 79 20 74 68 69 73 20 6c 6f 6f  nned by this loo
1d020 70 20 69 74 65 72 61 74 69 6f 6e 20 68 61 64 20  p iteration had 
1d030 61 6e 0a 20 20 20 20 2a 2a 20 49 4e 44 45 58 45  an.    ** INDEXE
1d040 44 20 42 59 20 63 6c 61 75 73 65 20 61 74 74 61  D BY clause atta
1d050 63 68 65 64 20 74 6f 20 69 74 2c 20 74 68 61 74  ched to it, that
1d060 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
1d070 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a   is being.    **
1d080 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 73 63   used for the sc
1d090 61 6e 2e 20 49 66 20 6e 6f 74 2c 20 74 68 65 6e  an. If not, then
1d0a0 20 71 75 65 72 79 20 63 6f 6d 70 69 6c 61 74 69   query compilati
1d0b0 6f 6e 20 68 61 73 20 66 61 69 6c 65 64 2e 0a 20  on has failed.. 
1d0c0 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20     ** Return an 
1d0d0 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
1d0e0 20 20 70 49 64 78 20 3d 20 70 54 61 62 4c 69 73    pIdx = pTabLis
1d0f0 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 49 6e 64  t->a[bestJ].pInd
1d100 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  ex;.    if( pIdx
1d110 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 62   ){.      if( (b
1d120 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
1d130 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
1d140 45 58 45 44 29 3d 3d 30 20 29 7b 0a 20 20 20 20  EXED)==0 ){.    
1d150 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1d160 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
1d170 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 3a 20 25  not use index: %
1d180 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
1d190 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77  ;.        goto w
1d1a0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
1d1b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d1c0 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 49 4e       /* If an IN
1d1d0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
1d1e0 69 73 20 75 73 65 64 2c 20 74 68 65 20 62 65 73  is used, the bes
1d1f0 74 49 6e 64 65 78 28 29 20 66 75 6e 63 74 69 6f  tIndex() functio
1d200 6e 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  n is.        ** 
1d210 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
1d220 6e 64 20 74 68 65 20 69 6e 64 65 78 20 73 70 65  nd the index spe
1d230 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 49 4e  cified in the IN
1d240 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 0a  DEXED BY clause.
1d250 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 69 74          ** if it
1d260 20 66 69 6e 64 20 61 6e 20 69 6e 64 65 78 20 61   find an index a
1d270 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  t all. */.      
1d280 20 20 61 73 73 65 72 74 28 20 62 65 73 74 50 6c    assert( bestPl
1d290 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d  an.plan.u.pIdx==
1d2a0 70 49 64 78 20 29 3b 0a 20 20 20 20 20 20 7d 0a  pIdx );.      }.
1d2b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52      }.  }.  WHER
1d2c0 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74  ETRACE(("*** Opt
1d2d0 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
1d2e0 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20  ***\n"));.  if( 
1d2f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d300 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
1d310 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
1d320 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  }..  /* If the t
1d330 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20  otal query only 
1d340 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67 6c 65  selects a single
1d350 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65 20 4f   row, then the O
1d360 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61  RDER BY.  ** cla
1d370 75 73 65 20 69 73 20 69 72 72 65 6c 65 76 61 6e  use is irrelevan
1d380 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 61  t..  */.  if( (a
1d390 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ndFlags & WHERE_
1d3a0 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20 70 70  UNIQUE)!=0 && pp
1d3b0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2a  OrderBy ){.    *
1d3c0 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  ppOrderBy = 0;. 
1d3d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1d3e0 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44  caller is an UPD
1d3f0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
1d400 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
1d410 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20  requesting.  ** 
1d420 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73  to use a one-pas
1d430 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74  s algorithm, det
1d440 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69  ermine if this i
1d450 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20  s appropriate.. 
1d460 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73 73   ** The one-pass
1d470 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20   algorithm only 
1d480 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48 45  works if the WHE
1d490 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
1d4a0 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20 73  aints.  ** the s
1d4b0 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61  tatement to upda
1d4c0 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e  te a single row.
1d4d0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1d4e0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
1d4f0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
1d500 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
1d510 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
1d520 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
1d530 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
1d540 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 26 26  S_DESIRED)!=0 &&
1d550 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45   (andFlags & WHE
1d560 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b  RE_UNIQUE)!=0 ){
1d570 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  .    pWInfo->okO
1d580 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20  nePass = 1;.    
1d590 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c 61  pWInfo->a[0].pla
1d5a0 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48  n.wsFlags &= ~WH
1d5b0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
1d5c0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c  }..  /* Open all
1d5d0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
1d5e0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20  TabList and any 
1d5f0 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64  indices selected
1d600 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68   for.  ** search
1d610 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73  ing those tables
1d620 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1d630 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
1d640 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a  (pParse, -1); /*
1d650 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b   Insert the cook
1d660 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f  ie verifier Goto
1d670 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
1d680 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
1d690 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1d6a0 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
1d6b0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1d6c0 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
1d6d0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
1d6e0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
1d6f0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
1d700 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1d710 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a   table/index */.
1d720 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d730 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20  OMIT_EXPLAIN.   
1d740 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
1d750 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20  lain==2 ){.     
1d760 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20   char *zMsg;.   
1d770 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1d780 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1d790 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
1d7a0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
1d7b0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1d7c0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 54 41  3MPrintf(db, "TA
1d7d0 42 4c 45 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  BLE %s", pItem->
1d7e0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
1d7f0 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
1d800 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
1d810 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1d820 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1d830 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  AS %s", zMsg, pI
1d840 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1d850 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1d860 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
1d870 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1d880 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20  DEXED)!=0 ){.   
1d890 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1d8a0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1d8b0 7a 4d 73 67 2c 20 22 25 73 20 57 49 54 48 20 49  zMsg, "%s WITH I
1d8c0 4e 44 45 58 20 25 73 22 2c 0a 20 20 20 20 20 20  NDEX %s",.      
1d8d0 20 20 20 20 20 7a 4d 73 67 2c 20 70 4c 65 76 65       zMsg, pLeve
1d8e0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
1d8f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  zName);.      }e
1d900 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
1d910 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1d920 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b  HERE_MULTI_OR ){
1d930 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
1d940 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1d950 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49  db, zMsg, "%s VI
1d960 41 20 4d 55 4c 54 49 2d 49 4e 44 45 58 20 55 4e  A MULTI-INDEX UN
1d970 49 4f 4e 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  ION", zMsg);.   
1d980 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
1d990 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1d9a0 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44  s & (WHERE_ROWID
1d9b0 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
1d9c0 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20  RANGE) ){.      
1d9d0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1d9e0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1d9f0 67 2c 20 22 25 73 20 55 53 49 4e 47 20 50 52 49  g, "%s USING PRI
1da00 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29  MARY KEY", zMsg)
1da10 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
1da20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1da30 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
1da40 20 65 6c 73 65 20 69 66 28 20 28 70 4c 65 76 65   else if( (pLeve
1da50 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1da60 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1da70 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
1da80 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
1da90 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78  x_info *pVtabIdx
1daa0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
1dab0 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20  u.pVtabIdx;.    
1dac0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1dad0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1dae0 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c  Msg, "%s VIRTUAL
1daf0 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a   TABLE INDEX %d:
1db00 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20  %s", zMsg,.     
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1db20 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c  VtabIdx->idxNum,
1db30 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74   pVtabIdx->idxSt
1db40 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  r);.      }.#end
1db50 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  if.      if( pLe
1db60 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1db70 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
1db80 59 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  Y ){.        zMs
1db90 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1dba0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1dbb0 73 20 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d 73  s ORDER BY", zMs
1dbc0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1dbd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dbe0 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
1dbf0 6e 2c 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  n, i, pLevel->iF
1dc00 72 6f 6d 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  rom, 0, zMsg, P4
1dc10 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
1dc20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1dc30 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
1dc40 2f 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  /.    pTabItem =
1dc50 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
1dc60 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
1dc70 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65    pTab = pTabIte
1dc80 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62  m->pTab;.    iDb
1dc90 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1dca0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
1dcb0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1dcc0 61 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  a);.    if( (pTa
1dcd0 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
1dce0 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c  _Ephemeral)!=0 |
1dcf0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
1dd00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e  ) continue;.#ifn
1dd10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1dd20 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
1dd30 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
1dd40 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1dd50 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1dd60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  !=0 ){.      int
1dd70 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
1dd80 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
1dd90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dda0 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20  p4(v, OP_VOpen, 
1ddb0 69 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  iCur, 0, 0,.    
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
1dde0 29 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 50 34  )pTab->pVtab, P4
1ddf0 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
1de00 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
1de10 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
1de20 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1de30 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
1de40 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
1de50 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
1de60 5f 4f 50 45 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  _OPEN)==0 ){.   
1de70 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e     int op = pWIn
1de80 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20  fo->okOnePass ? 
1de90 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f  OP_OpenWrite : O
1dea0 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
1deb0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
1dec0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  le(pParse, pTabI
1ded0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44  tem->iCursor, iD
1dee0 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20  b, pTab, op);.  
1def0 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
1df00 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
1df10 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a  ab->nCol<BMS ){.
1df20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
1df30 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
1df40 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
1df50 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
1df60 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
1df70 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
1df80 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1df90 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33  ngeP4(v, sqlite3
1dfa0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1dfb0 76 29 2d 31 2c 20 28 63 68 61 72 2a 29 6e 2c 20  v)-1, (char*)n, 
1dfc0 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20  P4_INT32);.     
1dfd0 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54     assert( n<=pT
1dfe0 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
1dff0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1e000 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
1e010 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
1e020 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
1e030 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
1e040 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
1e050 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61 62  ->iTabCur = pTab
1e060 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
1e070 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
1e080 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1e090 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
1e0a0 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
1e0b0 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  *pIx = pLevel->p
1e0c0 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20  lan.u.pIdx;.    
1e0d0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
1e0e0 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
1e0f0 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
1e100 78 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  x);.      int iI
1e110 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
1e120 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 61  iIdxCur;.      a
1e130 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
1e140 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
1e150 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ma );.      asse
1e160 72 74 28 20 69 49 64 78 43 75 72 3e 3d 30 20 29  rt( iIdxCur>=0 )
1e170 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e180 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1e190 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75  OpenRead, iIdxCu
1e1a0 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44  r, pIx->tnum, iD
1e1b0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1e1c0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1e1d0 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
1e1e0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
1e1f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1e200 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
1e210 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ame));.    }.   
1e220 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1e230 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
1e240 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49   iDb);.  }.  pWI
1e250 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69  nfo->iTop = sqli
1e260 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1e270 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  dr(v);..  /* Gen
1e280 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
1e290 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
1e2a0 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
1e2b0 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
1e2c0 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
1e2d0 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
1e2e0 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
1e2f0 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
1e300 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
1e310 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
1e320 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
1e330 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
1e340 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
1e350 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64    notReady = cod
1e360 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57  eOneLoopStart(pW
1e370 49 6e 66 6f 2c 20 69 2c 20 77 63 74 72 6c 46 6c  Info, i, wctrlFl
1e380 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a  ags, notReady);.
1e390 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
1e3a0 74 69 6e 75 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  tinue = pWInfo->
1e3b0 61 5b 69 5d 2e 61 64 64 72 43 6f 6e 74 3b 0a 20  a[i].addrCont;. 
1e3c0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1e3d0 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72 20 74  E_TEST  /* For t
1e3e0 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
1e3f0 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f  ging use only */
1e400 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20  .  /* Record in 
1e410 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69  the query plan i
1e420 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
1e430 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
1e440 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  le.  ** and the 
1e450 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63  index used to ac
1e460 63 65 73 73 20 69 74 20 28 69 66 20 61 6e 79 29  cess it (if any)
1e470 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
1e480 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e  itself.  ** is n
1e490 6f 74 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d  ot used, its nam
1e4a0 65 20 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20  e is just '{}'. 
1e4b0 20 49 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20   If no index is 
1e4c0 75 73 65 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e  used.  ** the in
1e4d0 64 65 78 20 69 73 20 6c 69 73 74 65 64 20 61 73  dex is listed as
1e4e0 20 22 7b 7d 22 2e 20 20 49 66 20 74 68 65 20 70   "{}".  If the p
1e4f0 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73  rimary key is us
1e500 65 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  ed the.  ** inde
1e510 78 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20  x name is '*'.. 
1e520 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1e530 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1e540 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
1e550 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  *z;.    int n;. 
1e560 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
1e570 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70  nfo->a[i];.    p
1e580 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
1e590 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
1e5a0 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70  From];.    z = p
1e5b0 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b  TabItem->zAlias;
1e5c0 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
1e5d0 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  z = pTabItem->pT
1e5e0 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  ab->zName;.    n
1e5f0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1e600 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e  30(z);.    if( n
1e610 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
1e620 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
1e630 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20  lan)-10 ){.     
1e640 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
1e650 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1e660 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20  E_IDX_ONLY ){.  
1e670 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
1e680 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
1e690 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20  [nQPlan], "{}", 
1e6a0 32 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  2);.        nQPl
1e6b0 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d  an += 2;.      }
1e6c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
1e6d0 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
1e6e0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
1e6f0 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  , z, n);.       
1e700 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
1e710 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1e720 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
1e730 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a  QPlan++] = ' ';.
1e740 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
1e750 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  se( pLevel->plan
1e760 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1e770 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a 20 20 20  _ROWID_EQ );.   
1e780 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65   testcase( pLeve
1e790 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1e7a0 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  & WHERE_ROWID_RA
1e7b0 4e 47 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70  NGE );.    if( p
1e7c0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1e7d0 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57  ags & (WHERE_ROW
1e7e0 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
1e7f0 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20  D_RANGE) ){.    
1e800 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
1e810 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
1e820 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a  lan], "* ", 2);.
1e830 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
1e840 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
1e850 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
1e860 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1e870 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20  NDEXED)!=0 ){.  
1e880 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
1e890 74 72 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e  trlen30(pLevel->
1e8a0 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61  plan.u.pIdx->zNa
1e8b0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  me);.      if( n
1e8c0 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
1e8d0 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
1e8e0 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20  lan)-2 ){.      
1e8f0 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
1e900 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
1e910 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c  lan], pLevel->pl
1e920 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
1e930 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , n);.        nQ
1e940 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
1e950 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79     sqlite3_query
1e960 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20  _plan[nQPlan++] 
1e970 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20  = ' ';.      }. 
1e980 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e990 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
1e9a0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
1e9b0 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20  n], "{} ", 3);. 
1e9c0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33       nQPlan += 3
1e9d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  ;.    }.  }.  wh
1e9e0 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26  ile( nQPlan>0 &&
1e9f0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
1ea00 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27  lan[nQPlan-1]=='
1ea10 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   ' ){.    sqlite
1ea20 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e  3_query_plan[--n
1ea30 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  QPlan] = 0;.  }.
1ea40 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
1ea50 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30  plan[nQPlan] = 0
1ea60 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a  ;.  nQPlan = 0;.
1ea70 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1ea80 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67  _TEST // Testing
1ea90 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
1eaa0 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a  se only */..  /*
1eab0 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74   Record the cont
1eac0 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73  inuation address
1ead0 20 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66   in the WhereInf
1eae0 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
1eaf0 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70  en.  ** clean up
1eb00 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
1eb10 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  /.  return pWInf
1eb20 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  o;..  /* Jump he
1eb30 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  re if malloc fai
1eb40 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e  ls */.whereBegin
1eb50 45 72 72 6f 72 3a 0a 20 20 77 68 65 72 65 49 6e  Error:.  whereIn
1eb60 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
1eb70 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  o);.  return 0;.
1eb80 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1eb90 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
1eba0 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65   WHERE loop.  Se
1ebb0 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a  e comments on .*
1ebc0 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
1ebd0 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69  gin() for additi
1ebe0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1ebf0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ec00 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49  3WhereEnd(WhereI
1ec10 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
1ec20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1ec30 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1ec40 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1ec50 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1ec60 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
1ec70 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c   *pLevel;.  SrcL
1ec80 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
1ec90 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1eca0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1ecb0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
1ecc0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f   /* Generate loo
1ecd0 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  p termination co
1ece0 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  de..  */.  sqlit
1ecf0 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d  e3ExprClearColum
1ed00 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 2d  nCache(pParse, -
1ed10 31 29 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62  1);.  for(i=pTab
1ed20 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  List->nSrc-1; i>
1ed30 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c  =0; i--){.    pL
1ed40 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
1ed50 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  a[i];.    sqlite
1ed60 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1ed70 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
1ed80 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  rCont);.    if( 
1ed90 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e  pLevel->op!=OP_N
1eda0 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
1edb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1edc0 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c  , pLevel->op, pL
1edd0 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
1ede0 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ->p2);.      sql
1edf0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1ee00 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b  (v, pLevel->p5);
1ee10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1ee20 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1ee30 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
1ee40 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75  BLE && pLevel->u
1ee50 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  .in.nIn>0 ){.   
1ee60 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
1ee70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74   *pIn;.      int
1ee80 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
1ee90 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1eea0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
1eeb0 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  rNxt);.      for
1eec0 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  (j=pLevel->u.in.
1eed0 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c  nIn, pIn=&pLevel
1eee0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a  ->u.in.aInLoop[j
1eef0 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  -1]; j>0; j--, p
1ef00 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73  In--){.        s
1ef10 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1ef20 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
1ef30 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20  nTop+1);.       
1ef40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ef50 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
1ef60 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61  In->iCur, pIn->a
1ef70 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20  ddrInTop);.     
1ef80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1ef90 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
1efa0 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20  ddrInTop-1);.   
1efb0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1efc0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65  e3DbFree(db, pLe
1efd0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
1efe0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
1eff0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1f000 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
1f010 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69  >addrBrk);.    i
1f020 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
1f030 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  Join ){.      in
1f040 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64  t addr;.      ad
1f050 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1f060 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
1f070 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  os, pLevel->iLef
1f080 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 73 71  tJoin);.      sq
1f090 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1f0a0 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
1f0b0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
1f0c0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
1f0d0 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
1f0e0 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
1f0f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f100 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
1f110 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
1f120 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f130 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f140 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1f150 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
1f160 72 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rst);.      sqli
1f170 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1f180 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a  v, addr);.    }.
1f190 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62    }..  /* The "b
1f1a0 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68  reak" point is h
1f1b0 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74  ere, just past t
1f1c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75  he end of the ou
1f1d0 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53  ter loop..  ** S
1f1e0 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  et it..  */.  sq
1f1f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1f200 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d  Label(v, pWInfo-
1f210 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20  >iBreak);..  /* 
1f220 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  Close all of the
1f230 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65   cursors that we
1f240 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c  re opened by sql
1f250 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a  ite3WhereBegin..
1f260 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
1f270 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
1f280 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
1f290 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  rc; i++, pLevel+
1f2a0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
1f2b0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
1f2c0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
1f2d0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1f2e0 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  om];.    Table *
1f2f0 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
1f300 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
1f310 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
1f320 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
1f330 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
1f340 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62  eral)!=0 || pTab
1f350 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74  ->pSelect ) cont
1f360 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
1f370 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1f380 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 43  s & WHERE_OMIT_C
1f390 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LOSE)==0 ){.    
1f3a0 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
1f3b0 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 70 4c 65  kOnePass && (pLe
1f3c0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1f3d0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
1f3e0 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
1f3f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f400 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
1f410 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
1f420 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
1f430 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
1f440 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1f450 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
1f460 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f470 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1f480 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65   OP_Close, pLeve
1f490 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
1f4a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1f4b0 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20  /* If this scan 
1f4c0 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d  uses an index, m
1f4d0 61 6b 65 20 63 6f 64 65 20 73 75 62 73 74 69 74  ake code substit
1f4e0 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64  utions to read d
1f4f0 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ata.    ** from 
1f500 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 72 65  the index in pre
1f510 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 74  ference to the t
1f520 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c  able. Sometimes,
1f530 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   this means.    
1f540 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65  ** the table nee
1f550 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1f560 66 72 6f 6d 2e 20 54 68 69 73 20 69 73 20 61 20  from. This is a 
1f570 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
1f580 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65  t,.    ** as the
1f590 20 76 64 62 65 20 6c 65 76 65 6c 20 77 61 69 74   vdbe level wait
1f5a0 73 20 75 6e 74 69 6c 20 74 68 65 20 74 61 62 6c  s until the tabl
1f5b0 65 20 69 73 20 72 65 61 64 20 62 65 66 6f 72 65  e is read before
1f5c0 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
1f5d0 20 73 65 65 6b 69 6e 67 20 74 68 65 20 74 61 62   seeking the tab
1f5e0 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  le cursor to the
1f5f0 20 72 65 63 6f 72 64 20 63 6f 72 72 65 73 70 6f   record correspo
1f600 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  nding to the cur
1f610 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69  rent.    ** posi
1f620 74 69 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64 65  tion in the inde
1f630 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  x..    ** .    *
1f640 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63  * Calls to the c
1f650 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
1f660 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33   between sqlite3
1f670 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20  WhereBegin and. 
1f680 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65     ** sqlite3Whe
1f690 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20  reEnd will have 
1f6a0 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61  created code tha
1f6b0 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65  t references the
1f6c0 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69   table.    ** di
1f6d0 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f  rectly.  This lo
1f6e0 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61  op scans all tha
1f6f0 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66  t code looking f
1f700 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a  or opcodes.    *
1f710 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  * that reference
1f720 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63   the table and c
1f730 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74  onverts them int
1f740 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20  o opcodes that. 
1f750 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20     ** reference 
1f760 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
1f770 2f 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  /.    if( (pLeve
1f780 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1f790 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
1f7a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  !=0 ){.      int
1f7b0 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20   k, j, last;.   
1f7c0 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
1f7d0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
1f7e0 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
1f7f0 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 69  .u.pIdx;.      i
1f800 6e 74 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20  nt useIndexOnly 
1f810 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  = pLevel->plan.w
1f820 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1f830 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 20 20 20 20  DX_ONLY;..      
1f840 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
1f850 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  );.      pOp = s
1f860 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
1f870 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29  v, pWInfo->iTop)
1f880 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73  ;.      last = s
1f890 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1f8a0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
1f8b0 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54  for(k=pWInfo->iT
1f8c0 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c  op; k<last; k++,
1f8d0 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pOp++){.       
1f8e0 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c   if( pOp->p1!=pL
1f8f0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20  evel->iTabCur ) 
1f900 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f910 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
1f920 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a  e==OP_Column ){.
1f930 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
1f940 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
1f950 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
1f960 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
1f970 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  2==pIdx->aiColum
1f980 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[j] ){.        
1f990 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
1f9a0 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
1f9b0 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
1f9c0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
1f9d0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1f9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f9f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fa00 20 20 20 20 20 61 73 73 65 72 74 28 21 75 73 65       assert(!use
1fa10 49 6e 64 65 78 4f 6e 6c 79 20 7c 7c 20 6a 3c 70  IndexOnly || j<p
1fa20 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
1fa30 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1fa40 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
1fa50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
1fa60 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
1fa70 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
1fa80 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
1fa90 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77  code = OP_IdxRow
1faa0 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  id;.        }els
1fab0 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
1fac0 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 26 26  e==OP_NullRow &&
1fad0 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 29 7b   useIndexOnly ){
1fae0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
1faf0 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
1fb00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fb10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1fb20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75   /* Final cleanu
1fb30 70 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 49 6e  p.  */.  whereIn
1fb40 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
1fb50 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  o);.  return;.}.