/ Hex Artifact Content
Login

Artifact 48249767437bfbacbd3488270449240b9bfd05c4:


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 36  : where.c,v 1.36
0340: 35 20 32 30 30 39 2f 30 31 2f 32 34 20 30 39 3a  5 2009/01/24 09:
0350: 35 36 3a 31 35 20 64 61 6e 69 65 6c 6b 31 39 37  56:15 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 6d 61 73 6b 20 7c 3d  Left);.  mask |=
4200: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4210: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
4220: 3e 70 4c 69 73 74 29 3b 0a 20 20 6d 61 73 6b 20  >pList);.  mask 
4230: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
4240: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4250: 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  , p->pSelect);. 
4260: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
4270: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
4280: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
4290: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  e(WhereMaskSet *
42a0: 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69  pMaskSet, ExprLi
42b0: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
42c0: 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  t i;.  Bitmask m
42d0: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
42e0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
42f0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
4300: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
4310: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
4320: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4330: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
4340: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
4350: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
4360: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
4370: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
4380: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
4390: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c  t *pMaskSet, Sel
43a0: 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d  ect *pS){.  Bitm
43b0: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
43c0: 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20  while( pS ){.   
43d0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
43e0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
43f0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
4400: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
4410: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
4420: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
4430: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
4440: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
4450: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4460: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
4470: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
4480: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
4490: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
44a0: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
44b0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
44c0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
44d0: 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 53 20 3d  aving);.    pS =
44e0: 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d   pS->pPrior;.  }
44f0: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
4500: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4510: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
4520: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e  n operator is on
4530: 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
4540: 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c  rs that is.** al
4550: 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64  lowed for an ind
4560: 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61  exable WHERE cla
4570: 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61  use term.  The a
4580: 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73  llowed operators
4590: 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22   are.** "=", "<"
45a0: 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d  , ">", "<=", ">=
45b0: 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a  ", and "IN"..*/.
45c0: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77  static int allow
45d0: 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20  edOp(int op){.  
45e0: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
45f0: 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f  _EQ && TK_GT<TK_
4600: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
4610: 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LT>TK_EQ && T
4620: 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LT<TK_GE );.  
4630: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b  assert( TK_LE>TK
4640: 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f  _EQ && TK_LE<TK_
4650: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
4660: 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29  TK_GE==TK_EQ+4 )
4670: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54  ;.  return op==T
4680: 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f  K_IN || (op>=TK_
4690: 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29  EQ && op<=TK_GE)
46a0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c   || op==TK_ISNUL
46b0: 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  L;.}../*.** Swap
46c0: 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20   two objects of 
46d0: 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 64  type TYPE..*/.#d
46e0: 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c  efine SWAP(TYPE,
46f0: 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20  A,B) {TYPE t=A; 
4700: 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a  A=B; B=t;}../*.*
4710: 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70  * Commute a comp
4720: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
4730: 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66    Expressions of
4740: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20   the form "X op 
4750: 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72  Y".** are conver
4760: 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58  ted into "Y op X
4770: 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 6f  "..**.** If a co
4780: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
4790: 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77   is associated w
47a0: 69 74 68 20 65 69 74 68 65 72 20 74 68 65 20 6c  ith either the l
47b0: 65 66 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a 20  eft or right.** 
47c0: 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  side of the comp
47d0: 61 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69  arison, it remai
47e0: 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ns associated wi
47f0: 74 68 20 74 68 65 20 73 61 6d 65 20 73 69 64 65  th the same side
4800: 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f   after.** the co
4810: 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59  mmutation. So "Y
4820: 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20   collate NOCASE 
4830: 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a  op X" becomes .*
4840: 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f 43  * "X collate NOC
4850: 41 53 45 20 6f 70 20 59 22 2e 20 54 68 69 73 20  ASE op Y". This 
4860: 69 73 20 62 65 63 61 75 73 65 20 61 6e 79 20 63  is because any c
4870: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
4880: 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74  e on.** the left
4890: 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20   hand side of a 
48a0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72  comparison overr
48b0: 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69  ides any collati
48c0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20  on sequence .** 
48d0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
48e0: 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73  right. For the s
48f0: 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45  ame reason the E
4900: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c 61  P_ExpCollate fla
4910: 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d  g.** is not comm
4920: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
4930: 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65  void exprCommute
4940: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4950: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
4960: 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28  u16 expRight = (
4970: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
4980: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
4990: 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70  late);.  u16 exp
49a0: 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  Left = (pExpr->p
49b0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
49c0: 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20  _ExpCollate);.  
49d0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
49e0: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
49f0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
4a00: 20 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69   );.  pExpr->pRi
4a10: 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  ght->pColl = sql
4a20: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
4a30: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
4a40: 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d  Right);.  pExpr-
4a50: 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 3d 20  >pLeft->pColl = 
4a60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
4a70: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
4a80: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 53 57 41 50  ->pLeft);.  SWAP
4a90: 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d  (CollSeq*,pExpr-
4aa0: 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70  >pRight->pColl,p
4ab0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f  Expr->pLeft->pCo
4ac0: 6c 6c 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  ll);.  pExpr->pR
4ad0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70  ight->flags = (p
4ae0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
4af0: 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c  ags & ~EP_ExpCol
4b00: 6c 61 74 65 29 20 7c 20 65 78 70 4c 65 66 74 3b  late) | expLeft;
4b10: 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  .  pExpr->pLeft-
4b20: 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d  >flags = (pExpr-
4b30: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  >pLeft->flags & 
4b40: 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20  ~EP_ExpCollate) 
4b50: 7c 20 65 78 70 52 69 67 68 74 3b 0a 20 20 53 57  | expRight;.  SW
4b60: 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e  AP(Expr*,pExpr->
4b70: 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c  pRight,pExpr->pL
4b80: 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70  eft);.  if( pExp
4b90: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a  r->op>=TK_GT ){.
4ba0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
4bb0: 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20  T==TK_GT+2 );.  
4bc0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
4bd0: 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20  =TK_LE+2 );.    
4be0: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
4bf0: 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
4c00: 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29  t( TK_GT<TK_LE )
4c10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
4c20: 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26  xpr->op>=TK_GT &
4c30: 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f  & pExpr->op<=TK_
4c40: 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  GE );.    pExpr-
4c50: 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f  >op = ((pExpr->o
4c60: 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47  p-TK_GT)^2)+TK_G
4c70: 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  T;.  }.}../*.** 
4c80: 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54  Translate from T
4c90: 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f  K_xx operator to
4ca0: 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a   WO_xx bitmask..
4cb0: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70  */.static u16 op
4cc0: 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f  eratorMask(int o
4cd0: 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61  p){.  u16 c;.  a
4ce0: 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70  ssert( allowedOp
4cf0: 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70  (op) );.  if( op
4d00: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63  ==TK_IN ){.    c
4d10: 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73   = WO_IN;.  }els
4d20: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  e if( op==TK_ISN
4d30: 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57  ULL ){.    c = W
4d40: 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73  O_ISNULL;.  }els
4d50: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e{.    assert( (
4d60: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
4d70: 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20  )) < 0x7fff );. 
4d80: 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f     c = (u16)(WO_
4d90: 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b  EQ<<(op-TK_EQ));
4da0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
4db0: 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
4dc0: 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a  c==WO_ISNULL );.
4dd0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
4de0: 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20  _IN || c==WO_IN 
4df0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
4e00: 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_EQ || c==WO_
4e10: 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
4e20: 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d  op!=TK_LT || c==
4e30: 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_LT );.  asser
4e40: 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  t( op!=TK_LE || 
4e50: 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73  c==WO_LE );.  as
4e60: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20  sert( op!=TK_GT 
4e70: 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20  || c==WO_GT );. 
4e80: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
4e90: 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29  GE || c==WO_GE )
4ea0: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
4eb0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
4ec0: 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  r a term in the 
4ed0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
4ee0: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
4ef0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
4f00: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
4f10: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
4f20: 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  e iColumn of tab
4f30: 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e  le iCur and <op>
4f40: 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68   is one of.** th
4f50: 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72  e WO_xx operator
4f60: 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64   codes specified
4f70: 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d   by the op param
4f80: 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  eter..** Return 
4f90: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
4fa0: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
4fb0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
4fc0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
4fd0: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
4fe0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4ff0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
5000: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
5010: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
5020: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
5030: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
5040: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
5050: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
5060: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
5070: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
5080: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
5090: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
50a0: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
50b0: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
50c0: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20   */.  u32 op,   
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
50e0: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
50f0: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
5100: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
5110: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
5120: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
5130: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
5140: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
5150: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
5160: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
5170: 20 20 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65 72    int k;.  asser
5180: 74 28 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20 20  t( iCur>=0 );.  
5190: 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20 20  op &= WO_ALL;.  
51a0: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
51b0: 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , k=pWC->nTerm; 
51c0: 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  k; k--, pTerm++)
51d0: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
51e0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
51f0: 72 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65  r.       && (pTe
5200: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
5210: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20  & notReady)==0. 
5220: 20 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e        && pTerm->
5230: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43  u.leftColumn==iC
5240: 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 26 26 20  olumn.       && 
5250: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
5260: 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20 29  r & op)!=0.    )
5270: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  {.      if( pIdx
5280: 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72   && pTerm->eOper
5290: 61 74 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20  ator!=WO_ISNULL 
52a0: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
52b0: 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
52c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  pr;.        Coll
52d0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
52e0: 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 3b      char idxaff;
52f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
5300: 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70          Parse *p
5310: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
5320: 72 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 64  rse;..        id
5330: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
5340: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
5350: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
5360: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
5370: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
5380: 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 20 63  (pX, idxaff) ) c
5390: 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20  ontinue;..      
53a0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
53b0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
53c0: 71 75 65 6e 63 65 20 72 65 71 75 69 72 65 64 20  quence required 
53d0: 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f  from an index fo
53e0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  r.        ** it 
53f0: 74 6f 20 62 65 20 75 73 65 66 75 6c 20 66 6f 72  to be useful for
5400: 20 6f 70 74 69 6d 69 73 69 6e 67 20 65 78 70 72   optimising expr
5410: 65 73 73 69 6f 6e 20 70 58 2e 20 53 74 6f 72 65  ession pX. Store
5420: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
5430: 20 76 61 6c 75 65 20 69 6e 20 76 61 72 69 61 62   value in variab
5440: 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20 20  le pColl..      
5450: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
5460: 65 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  ert(pX->pLeft);.
5470: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
5480: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
5490: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
54a0: 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
54b0: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
54c0: 20 20 20 20 61 73 73 65 72 74 28 70 43 6f 6c 6c      assert(pColl
54d0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
54e0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28  );..        for(
54f0: 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c  j=0; pIdx->aiCol
5500: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
5510: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
5520: 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49   if( NEVER(j>=pI
5530: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72  dx->nColumn) ) r
5540: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
5550: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
5560: 43 6f 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 53  Coll && sqlite3S
5570: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
5580: 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ame, pIdx->azCol
5590: 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65  l[j]) ) continue
55a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
55b0: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
55c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
55d0: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
55e0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
55f0: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
5600: 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c  nalyze(SrcList*,
5610: 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69   WhereClause*, i
5620: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  nt);../*.** Call
5630: 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20   exprAnalyze on 
5640: 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57  all terms in a W
5650: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a  HERE clause.  .*
5660: 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
5670: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  oid exprAnalyzeA
5680: 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ll(.  SrcList *p
5690: 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  TabList,       /
56a0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
56b0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
56c0: 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20  se *pWC         
56d0: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
56e0: 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  use to be analyz
56f0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ed */.){.  int i
5700: 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  ;.  for(i=pWC->n
5710: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
5720: 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c  -){.    exprAnal
5730: 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57  yze(pTabList, pW
5740: 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  C, i);.  }.}..#i
5750: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5760: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
5770: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  ION./*.** Check 
5780: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
5790: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
57a0: 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  s a LIKE or GLOB
57b0: 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a   operator that.*
57c0: 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a  * can be optimiz
57d0: 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c  ed using inequal
57e0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
57f0: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
5800: 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64   it is.** so and
5810: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
5820: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f  *.** In order fo
5830: 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74  r the operator t
5840: 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65  o be optimizible
5850: 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62  , the RHS must b
5860: 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69  e a string.** li
5870: 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20  teral that does 
5880: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
5890: 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a   wildcard.  .*/.
58a0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b  static int isLik
58b0: 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65  eOrGlob(.  Parse
58c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
58d0: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
58e0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
58f0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
5900: 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65  Expr,      /* Te
5910: 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69  st this expressi
5920: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 50  on */.  int *pnP
5930: 61 74 74 65 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d  attern,   /* Num
5940: 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63  ber of non-wildc
5950: 61 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61  ard prefix chara
5960: 63 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  cters */.  int *
5970: 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20  pisComplete, /* 
5980: 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79  True if the only
5990: 20 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69   wildcard is % i
59a0: 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  n the last chara
59b0: 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  cter */.  int *p
59c0: 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54  noCase      /* T
59d0: 72 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65  rue if uppercase
59e0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
59f0: 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29  o lowercase */.)
5a00: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
5a10: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  z;             /
5a20: 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20  * String on RHS 
5a30: 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  of LIKE operator
5a40: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
5a50: 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  ht, *pLeft;     
5a60: 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65   /* Right and le
5a70: 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20  ft size of LIKE 
5a80: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78  operator */.  Ex
5a90: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
5aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
5ab0: 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20   of operands to 
5ac0: 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  the LIKE operato
5ad0: 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20  r */.  int c;   
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5af0: 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74    /* One charact
5b00: 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69  er in z[] */.  i
5b10: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
5b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5b30: 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63  ber of non-wildc
5b40: 61 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61  ard prefix chara
5b50: 63 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20  cters */.  char 
5b60: 77 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  wc[3];          
5b70: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
5b80: 64 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  d characters */.
5b90: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
5ba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
5bb0: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
5bc0: 63 65 20 66 6f 72 20 4c 48 53 20 2a 2f 0a 20 20  ce for LHS */.  
5bd0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5be0: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
5bf0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
5c00: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c  n */..  if( !sql
5c10: 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69  ite3IsLikeFuncti
5c20: 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e  on(db, pExpr, pn
5c30: 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20  oCase, wc) ){.  
5c40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5c50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42  #ifdef SQLITE_EB
5c60: 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43  CDIC.  if( *pnoC
5c70: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
5c80: 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d  #endif.  pList =
5c90: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
5ca0: 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d   pRight = pList-
5cb0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
5cc0: 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  f( pRight->op!=T
5cd0: 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20  K_STRING ){.    
5ce0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
5cf0: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
5d00: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
5d10: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
5d20: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74  OLUMN ){.    ret
5d30: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43 6f  urn 0;.  }.  pCo
5d40: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5d50: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5d60: 70 4c 65 66 74 29 3b 0a 20 20 61 73 73 65 72 74  pLeft);.  assert
5d70: 28 20 70 43 6f 6c 6c 21 3d 30 20 7c 7c 20 70 4c  ( pColl!=0 || pL
5d80: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31  eft->iColumn==-1
5d90: 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d   );.  if( pColl=
5da0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  =0 ){.    /* No 
5db0: 63 6f 6c 6c 61 74 69 6f 6e 20 69 73 20 64 65 66  collation is def
5dc0: 69 6e 65 64 20 66 6f 72 20 74 68 65 20 52 4f 57  ined for the ROW
5dd0: 49 44 2e 20 20 55 73 65 20 74 68 65 20 64 65 66  ID.  Use the def
5de0: 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 43 6f  ault. */.    pCo
5df0: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
5e00: 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  ll;.  }.  if( (p
5e10: 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49  Coll->type!=SQLI
5e20: 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20 7c  TE_COLL_BINARY |
5e30: 7c 20 2a 70 6e 6f 43 61 73 65 29 20 26 26 0a 20  | *pnoCase) &&. 
5e40: 20 20 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70       (pColl->typ
5e50: 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e  e!=SQLITE_COLL_N
5e60: 4f 43 41 53 45 20 7c 7c 20 21 2a 70 6e 6f 43 61  OCASE || !*pnoCa
5e70: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
5e80: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
5e90: 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 64 62  e3DequoteExpr(db
5ea0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7a 20 3d  , pRight);.  z =
5eb0: 20 28 63 68 61 72 20 2a 29 70 52 69 67 68 74 2d   (char *)pRight-
5ec0: 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 63 6e 74 20  >token.z;.  cnt 
5ed0: 3d 20 30 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a  = 0;.  if( z ){.
5ee0: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b      while( (c=z[
5ef0: 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77  cnt])!=0 && c!=w
5f00: 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d  c[0] && c!=wc[1]
5f10: 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 20   && c!=wc[2] ){ 
5f20: 63 6e 74 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69  cnt++; }.  }.  i
5f30: 66 28 20 63 6e 74 3d 3d 30 20 7c 7c 20 32 35 35  f( cnt==0 || 255
5f40: 3d 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29  ==(u8)z[cnt-1] )
5f50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5f60: 20 20 7d 0a 20 20 2a 70 69 73 43 6f 6d 70 6c 65    }.  *pisComple
5f70: 74 65 20 3d 20 7a 5b 63 6e 74 5d 3d 3d 77 63 5b  te = z[cnt]==wc[
5f80: 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d  0] && z[cnt+1]==
5f90: 30 3b 0a 20 20 2a 70 6e 50 61 74 74 65 72 6e 20  0;.  *pnPattern 
5fa0: 3d 20 63 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  = cnt;.  return 
5fb0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
5fc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
5fd0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
5fe0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5ff0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6000: 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  LE./*.** Check t
6010: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
6020: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
6030: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
6040: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  **         colum
6050: 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a  n MATCH expr.**.
6060: 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e  ** If it is then
6070: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49   return TRUE.  I
6080: 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41  f not, return FA
6090: 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LSE..*/.static i
60a0: 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  nt isMatchOfColu
60b0: 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70  mn(.  Expr *pExp
60c0: 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74  r      /* Test t
60d0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
60e0: 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
60f0: 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70  *pList;..  if( p
6100: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e  Expr->op!=TK_FUN
6110: 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74  CTION ){.    ret
6120: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
6130: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21   pExpr->token.n!
6140: 3d 35 20 7c 7c 0a 20 20 20 20 20 20 20 73 71 6c  =5 ||.       sql
6150: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 6f  ite3StrNICmp((co
6160: 6e 73 74 20 63 68 61 72 2a 29 70 45 78 70 72 2d  nst char*)pExpr-
6170: 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 74 63 68 22  >token.z,"match"
6180: 2c 35 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ,5)!=0 ){.    re
6190: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
61a0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
61b0: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  st;.  if( pList-
61c0: 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20  >nExpr!=2 ){.   
61d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
61e0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d   if( pList->a[1]
61f0: 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b  .pExpr->op != TK
6200: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
6210: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
6220: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
6230: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6240: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
6250: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
6260: 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  Base expression 
6270: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
6280: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
6290: 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69  ause of.** a joi
62a0: 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  n, then transfer
62b0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
62c0: 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74   markings over t
62d0: 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74  o derived..*/.st
62e0: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66  atic void transf
62f0: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45  erJoinMarkings(E
6300: 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45  xpr *pDerived, E
6310: 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70  xpr *pBase){.  p
6320: 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c  Derived->flags |
6330: 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26  = pBase->flags &
6340: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20   EP_FromJoin;.  
6350: 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74  pDerived->iRight
6360: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73  JoinTable = pBas
6370: 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
6380: 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  le;.}..#if !defi
6390: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
63a0: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
63b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
63c0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
63d0: 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  Y)./*.** Analyze
63e0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e   a term that con
63f0: 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20  sists of two or 
6400: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
6410: 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20  d.** subterms.  
6420: 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  So in:.**.**    
6430: 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35   ... WHERE  (a=5
6440: 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d  ) AND (b=7 OR c=
6450: 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28  9 OR d=13) AND (
6460: 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20  d=13).**        
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6480: 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e    ^^^^^^^^^^^^^^
6490: 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69  ^^^^^^.**.** Thi
64a0: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
64b0: 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73  es terms such as
64c0: 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d   the middle term
64d0: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78   in the above ex
64e0: 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72  ample..** A Wher
64f0: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  eOrTerm object i
6500: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61  s computed and a
6510: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
6520: 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61  erm under.** ana
6530: 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73  lysis, regardles
6540: 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
6550: 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
6560: 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20  .  Hence:.**.** 
6570: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74      WhereTerm.wt
6580: 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d  Flags   |=  TERM
6590: 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57  _ORINFO.**     W
65a0: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
65b0: 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63  fo  =  a dynamic
65c0: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
65d0: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
65e0: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  t.**.** The term
65f0: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
6600: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
6610: 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e   more of OR-conn
6620: 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a  ected subterms..
6630: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74  ** A single subt
6640: 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73  erm might be a s
6650: 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63  et of AND-connec
6660: 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73  ted sub-subterms
6670: 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66  ..** Examples of
6680: 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61   terms under ana
6690: 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lysis:.**.**    
66a0: 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (A)     t1.x=t2
66b0: 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20  .y OR t1.x=t2.z 
66c0: 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31  OR t1.y=15 OR t1
66d0: 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20  .z=t3.a+5.**    
66e0: 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31   (B)     x=expr1
66f0: 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78   OR expr2=x OR x
6700: 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43  =expr3.**     (C
6710: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
6720: 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e  OR (t1.x=t2.z AN
6730: 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20  D t1.y=15).**   
6740: 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72    (D)     x=expr
6750: 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79  1 OR (y>11 AND y
6760: 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27  <22 AND z LIKE '
6770: 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20  *hello*').**    
6780: 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20   (E)     (p.a=1 
6790: 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e  AND q.b=2 AND r.
67a0: 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41  c=3) OR (p.x=4 A
67b0: 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a  ND q.y=5 AND r.z
67c0: 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31  =6).**.** CASE 1
67d0: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
67e0: 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74  ubterms are of t
67f0: 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72  he form T.C=expr
6800: 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65   for some single
6810: 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20   column of C.** 
6820: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54  a single table T
6830: 20 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78   (as shown in ex
6840: 61 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74  ample B above) t
6850: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
6860: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d   virtual.** term
6870: 20 74 68 61 74 20 69 73 20 61 6e 20 65 71 75 69   that is an equi
6880: 76 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73  valent IN expres
6890: 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  sion.  In other 
68a0: 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74 65  words, if the te
68b0: 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c  rm.** being anal
68c0: 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  yzed is:.**.**  
68d0: 20 20 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f      x = expr1  O
68e0: 52 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52  R  expr2 = x  OR
68f0: 20 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a    x = expr3.**.*
6900: 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
6910: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
6920: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
6930: 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65 78 70  *      x IN (exp
6940: 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a  r1,expr2,expr3).
6950: 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a  **.** CASE 2:.**
6960: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65  .** If all subte
6970: 72 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c  rms are indexabl
6980: 65 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61  e by a single ta
6990: 62 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a  ble T, then set.
69a0: 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  **.**     WhereT
69b0: 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20  erm.eOperator   
69c0: 20 20 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f             =  WO
69d0: 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  _OR.**     Where
69e0: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  Term.u.pOrInfo->
69f0: 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74  indexable  |=  t
6a00: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
6a10: 20 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a   for table T.**.
6a20: 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20  ** A subterm is 
6a30: 22 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69  "indexable" if i
6a40: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
6a50: 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65  .** "T.C <op> <e
6a60: 78 70 72 3e 22 20 77 68 65 72 65 20 43 20 69 73  xpr>" where C is
6a70: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   any column of t
6a80: 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c  able T and .** <
6a90: 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d  op> is one of "=
6aa0: 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e  ", "<", "<=", ">
6ab0: 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c  ", ">=", "IS NUL
6ac0: 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20  L", or "IN"..** 
6ad0: 41 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73  A subterm is als
6ae0: 6f 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69  o indexable if i
6af0: 74 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74  t is an AND of t
6b00: 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75  wo or more.** su
6b10: 62 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61  bsubterms at lea
6b20: 73 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20  st one of which 
6b30: 69 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49  is indexable.  I
6b40: 6e 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a  ndexable AND .**
6b50: 20 73 75 62 74 65 72 6d 73 20 68 61 76 65 20 74   subterms have t
6b60: 68 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73  heir eOperator s
6b70: 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64  et to WO_AND and
6b80: 20 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e   they have.** u.
6b90: 70 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20  pAndInfo set to 
6ba0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
6bb0: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e 64  located WhereAnd
6bc0: 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  Term object..**.
6bd0: 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20  ** From another 
6be0: 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22  point of view, "
6bf0: 69 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73  indexable" means
6c00: 20 74 68 61 74 20 74 68 65 20 73 75 62 74 65 72   that the subter
6c10: 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e  m could.** poten
6c20: 74 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77  tially be used w
6c30: 69 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20  ith an index if 
6c40: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 69  an appropriate i
6c50: 6e 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20  ndex exists..** 
6c60: 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f  This analysis do
6c70: 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20  es not consider 
6c80: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
6c90: 68 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b  he index exists;
6ca0: 20 74 68 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65   that.** is some
6cb0: 74 68 69 6e 67 20 74 68 65 20 62 65 73 74 49 6e  thing the bestIn
6cc0: 64 65 78 28 29 20 72 6f 75 74 69 6e 65 20 77 69  dex() routine wi
6cd0: 6c 6c 20 64 65 74 65 72 6d 69 6e 65 2e 20 20 54  ll determine.  T
6ce0: 68 69 73 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20  his analysis.** 
6cf0: 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68  only looks at wh
6d00: 65 74 68 65 72 20 73 75 62 74 65 72 6d 73 20 61  ether subterms a
6d10: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
6d20: 6e 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a  ndexing exist..*
6d30: 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65  *.** All example
6d40: 73 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62  s A through E ab
6d50: 6f 76 65 20 61 6c 6c 20 73 61 74 69 73 66 79 20  ove all satisfy 
6d60: 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66 20  case 2.  But if 
6d70: 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73  a term.** also s
6d80: 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31  tatisfies case 1
6d90: 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20   (such as B) we 
6da0: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70  know that the op
6db0: 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20  timizer will.** 
6dc0: 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61  always prefer ca
6dd0: 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74  se 1, so in that
6de0: 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64   case we pretend
6df0: 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20   that case 2 is 
6e00: 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64  not.** satisfied
6e10: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74  ..**.** It might
6e20: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
6e30: 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65  t multiple table
6e40: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e  s are indexable.
6e50: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a    For example,.*
6e60: 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69  * (E) above is i
6e70: 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c  ndexable on tabl
6e80: 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a  es P, Q, and R..
6e90: 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74  **.** Terms that
6ea0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20   satisfy case 2 
6eb0: 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66  are candidates f
6ec0: 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69  or lookup by usi
6ed0: 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69  ng.** separate i
6ee0: 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72  ndices to find r
6ef0: 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73  owids for each s
6f00: 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f  ubterm and compo
6f10: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f  sing.** the unio
6f20: 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20  n of all rowids 
6f30: 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f  using a RowSet o
6f40: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20  bject.  This is 
6f50: 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62  similar.** to "b
6f60: 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69  itmap indices" i
6f70: 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  n other database
6f80: 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20   engines..**.** 
6f90: 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a  OTHERWISE:.**.**
6fa0: 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65   If neither case
6fb0: 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70   1 nor case 2 ap
6fc0: 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20  ply, then leave 
6fd0: 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65  the eOperator se
6fe0: 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54  t to.** zero.  T
6ff0: 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  his term is not 
7000: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63  useful for searc
7010: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
7020: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54  d exprAnalyzeOrT
7030: 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  erm(.  SrcList *
7040: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
7050: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
7060: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
7070: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
7080: 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65     /* the comple
7090: 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  te WHERE clause 
70a0: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
70c0: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f  * Index of the O
70d0: 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  R-term to be ana
70e0: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 50 61  lyzed */.){.  Pa
70f0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
7100: 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20  C->pParse;      
7110: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
7120: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
7130: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7140: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
7150: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
7160: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
7170: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
7180: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
7190: 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20  erm];    /* The 
71a0: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
71b0: 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  zed */.  Expr *p
71c0: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
71d0: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
71e0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
71f0: 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a  on of the term *
7200: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
7210: 20 2a 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43   *pMaskSet = pWC
7220: 2d 3e 70 4d 61 73 6b 53 65 74 3b 20 2f 2a 20 54  ->pMaskSet; /* T
7230: 61 62 6c 65 20 75 73 65 20 6d 61 73 6b 73 20 2a  able use masks *
7240: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7270: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
7280: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
7290: 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42  OrWc;       /* B
72a0: 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20  reakup of pTerm 
72b0: 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
72c0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f  .  WhereTerm *pO
72d0: 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20  rTerm;       /* 
72e0: 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69  A Sub-term withi
72f0: 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20  n the pOrWc */. 
7300: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f   WhereOrInfo *pO
7310: 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64  rInfo;     /* Ad
7320: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
7330: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
7340: 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20  with pTerm */.  
7350: 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e  Bitmask chngToIN
7360: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
7370: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
7380: 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f  atisfy case 1 */
7390: 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78  .  Bitmask index
73a0: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  able;        /* 
73b0: 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20  Tables that are 
73c0: 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73  indexable, satis
73d0: 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a  fying case 2 */.
73e0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b  .  /*.  ** Break
73f0: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
7400: 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65  nto its separate
7410: 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20   subterms.  The 
7420: 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a  subterms are.  *
7430: 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68  * stored in a Wh
7440: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
7450: 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77  ure containing w
7460: 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f  ithin the WhereO
7470: 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63  rInfo.  ** objec
7480: 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68  t that is attach
7490: 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ed to the origin
74a0: 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72  al OR clause ter
74b0: 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  m..  */.  assert
74c0: 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
74d0: 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49  s & (TERM_DYNAMI
74e0: 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45  C|TERM_ORINFO|TE
74f0: 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20  RM_ANDINFO))==0 
7500: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
7510: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  pr->op==TK_OR );
7520: 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  .  pTerm->u.pOrI
7530: 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20  nfo = pOrInfo = 
7540: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
7550: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
7560: 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28  pOrInfo));.  if(
7570: 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65   pOrInfo==0 ) re
7580: 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  turn;.  pTerm->w
7590: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
75a0: 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d  RINFO;.  pOrWc =
75b0: 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20   &pOrInfo->wc;. 
75c0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
75d0: 28 70 4f 72 57 63 2c 20 70 57 43 2d 3e 70 50 61  (pOrWc, pWC->pPa
75e0: 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a  rse, pMaskSet);.
75f0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72    whereSplit(pOr
7600: 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52  Wc, pExpr, TK_OR
7610: 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  );.  exprAnalyze
7620: 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29  All(pSrc, pOrWc)
7630: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
7640: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
7650: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  n;.  assert( pOr
7660: 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a  Wc->nTerm>=2 );.
7670: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75  .  /*.  ** Compu
7680: 74 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61  te the set of ta
7690: 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
76a0: 73 61 74 69 73 66 79 20 63 61 73 65 73 20 31 20  satisfy cases 1 
76b0: 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64  or 2..  */.  ind
76c0: 65 78 61 62 6c 65 20 3d 20 63 68 6e 67 54 6f 49  exable = chngToI
76d0: 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  N = ~(Bitmask)0;
76e0: 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e  .  for(i=pOrWc->
76f0: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
7700: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20  =pOrWc->a; i>=0 
7710: 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d  && indexable; i-
7720: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
7730: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
7740: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7750: 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  SINGLE)==0 ){.  
7760: 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f      WhereAndInfo
7770: 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20   *pAndInfo;.    
7780: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
7790: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20  m->eOperator==0 
77a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
77b0: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
77c0: 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e  gs & (TERM_ANDIN
77d0: 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29  FO|TERM_ORINFO))
77e0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e  ==0 );.      chn
77f0: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
7800: 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69   pAndInfo = sqli
7810: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7820: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49  b, sizeof(*pAndI
7830: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28  nfo));.      if(
7840: 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20   pAndInfo ){.   
7850: 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
7860: 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20   *pAndWC;.      
7870: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e    WhereTerm *pAn
7880: 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  dTerm;.        i
7890: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69  nt j;.        Bi
78a0: 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20  tmask b = 0;.   
78b0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e       pOrTerm->u.
78c0: 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49  pAndInfo = pAndI
78d0: 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  nfo;.        pOr
78e0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
78f0: 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20   TERM_ANDINFO;. 
7900: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
7910: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41  eOperator = WO_A
7920: 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  ND;.        pAnd
7930: 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e  WC = &pAndInfo->
7940: 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  wc;.        wher
7950: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64  eClauseInit(pAnd
7960: 57 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c  WC, pWC->pParse,
7970: 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 20 20   pMaskSet);.    
7980: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
7990: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
79a0: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
79b0: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
79c0: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
79d0: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  dWC);.        te
79e0: 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c  stcase( db->mall
79f0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
7a00: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
7a10: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
7a20: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
7a30: 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d  pAndTerm=pAndWC-
7a40: 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54  >a; j<pAndWC->nT
7a50: 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65  erm; j++, pAndTe
7a60: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
7a70: 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54     assert( pAndT
7a80: 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
7a90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c            if( al
7aa0: 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d  lowedOp(pAndTerm
7ab0: 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a  ->pExpr->op) ){.
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20                b 
7ad0: 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  |= getMask(pMask
7ae0: 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c  Set, pAndTerm->l
7af0: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
7b00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7b20: 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c          indexabl
7b30: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  e &= b;.      }.
7b40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
7b50: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
7b60: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a   TERM_COPIED ){.
7b70: 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68        /* Skip th
7b80: 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e  is term for now.
7b90: 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20    We revisit it 
7ba0: 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20  when we process 
7bb0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  the.      ** cor
7bc0: 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f  responding TERM_
7bd0: 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a  VIRTUAL term */.
7be0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7bf0: 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20   Bitmask b;.    
7c00: 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d    b = getMask(pM
7c10: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
7c20: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
7c30: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
7c40: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
7c50: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
7c60: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
7c70: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
7c80: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
7c90: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
7ca0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
7cb0: 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43  t, pOther->leftC
7cc0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
7cd0: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
7ce0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  &= b;.      if( 
7cf0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
7d00: 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20  or!=WO_EQ ){.   
7d10: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20       chngToIN = 
7d20: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
7d30: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
7d40: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20   &= b;.      }. 
7d50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
7d60: 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73   ** Record the s
7d70: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
7d80: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
7d90: 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74  .  The set might
7da0: 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a   be.  ** empty..
7db0: 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e    */.  pOrInfo->
7dc0: 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65  indexable = inde
7dd0: 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e  xable;.  pTerm->
7de0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65  eOperator = inde
7df0: 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57  xable==0 ? 0 : W
7e00: 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  O_OR;..  /*.  **
7e10: 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20   chngToIN holds 
7e20: 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  a set of tables 
7e30: 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74  that *might* sat
7e40: 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75  isfy case 1.  Bu
7e50: 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74  t.  ** we have t
7e60: 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69  o do some additi
7e70: 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f  onal checking to
7e80: 20 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72   see if case 1 r
7e90: 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61  eally.  ** is sa
7ea0: 74 69 73 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20  tisfied..  */.  
7eb0: 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a  if( chngToIN ){.
7ec0: 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67      int okToChng
7ed0: 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a  ToIN = 0;     /*
7ee0: 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e   True if the con
7ef0: 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73  version to IN is
7f00: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e   valid */.    in
7f10: 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20  t iColumn = -1; 
7f20: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
7f30: 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f  n index on lhs o
7f40: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
7f50: 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72  .    int iCursor
7f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7f70: 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63  * Table cursor c
7f80: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72  ommon to all ter
7f90: 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  ms */.    int j 
7fa0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
7fb0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7fc0: 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ter */..    /* S
7fd0: 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c  earch for a tabl
7fe0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61  e and column tha
7ff0: 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65  t appears on one
8000: 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20   side or the.   
8010: 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65   ** other of the
8020: 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20   == operator in 
8030: 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20  every subterm.  
8040: 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63  That table and c
8050: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c  olumn.    ** wil
8060: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
8070: 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f   iCursor and iCo
8080: 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67  lumn.  There mig
8090: 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20  ht not be any.  
80a0: 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20    ** such table 
80b0: 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74  and column.  Set
80c0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66   okToChngToIN if
80d0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
80e0: 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64  table.    ** and
80f0: 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64   column is found
8100: 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43   but leave okToC
8110: 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66  hngToIN false if
8120: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20   not found..    
8130: 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  */.    for(j=0; 
8140: 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67  j<2 && !okToChng
8150: 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ToIN; j++){.    
8160: 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57    pOrTerm = pOrW
8170: 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  c->a;.      for(
8180: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
8190: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72  ; i>=0; i--, pOr
81a0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
81b0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
81c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
81d0: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  EQ );.        pO
81e0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
81f0: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
8200: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
8210: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
8220: 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  iColumn ) contin
8230: 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
8240: 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d  (chngToIN & getM
8250: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f  ask(pMaskSet, pO
8260: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8270: 72 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  r))==0 ) continu
8280: 65 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75  e;.        iColu
8290: 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e  mn = pOrTerm->u.
82a0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
82b0: 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f      iCursor = pO
82c0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
82d0: 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  r;.        break
82e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
82f0: 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20  if( i<0 ){.     
8300: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20     assert( j==1 
8310: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
8320: 74 28 20 28 63 68 6e 67 54 6f 49 4e 26 28 63 68  t( (chngToIN&(ch
8330: 6e 67 54 6f 49 4e 2d 31 29 29 3d 3d 30 20 29 3b  ngToIN-1))==0 );
8340: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8350: 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61   chngToIN==getMa
8360: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 43 6f  sk(pMaskSet, iCo
8370: 6c 75 6d 6e 29 20 29 3b 0a 20 20 20 20 20 20 20  lumn) );.       
8380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8390: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
83a0: 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f  IN = 1;.      fo
83b0: 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f  r(; i>=0 && okTo
83c0: 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70  ChngToIN; i--, p
83d0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
83e0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
83f0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
8400: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
8410: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
8420: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72  tCursor!=iCursor
8430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
8440: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8450: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
8460: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8470: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
8480: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
8490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54  ){.          okT
84a0: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
84b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
84c0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c          int affL
84d0: 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20  eft, affRight;. 
84e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
84f0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
8500: 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c  de is also a col
8510: 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66  umn, then the af
8520: 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20  finities.       
8530: 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69     ** of both ri
8540: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64  ght and left sid
8550: 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20  es must be such 
8560: 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20  that no type.   
8570: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72         ** conver
8580: 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72  sions are requir
8590: 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  ed on the right.
85a0: 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29    (Ticket #2249)
85b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
85c0: 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74          affRight
85d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
85e0: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
85f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
8600: 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66            affLef
8610: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
8620: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
8630: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
8640: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66            if( af
8650: 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66  fRight!=0 && aff
8660: 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29  Right!=affLeft )
8670: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b  {.            ok
8680: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
8690: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
86a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72  .            pOr
86b0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
86c0: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20   TERM_OR_OK;.   
86d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
86e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
86f0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
8700: 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67   point, okToChng
8710: 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20  ToIN is true if 
8720: 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73  original pTerm s
8730: 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20  atisfies.    ** 
8740: 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74  case 1.  In that
8750: 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74   case, construct
8760: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
8770: 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20  erm that is .   
8780: 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72   ** pTerm conver
8790: 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f  ted into an IN o
87a0: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  perator..    */.
87b0: 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67      if( okToChng
87c0: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  ToIN ){.      Ex
87d0: 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20  pr *pDup;       
87e0: 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69       /* A transi
87f0: 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78  ent duplicate ex
8800: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
8810: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8820: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  t = 0;   /* The 
8830: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
8840: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
8850: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b  Expr *pLeft = 0;
8860: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48         /* The LH
8870: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
8880: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
8890: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
88a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
88b0: 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  lete IN operator
88c0: 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   */..      for(i
88d0: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
88e0: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
88f0: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  a; i>=0; i--, pO
8900: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
8910: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
8920: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
8930: 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69  R_OK)==0 ) conti
8940: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  nue;.        ass
8950: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
8960: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29  perator==WO_EQ )
8970: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
8980: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
8990: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
89a0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
89b0: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
89c0: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
89d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70   );.        pDup
89e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
89f0: 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  p(db, pOrTerm->p
8a00: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
8a10: 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73         pList = s
8a20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
8a30: 70 65 6e 64 28 70 57 43 2d 3e 70 50 61 72 73 65  pend(pWC->pParse
8a40: 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 2c 20 30  , pList, pDup, 0
8a50: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74  );.        pLeft
8a60: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70   = pOrTerm->pExp
8a70: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
8a80: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
8a90: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
8aa0: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
8ab0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
8ac0: 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  t);.      pNew =
8ad0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
8ae0: 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c   TK_IN, pDup, 0,
8af0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
8b00: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  New ){.        i
8b10: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
8b20: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
8b30: 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45  arkings(pNew, pE
8b40: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  xpr);.        pN
8b50: 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ew->pList = pLis
8b60: 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65  t;.        idxNe
8b70: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
8b80: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c  nsert(pWC, pNew,
8b90: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
8ba0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
8bb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
8bc0: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
8bd0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
8be0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
8bf0: 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  w);.        pTer
8c00: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
8c10: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 57  erm];.        pW
8c20: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61  C->a[idxNew].iPa
8c30: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
8c40: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
8c50: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
8c60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8c70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8c80: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
8c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8ca0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8cb0: 20 3d 20 30 3b 20 20 2f 2a 20 63 61 73 65 20 31   = 0;  /* case 1
8cc0: 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a   trumps case 2 *
8cd0: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  /.    }.  }.}.#e
8ce0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
8cf0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
8d00: 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f  TION && !SQLITE_
8d10: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
8d20: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  .../*.** The inp
8d30: 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
8d40: 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65  ne is an WhereTe
8d50: 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74  rm structure wit
8d60: 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70  h only the.** "p
8d70: 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c  Expr" field fill
8d80: 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20  ed in.  The job 
8d90: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
8da0: 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  is to analyze th
8db0: 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69  e.** subexpressi
8dc0: 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  on and populate 
8dd0: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69  all the other fi
8de0: 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72  elds of the Wher
8df0: 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75  eTerm.** structu
8e00: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
8e10: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
8e20: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70  f the form "<exp
8e30: 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65  r> <op> X" it ge
8e40: 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74  ts commuted.** t
8e50: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66  o the standard f
8e60: 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c  orm of "X <op> <
8e70: 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66  expr>"..**.** If
8e80: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8e90: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
8ea0: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
8eb0: 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65  both X and Y are
8ec0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  .** columns, the
8ed0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65  n the original e
8ee0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63  xpression is unc
8ef0: 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77  hanged and a new
8f00: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d   virtual.** term
8f10: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20   of the form "Y 
8f20: 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64  <op> X" is added
8f30: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
8f40: 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ause and.** anal
8f50: 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  yzed separately.
8f60: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
8f70: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
8f80: 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a  th TERM_COPIED.*
8f90: 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65  * and the new te
8fa0: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
8fb0: 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28  h TERM_DYNAMIC (
8fc0: 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78  because it's pEx
8fd0: 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  pr.** needs to b
8fe0: 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65  e freed with the
8ff0: 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e   WhereClause) an
9000: 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28  d TERM_VIRTUAL (
9010: 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73  because it.** is
9020: 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79   a commuted copy
9030: 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d   of a prior term
9040: 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .)  The original
9050: 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64   term has nChild
9060: 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f  =1.** and the co
9070: 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74  py has idxParent
9080: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
9090: 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  x of the origina
90a0: 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  l term..*/.stati
90b0: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
90c0: 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ze(.  SrcList *p
90d0: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
90e0: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
90f0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
9100: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
9110: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
9120: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
9130: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
9140: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
9150: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
9160: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
9170: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
9180: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
9190: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f    /* The term to
91a0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
91b0: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
91c0: 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20  pMaskSet;       
91d0: 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62     /* Set of tab
91e0: 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a  le index masks *
91f0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  /.  Expr *pExpr;
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9210: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
9220: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61  ession to be ana
9230: 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61  lyzed */.  Bitma
9240: 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20  sk prereqLeft;  
9250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9260: 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20  rerequesites of 
9270: 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  the pExpr->pLeft
9280: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
9290: 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20  ereqAll;        
92a0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71         /* Prereq
92b0: 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70 72  uesites of pExpr
92c0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
92d0: 74 72 61 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  traRight = 0;.  
92e0: 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20  int nPattern;.  
92f0: 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a  int isComplete;.
9300: 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b 0a 20 20    int noCase;.  
9310: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9330: 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70   /* Top-level op
9340: 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e  erator.  pExpr->
9350: 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  op */.  Parse *p
9360: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
9370: 72 73 65 3b 20 20 20 20 20 2f 2a 20 50 61 72 73  rse;     /* Pars
9380: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9390: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
93a0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
93b0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
93c0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69  nnection */..  i
93d0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
93e0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
93f0: 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  n;.  }.  pTerm =
9400: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
9410: 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  ];.  pMaskSet = 
9420: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20  pWC->pMaskSet;. 
9430: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
9440: 70 45 78 70 72 3b 0a 20 20 70 72 65 72 65 71 4c  pExpr;.  prereqL
9450: 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55  eft = exprTableU
9460: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
9470: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
9480: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
9490: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20    if( op==TK_IN 
94a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
94b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
94c0: 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  );.    pTerm->pr
94d0: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
94e0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
94f0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
9500: 70 4c 69 73 74 29 0a 20 20 20 20 20 20 20 20 20  pList).         
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 7c 20 65 78 70 72 53 65 6c 65 63 74 54 61 62   | exprSelectTab
9530: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
9540: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
9550: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  );.  }else if( o
9560: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
9570: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
9580: 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65  qRight = 0;.  }e
9590: 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  lse{.    pTerm->
95a0: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
95b0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
95c0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52  skSet, pExpr->pR
95d0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65  ight);.  }.  pre
95e0: 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62  reqAll = exprTab
95f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
9600: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
9610: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9620: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
9630: 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  in) ){.    Bitma
9640: 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70  sk x = getMask(p
9650: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
9660: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29  iRightJoinTable)
9670: 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20  ;.    prereqAll 
9680: 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52  |= x;.    extraR
9690: 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20  ight = x-1;  /* 
96a0: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
96b0: 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20  may not be used 
96c0: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20  with an index.  
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20       ** on left 
96f0: 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
9700: 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33  JOIN.  Ticket #3
9710: 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65  015 */.  }.  pTe
9720: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
9730: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65  prereqAll;.  pTe
9740: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
9750: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50   -1;.  pTerm->iP
9760: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54  arent = -1;.  pT
9770: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
9780: 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65   0;.  if( allowe
9790: 64 4f 70 28 6f 70 29 20 26 26 20 28 70 54 65 72  dOp(op) && (pTer
97a0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
97b0: 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20   prereqLeft)==0 
97c0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
97d0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
97e0: 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  t;.    Expr *pRi
97f0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
9800: 67 68 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  ght;.    if( pLe
9810: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
9820: 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  N ){.      pTerm
9830: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
9840: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
9850: 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66      pTerm->u.lef
9860: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
9870: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
9880: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
9890: 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28   = operatorMask(
98a0: 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  op);.    }.    i
98b0: 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69  f( pRight && pRi
98c0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ght->op==TK_COLU
98d0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  MN ){.      Wher
98e0: 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20  eTerm *pNew;.   
98f0: 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20     Expr *pDup;. 
9900: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
9910: 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b  leftCursor>=0 ){
9920: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78  .        int idx
9930: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75  New;.        pDu
9940: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
9950: 75 70 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  up(db, pExpr);. 
9960: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
9970: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
9980: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9990: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
99a0: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dup);.          
99b0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
99c0: 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  }.        idxNew
99d0: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
99e0: 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20  sert(pWC, pDup, 
99f0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
9a00: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
9a10: 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d      if( idxNew==
9a20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
9a30: 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d      pNew = &pWC-
9a40: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
9a50: 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e      pNew->iParen
9a60: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
9a70: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
9a80: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
9a90: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
9aa0: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
9ab0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
9ac0: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
9ad0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9ae0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78        pDup = pEx
9af0: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  pr;.        pNew
9b00: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
9b10: 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d  }.      exprComm
9b20: 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70  ute(pParse, pDup
9b30: 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d  );.      pLeft =
9b40: 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20   pDup->pLeft;.  
9b50: 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75      pNew->leftCu
9b60: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
9b70: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
9b80: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
9b90: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
9ba0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
9bb0: 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65  reqRight = prere
9bc0: 71 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65  qLeft;.      pNe
9bd0: 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  w->prereqAll = p
9be0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20  rereqAll;.      
9bf0: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
9c00: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70  = operatorMask(p
9c10: 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a  Dup->op);.    }.
9c20: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
9c30: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
9c40: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
9c50: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
9c60: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
9c70: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
9c80: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
9c90: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
9ca0: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
9cb0: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
9cc0: 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20  mplements.  For 
9cd0: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
9ce0: 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45  **      a BETWEE
9cf0: 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20  N b AND c.  **. 
9d00: 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64   ** is converted
9d10: 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
9d20: 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e        (a BETWEEN
9d30: 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61   b AND c) AND (a
9d40: 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a  >=b) AND (a<=c).
9d50: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77    **.  ** The tw
9d60: 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  o new terms are 
9d70: 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  added onto the e
9d80: 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43  nd of the WhereC
9d90: 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20  lause object..  
9da0: 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73  ** The new terms
9db0: 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61   are "dynamic" a
9dc0: 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20  nd are children 
9dd0: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
9de0: 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72  BETWEEN.  ** ter
9df0: 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  m.  That means t
9e00: 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45  hat if the BETWE
9e10: 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64  EN term is coded
9e20: 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  , the children a
9e30: 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e  re.  ** skipped.
9e40: 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69    Or, if the chi
9e50: 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66  ldren are satisf
9e60: 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c  ied by an index,
9e70: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
9e80: 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  ** BETWEEN term 
9e90: 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  is skipped..  */
9ea0: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
9eb0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45  r->op==TK_BETWEE
9ec0: 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  N && pWC->op==TK
9ed0: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72  _AND ){.    Expr
9ee0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
9ef0: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
9f00: 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69  int i;.    stati
9f10: 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d  c const u8 ops[]
9f20: 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45   = {TK_GE, TK_LE
9f30: 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  };.    assert( p
9f40: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
9f50: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
9f60: 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f  xpr==2 );.    fo
9f70: 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
9f80: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
9f90: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  ewExpr;.      in
9fa0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
9fb0: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
9fc0: 65 33 45 78 70 72 28 64 62 2c 20 6f 70 73 5b 69  e3Expr(db, ops[i
9fd0: 5d 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  ], sqlite3ExprDu
9fe0: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  p(db, pExpr->pLe
9ff0: 66 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ft),.           
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a010: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
a020: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
a030: 2e 70 45 78 70 72 29 2c 20 30 29 3b 0a 20 20 20  .pExpr), 0);.   
a040: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
a050: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
a060: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
a070: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
a080: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
a090: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
a0a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
a0b0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
a0c0: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
a0d0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
a0e0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
a0f0: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
a100: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
a110: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
a120: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
a130: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
a140: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
a150: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
a160: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
a170: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
a180: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
a190: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a1a0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
a1b0: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74    /* Analyze a t
a1c0: 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70  erm that is comp
a1d0: 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d  osed of two or m
a1e0: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
a1f0: 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61  nected by.  ** a
a200: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n OR operator.. 
a210: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
a220: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
a230: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
a240: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
a250: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
a260: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
a270: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 7d  C, idxTerm);.  }
a280: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
a290: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
a2a0: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
a2b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
a2c0: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
a2d0: 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72  .  /* Add constr
a2e0: 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20  aints to reduce 
a2f0: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
a300: 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   on a LIKE or GL
a310: 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  OB.  ** operator
a320: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69  ..  **.  ** A li
a330: 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68  ke pattern of th
a340: 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27  e form "x LIKE '
a350: 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67 65  abc%'" is change
a360: 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e  d into constrain
a370: 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  ts.  **.  **    
a380: 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41        x>='abc' A
a390: 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78  ND x<'abd' AND x
a3a0: 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a   LIKE 'abc%'.  *
a3b0: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20  *.  ** The last 
a3c0: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
a3d0: 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69 73   prefix "abc" is
a3e0: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20   incremented to 
a3f0: 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65  form the.  ** te
a400: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74  rmination condit
a410: 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a  ion "abd"..  */.
a420: 20 20 69 66 28 20 69 73 4c 69 6b 65 4f 72 47 6c    if( isLikeOrGl
a430: 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ob(pParse, pExpr
a440: 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69 73  , &nPattern, &is
a450: 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73  Complete, &noCas
a460: 65 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  e).         && p
a470: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
a480: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
a490: 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20  t, *pRight;.    
a4a0: 45 78 70 72 20 2a 70 53 74 72 31 2c 20 2a 70 53  Expr *pStr1, *pS
a4b0: 74 72 32 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  tr2;.    Expr *p
a4c0: 4e 65 77 45 78 70 72 31 2c 20 2a 70 4e 65 77 45  NewExpr1, *pNewE
a4d0: 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64  xpr2;.    int id
a4e0: 78 4e 65 77 31 2c 20 69 64 78 4e 65 77 32 3b 0a  xNew1, idxNew2;.
a4f0: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
a500: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
a510: 70 45 78 70 72 3b 0a 20 20 20 20 70 52 69 67 68  pExpr;.    pRigh
a520: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
a530: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
a540: 20 20 70 53 74 72 31 20 3d 20 73 71 6c 69 74 65    pStr1 = sqlite
a550: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
a560: 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20  K_STRING, 0, 0, 
a570: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72  0);.    if( pStr
a580: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
a590: 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20  e3TokenCopy(db, 
a5a0: 26 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26  &pStr1->token, &
a5b0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a  pRight->token);.
a5c0: 20 20 20 20 20 20 70 53 74 72 31 2d 3e 74 6f 6b        pStr1->tok
a5d0: 65 6e 2e 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b  en.n = nPattern;
a5e0: 0a 20 20 20 20 20 20 70 53 74 72 31 2d 3e 66 6c  .      pStr1->fl
a5f0: 61 67 73 20 3d 20 45 50 5f 44 65 71 75 6f 74 65  ags = EP_Dequote
a600: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74  d;.    }.    pSt
a610: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
a620: 44 75 70 28 64 62 2c 20 70 53 74 72 31 29 3b 0a  Dup(db, pStr1);.
a630: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
a640: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
a650: 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 0a 20 20     u8 c, *pC;.  
a660: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
a670: 32 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 3b 0a  2->token.dyn );.
a680: 20 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29        pC = (u8*)
a690: 26 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 7a 5b  &pStr2->token.z[
a6a0: 6e 50 61 74 74 65 72 6e 2d 31 5d 3b 0a 20 20 20  nPattern-1];.   
a6b0: 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20     c = *pC;.    
a6c0: 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a    if( noCase ){.
a6d0: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
a6e0: 40 27 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20  @' ) isComplete 
a6f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d  = 0;.        c =
a700: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
a710: 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d  ower[c];.      }
a720: 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b  .      *pC = c +
a730: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e   1;.    }.    pN
a740: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
a750: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
a760: 4b 5f 47 45 2c 20 73 71 6c 69 74 65 33 45 78 70  K_GE, sqlite3Exp
a770: 72 44 75 70 28 64 62 2c 70 4c 65 66 74 29 2c 20  rDup(db,pLeft), 
a780: 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69  pStr1, 0);.    i
a790: 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c  dxNew1 = whereCl
a7a0: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
a7b0: 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f  pNewExpr1, TERM_
a7c0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
a7d0: 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63  AMIC);.    testc
a7e0: 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20  ase( idxNew1==0 
a7f0: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
a800: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
a810: 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77  xNew1);.    pNew
a820: 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50  Expr2 = sqlite3P
a830: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
a840: 4c 54 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  LT, sqlite3ExprD
a850: 75 70 28 64 62 2c 70 4c 65 66 74 29 2c 20 70 53  up(db,pLeft), pS
a860: 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78  tr2, 0);.    idx
a870: 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75  New2 = whereClau
a880: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
a890: 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49  ewExpr2, TERM_VI
a8a0: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
a8b0: 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  IC);.    testcas
a8c0: 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b  e( idxNew2==0 );
a8d0: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
a8e0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
a8f0: 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  ew2);.    pTerm 
a900: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
a910: 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f  m];.    if( isCo
a920: 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  mplete ){.      
a930: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e  pWC->a[idxNew1].
a940: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
a950: 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  m;.      pWC->a[
a960: 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74  idxNew2].iParent
a970: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
a980: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
a990: 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 2;.    }.  }.#
a9a0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a9b0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
a9c0: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
a9d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
a9e0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a  IRTUALTABLE.  /*
a9f0: 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20   Add a WO_MATCH 
aa00: 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74  auxiliary term t
aa10: 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  o the constraint
aa20: 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a   set if the.  **
aa30: 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73   current express
aa40: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
aa50: 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43  rm:  column MATC
aa60: 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69  H expr..  ** Thi
aa70: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
aa80: 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65   used by the xBe
aa90: 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20  stIndex methods 
aaa0: 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  of.  ** virtual 
aab0: 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74  tables.  The nat
aac0: 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  ive query optimi
aad0: 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74  zer does not att
aae0: 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20  empt.  ** to do 
aaf0: 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41  anything with MA
ab00: 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  TCH functions.. 
ab10: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63   */.  if( isMatc
ab20: 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29  hOfColumn(pExpr)
ab30: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e   ){.    int idxN
ab40: 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  ew;.    Expr *pR
ab50: 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20  ight, *pLeft;.  
ab60: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65    WhereTerm *pNe
ab70: 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61  wTerm;.    Bitma
ab80: 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c  sk prereqColumn,
ab90: 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20   prereqExpr;..  
aba0: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
abb0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
abc0: 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d  xpr;.    pLeft =
abd0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
abe0: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
abf0: 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72  rereqExpr = expr
ac00: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
ac10: 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  Set, pRight);.  
ac20: 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d    prereqColumn =
ac30: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
ac40: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29  pMaskSet, pLeft)
ac50: 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65  ;.    if( (prere
ac60: 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f  qExpr & prereqCo
ac70: 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lumn)==0 ){.    
ac80: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
ac90: 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
aca0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
acb0: 62 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 30 2c 20  b, TK_MATCH, 0, 
acc0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
acd0: 62 2c 20 70 52 69 67 68 74 29 2c 20 30 29 3b 0a  b, pRight), 0);.
ace0: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
acf0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
ad00: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
ad10: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
ad20: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
ad30: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
ad40: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew==0 );.      p
ad50: 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e  NewTerm = &pWC->
ad60: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
ad70: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
ad80: 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45  qRight = prereqE
ad90: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  xpr;.      pNewT
ada0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
adb0: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
adc0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
add0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
ade0: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
adf0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
ae00: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d  eOperator = WO_M
ae10: 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77  ATCH;.      pNew
ae20: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
ae30: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
ae40: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
ae50: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70  dxTerm];.      p
ae60: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
ae70: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
ae80: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
ae90: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
aea0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
aeb0: 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
aec0: 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
aed0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
aee0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
aef0: 45 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65  E */..  /* Preve
af00: 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72  nt ON clause ter
af10: 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  ms of a LEFT JOI
af20: 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65  N from being use
af30: 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20  d to drive.  ** 
af40: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62  an index for tab
af50: 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
af60: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
af70: 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  /.  pTerm->prere
af80: 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52  qRight |= extraR
af90: 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ight;.}../*.** R
afa0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e  eturn TRUE if an
afb0: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
afc0: 69 6f 6e 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61  ions in pList->a
afd0: 5b 69 46 69 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74  [iFirst...] cont
afe0: 61 69 6e 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  ain.** a referen
aff0: 63 65 20 74 6f 20 61 6e 79 20 74 61 62 6c 65 20  ce to any table 
b000: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 69  other than the i
b010: 42 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  Base table..*/.s
b020: 74 61 74 69 63 20 69 6e 74 20 72 65 66 65 72 65  tatic int refere
b030: 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28  ncesOtherTables(
b040: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
b050: 73 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st,          /* 
b060: 53 65 61 72 63 68 20 65 78 70 72 65 73 73 69 6f  Search expressio
b070: 6e 73 20 69 6e 20 74 68 73 20 6c 69 73 74 20 2a  ns in ths list *
b080: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
b090: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f 2a   *pMaskSet,   /*
b0a0: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
b0b0: 62 6c 65 73 20 74 6f 20 62 69 74 6d 61 70 73 20  bles to bitmaps 
b0c0: 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c  */.  int iFirst,
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b0e0: 2a 20 42 65 20 73 65 61 72 63 68 69 6e 67 20 77  * Be searching w
b0f0: 69 74 68 20 74 68 65 20 69 46 69 72 73 74 2d 74  ith the iFirst-t
b100: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  h expression */.
b110: 20 20 69 6e 74 20 69 42 61 73 65 20 20 20 20 20    int iBase     
b120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b130: 67 6e 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73  gnore references
b140: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
b150: 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 61  /.){.  Bitmask a
b160: 6c 6c 6f 77 65 64 20 3d 20 7e 67 65 74 4d 61 73  llowed = ~getMas
b170: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 42 61 73  k(pMaskSet, iBas
b180: 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 46 69  e);.  while( iFi
b190: 72 73 74 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rst<pList->nExpr
b1a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 65 78 70   ){.    if( (exp
b1b0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
b1c0: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
b1d0: 46 69 72 73 74 2b 2b 5d 2e 70 45 78 70 72 29 26  First++].pExpr)&
b1e0: 61 6c 6c 6f 77 65 64 29 21 3d 30 20 29 7b 0a 20  allowed)!=0 ){. 
b1f0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
b200: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
b210: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  n 0;.}.../*.** T
b220: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69  his routine deci
b230: 64 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20  des if pIdx can 
b240: 62 65 20 75 73 65 64 20 74 6f 20 73 61 74 69 73  be used to satis
b250: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  fy the ORDER BY.
b260: 2a 2a 20 63 6c 61 75 73 65 2e 20 20 49 66 20 69  ** clause.  If i
b270: 74 20 63 61 6e 2c 20 69 74 20 72 65 74 75 72 6e  t can, it return
b280: 73 20 31 2e 20 20 49 66 20 70 49 64 78 20 63 61  s 1.  If pIdx ca
b290: 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65  nnot satisfy the
b2a0: 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
b2b0: 75 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  use, this routin
b2c0: 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a  e returns 0..**.
b2d0: 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
b2e0: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
b2f0: 65 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20  e from a SELECT 
b300: 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 54 61 62  statement.  pTab
b310: 20 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d   is the.** left-
b320: 6d 6f 73 74 20 74 61 62 6c 65 20 69 6e 20 74 68  most table in th
b330: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
b340: 20 74 68 61 74 20 73 61 6d 65 20 53 45 4c 45 43   that same SELEC
b350: 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a  T statement and.
b360: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  ** the table has
b370: 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72   a cursor number
b380: 20 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49 64   of "base".  pId
b390: 78 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  x is an index on
b3a0: 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71   pTab..**.** nEq
b3b0: 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Col is the numbe
b3c0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
b3d0: 70 49 64 78 20 74 68 61 74 20 61 72 65 20 75 73  pIdx that are us
b3e0: 65 64 20 61 73 20 65 71 75 61 6c 69 74 79 0a 2a  ed as equality.*
b3f0: 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  * constraints.  
b400: 41 6e 79 20 6f 66 20 74 68 65 73 65 20 63 6f 6c  Any of these col
b410: 75 6d 6e 73 20 6d 61 79 20 62 65 20 6d 69 73 73  umns may be miss
b420: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 52 44  ing from the ORD
b430: 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20  ER BY.** clause 
b440: 61 6e 64 20 74 68 65 20 6d 61 74 63 68 20 63 61  and the match ca
b450: 6e 20 73 74 69 6c 6c 20 62 65 20 61 20 73 75 63  n still be a suc
b460: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  cess..**.** All 
b470: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
b480: 45 52 20 42 59 20 74 68 61 74 20 6d 61 74 63 68  ER BY that match
b490: 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64   against the ind
b4a0: 65 78 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ex must be eithe
b4b0: 72 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45 53 43  r.** ASC or DESC
b4c0: 2e 20 20 28 54 65 72 6d 73 20 6f 66 20 74 68 65  .  (Terms of the
b4d0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
b4e0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
b4f0: 20 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64   a UNIQUE.** ind
b500: 65 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ex do not need t
b510: 6f 20 73 61 74 69 73 66 79 20 74 68 69 73 20 63  o satisfy this c
b520: 6f 6e 73 74 72 61 69 6e 74 2e 29 20 20 54 68 65  onstraint.)  The
b530: 20 2a 70 62 52 65 76 20 76 61 6c 75 65 20 69 73   *pbRev value is
b540: 0a 2a 2a 20 73 65 74 20 74 6f 20 31 20 69 66 20  .** set to 1 if 
b550: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
b560: 75 73 65 20 69 73 20 61 6c 6c 20 44 45 53 43 20  use is all DESC 
b570: 61 6e 64 20 69 74 20 69 73 20 73 65 74 20 74 6f  and it is set to
b580: 20 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44   0 if.** the ORD
b590: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ER BY clause is 
b5a0: 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74  all ASC..*/.stat
b5b0: 69 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67  ic int isSorting
b5c0: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
b5d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
b5e0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
b5f0: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  ext */.  WhereMa
b600: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
b610: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
b620: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75   table cursor nu
b630: 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 70 73  mbers to bitmaps
b640: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
b650: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x,            /*
b660: 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72   The index we ar
b670: 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69  e testing */.  i
b680: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
b690: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
b6a0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
b6b0: 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74  table to be sort
b6c0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
b6d0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
b6e0: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
b6f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
b700: 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  nEqCol,         
b710: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b720: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77   index columns w
b730: 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ith == constrain
b740: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  ts */.  int *pbR
b750: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
b760: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
b770: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
b780: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
b790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b7a0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
b7b0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
b7c0: 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b  t sortOrder = 0;
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b7e0: 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e   XOR of index an
b7f0: 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20  d ORDER BY sort 
b800: 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  direction */.  i
b810: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b830: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
b840: 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
b850: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
b860: 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  item *pTerm;    
b870: 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  /* A term of the
b880: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
b890: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
b8a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
b8b0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
b8c0: 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72  rBy!=0 );.  nTer
b8d0: 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  m = pOrderBy->nE
b8e0: 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  xpr;.  assert( n
b8f0: 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  Term>0 );..  /* 
b900: 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74  Match terms of t
b910: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
b920: 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d  se against colum
b930: 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69  ns of.  ** the i
b940: 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
b950: 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63 65  Note that indice
b960: 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f  s have pIdx->nCo
b970: 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c  lumn regular col
b980: 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f  umns plus.  ** o
b990: 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  ne additional co
b9a0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20  lumn containing 
b9b0: 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20  the rowid.  The 
b9c0: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a  rowid column.  *
b9d0: 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  * of the index i
b9e0: 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74  s also allowed t
b9f0: 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  o match against 
ba00: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a  the ORDER BY.  *
ba10: 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  * clause..  */. 
ba20: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
ba30: 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
ba40: 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64  <nTerm && i<=pId
ba50: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
ba60: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
ba70: 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r;       /* The 
ba80: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
ba90: 65 20 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d  e ORDER BY pTerm
baa0: 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
bab0: 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68  *pColl;    /* Th
bac0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
bad0: 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f  ence of pExpr */
bae0: 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72  .    int termSor
baf0: 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20  tOrder; /* Sort 
bb00: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 74  order for this t
bb10: 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  erm */.    int i
bb20: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a  Column;       /*
bb30: 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   The i-th column
bb40: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
bb50: 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a  -1 for rowid */.
bb60: 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64      int iSortOrd
bb70: 65 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20  er;    /* 1 for 
bb80: 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20  DESC, 0 for ASC 
bb90: 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65  on the i-th inde
bba0: 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f  x term */.    co
bbb0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
bbc0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
bbd0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
bbe0: 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65  ce for i-th inde
bbf0: 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70  x term */..    p
bc00: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
bc10: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78  xpr;.    if( pEx
bc20: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
bc30: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
bc40: 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20  le!=base ){.    
bc50: 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65    /* Can not use
bc60: 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f   an index sort o
bc70: 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20  n anything that 
bc80: 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20  is not a column 
bc90: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
bca0: 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20  left-most table 
bcb0: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
bcc0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  se */.      brea
bcd0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f  k;.    }.    pCo
bce0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
bcf0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
bd00: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
bd10: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
bd20: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
bd30: 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  tColl;.    }.   
bd40: 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43 6f   if( i<pIdx->nCo
bd50: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43  lumn ){.      iC
bd60: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
bd70: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
bd80: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
bd90: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  dx->pTable->iPKe
bda0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  y ){.        iCo
bdb0: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
bdc0: 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72   }.      iSortOr
bdd0: 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  der = pIdx->aSor
bde0: 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20  tOrder[i];.     
bdf0: 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61   zColl = pIdx->a
be00: 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65  zColl[i];.    }e
be10: 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  lse{.      iColu
be20: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  mn = -1;.      i
be30: 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  SortOrder = 0;. 
be40: 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f       zColl = pCo
be50: 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d  ll->zName;.    }
be60: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
be70: 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
be80: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
be90: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
bea0: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
beb0: 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68   /* Term j of th
bec0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
bed0: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
bee0: 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65   column i of the
bef0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
bf00: 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a  if( i<nEqCol ){.
bf10: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
bf20: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
bf30: 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
bf40: 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f  d by == fails to
bf50: 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20   match an.      
bf60: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65    ** ORDER BY te
bf70: 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20  rm, that is OK. 
bf80: 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61   Just ignore tha
bf90: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
bfa0: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f  index.        */
bfb0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
bfc0: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  e;.      }else i
bfd0: 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( i==pIdx->nCol
bfe0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  umn ){.        /
bff0: 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69  * Index column i
c000: 20 69 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20   is the rowid.  
c010: 41 6c 6c 20 6f 74 68 65 72 20 74 65 72 6d 73 20  All other terms 
c020: 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20  match. */.      
c030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
c040: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
c050: 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c   If an index col
c060: 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61 74  umn fails to mat
c070: 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f  ch and is not co
c080: 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a  nstrained by ==.
c090: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
c0a0: 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  the index cannot
c0b0: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
c0c0: 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74  ER BY constraint
c0d0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
c0e0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c0f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c100: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
c110: 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
c120: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
c130: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20  m->sortOrder==0 
c140: 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72  || pTerm->sortOr
c150: 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  der==1 );.    as
c160: 73 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72  sert( iSortOrder
c170: 3d 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65  ==0 || iSortOrde
c180: 72 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d  r==1 );.    term
c190: 53 6f 72 74 4f 72 64 65 72 20 3d 20 69 53 6f 72  SortOrder = iSor
c1a0: 74 4f 72 64 65 72 20 5e 20 70 54 65 72 6d 2d 3e  tOrder ^ pTerm->
c1b0: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69  sortOrder;.    i
c1c0: 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20  f( i>nEqCol ){. 
c1d0: 20 20 20 20 20 69 66 28 20 74 65 72 6d 53 6f 72       if( termSor
c1e0: 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65  tOrder!=sortOrde
c1f0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  r ){.        /* 
c200: 49 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79  Indices can only
c210: 20 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20   be used if all 
c220: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 70  ORDER BY terms p
c230: 61 73 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  ast the.        
c240: 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ** equality cons
c250: 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20  traints are all 
c260: 65 69 74 68 65 72 20 44 45 53 43 20 6f 72 20 41  either DESC or A
c270: 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  SC. */.        r
c280: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
c290: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c2a0: 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 74 65    sortOrder = te
c2b0: 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  rmSortOrder;.   
c2c0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20   }.    j++;.    
c2d0: 70 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66 28  pTerm++;.    if(
c2e0: 20 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 72   iColumn<0 && !r
c2f0: 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61  eferencesOtherTa
c300: 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70  bles(pOrderBy, p
c310: 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65  MaskSet, j, base
c320: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
c330: 20 74 68 65 20 69 6e 64 65 78 65 64 20 63 6f 6c   the indexed col
c340: 75 6d 6e 20 69 73 20 74 68 65 20 70 72 69 6d 61  umn is the prima
c350: 72 79 20 6b 65 79 20 61 6e 64 20 65 76 65 72 79  ry key and every
c360: 74 68 69 6e 67 20 6d 61 74 63 68 65 73 0a 20 20  thing matches.  
c370: 20 20 20 20 2a 2a 20 73 6f 20 66 61 72 20 61 6e      ** so far an
c380: 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52  d none of the OR
c390: 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
c3a0: 74 68 65 20 72 69 67 68 74 20 72 65 66 65 72 65  the right refere
c3b0: 6e 63 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20  nce other.      
c3c0: 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ** tables in the
c3d0: 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20 61   join, then we a
c3e0: 72 65 20 61 73 73 75 72 65 64 20 74 68 61 74 20  re assured that 
c3f0: 74 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65  the index can be
c400: 20 75 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20   used .      ** 
c410: 74 6f 20 73 6f 72 74 20 62 65 63 61 75 73 65 20  to sort because 
c420: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
c430: 69 73 20 75 6e 69 71 75 65 20 61 6e 64 20 73 6f  is unique and so
c440: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74 68   none of the oth
c450: 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  er.      ** colu
c460: 6d 6e 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61 6e  mns will make an
c470: 79 20 64 69 66 66 65 72 65 6e 63 65 0a 20 20 20  y difference.   
c480: 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20     */.      j = 
c490: 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  nTerm;.    }.  }
c4a0: 0a 0a 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72  ..  *pbRev = sor
c4b0: 74 4f 72 64 65 72 21 3d 30 3b 0a 20 20 69 66 28  tOrder!=0;.  if(
c4c0: 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20   j>=nTerm ){.   
c4d0: 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66   /* All terms of
c4e0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
c4f0: 61 75 73 65 20 61 72 65 20 63 6f 76 65 72 65 64  ause are covered
c500: 20 62 79 20 74 68 69 73 20 69 6e 64 65 78 20 73   by this index s
c510: 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 6e  o.    ** this in
c520: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
c530: 66 6f 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a  for sorting. */.
c540: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
c550: 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e  }.  if( pIdx->on
c560: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26  Error!=OE_None &
c570: 26 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  & i==pIdx->nColu
c580: 6d 6e 0a 20 20 20 20 20 20 26 26 20 21 72 65 66  mn.      && !ref
c590: 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c  erencesOtherTabl
c5a0: 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61  es(pOrderBy, pMa
c5b0: 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20  skSet, j, base) 
c5c0: 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65  ){.    /* All te
c5d0: 72 6d 73 20 6f 66 20 74 68 69 73 20 69 6e 64 65  rms of this inde
c5e0: 78 20 6d 61 74 63 68 20 73 6f 6d 65 20 70 72 65  x match some pre
c5f0: 66 69 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52  fix of the ORDER
c600: 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a   BY clause.    *
c610: 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  * and the index 
c620: 69 73 20 55 4e 49 51 55 45 20 61 6e 64 20 6e 6f  is UNIQUE and no
c630: 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 74 61   terms on the ta
c640: 69 6c 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  il of the ORDER 
c650: 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  BY.    ** clause
c660: 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65 72   reference other
c670: 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
c680: 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61  n.  If this is a
c690: 6c 6c 20 74 72 75 65 20 74 68 65 6e 0a 20 20 20  ll true then.   
c6a0: 20 2a 2a 20 74 68 65 20 6f 72 64 65 72 20 62 79   ** the order by
c6b0: 20 63 6c 61 75 73 65 20 69 73 20 73 75 70 65 72   clause is super
c6c0: 66 6c 75 6f 75 73 2e 20 2a 2f 0a 20 20 20 20 72  fluous. */.    r
c6d0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
c6e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
c6f0: 2a 20 43 68 65 63 6b 20 74 61 62 6c 65 20 74 6f  * Check table to
c700: 20 73 65 65 20 69 66 20 74 68 65 20 4f 52 44 45   see if the ORDE
c710: 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70  R BY clause in p
c720: 4f 72 64 65 72 42 79 20 63 61 6e 20 62 65 20 73  OrderBy can be s
c730: 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 73  atisfied.** by s
c740: 6f 72 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  orting in order 
c750: 6f 66 20 52 4f 57 49 44 2e 20 20 52 65 74 75 72  of ROWID.  Retur
c760: 6e 20 74 72 75 65 20 69 66 20 73 6f 20 61 6e 64  n true if so and
c770: 20 73 65 74 20 2a 70 62 52 65 76 20 74 6f 20 62   set *pbRev to b
c780: 65 0a 2a 2a 20 74 72 75 65 20 66 6f 72 20 72 65  e.** true for re
c790: 76 65 72 73 65 20 52 4f 57 49 44 20 61 6e 64 20  verse ROWID and 
c7a0: 66 61 6c 73 65 20 66 6f 72 20 66 6f 72 77 61 72  false for forwar
c7b0: 64 20 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a 2a  d ROWID order..*
c7c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72  /.static int sor
c7d0: 74 61 62 6c 65 42 79 52 6f 77 69 64 28 0a 20 20  tableByRowid(.  
c7e0: 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20  int base,       
c7f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
c800: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62  r number for tab
c810: 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  le to be sorted 
c820: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c830: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
c840: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
c850: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  use */.  WhereMa
c860: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
c870: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
c880: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73 20 74   table cursors t
c890: 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 69  o bitmaps */.  i
c8a0: 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20 20  nt *pbRev       
c8b0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
c8c0: 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20 69   1 if ORDER BY i
c8d0: 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 45  s DESC */.){.  E
c8e0: 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72  xpr *p;..  asser
c8f0: 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
c900: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
c910: 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  erBy->nExpr>0 );
c920: 0a 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d  .  p = pOrderBy-
c930: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
c940: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
c950: 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  UMN && p->iTable
c960: 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e 69 43 6f  ==base && p->iCo
c970: 6c 75 6d 6e 3d 3d 2d 31 0a 20 20 20 20 26 26 20  lumn==-1.    && 
c980: 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72  !referencesOther
c990: 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c  Tables(pOrderBy,
c9a0: 20 70 4d 61 73 6b 53 65 74 2c 20 31 2c 20 62 61   pMaskSet, 1, ba
c9b0: 73 65 29 20 29 7b 0a 20 20 20 20 2a 70 62 52 65  se) ){.    *pbRe
c9c0: 76 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  v = pOrderBy->a[
c9d0: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  0].sortOrder;.  
c9e0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
c9f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
ca00: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63  *.** Prepare a c
ca10: 72 75 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66  rude estimate of
ca20: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
ca30: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
ca40: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  e..** The result
ca50: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78  s need not be ex
ca60: 61 63 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  act.  This is on
ca70: 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73 74 69  ly used for esti
ca80: 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f  mating.** the to
ca90: 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66  tal cost of perf
caa0: 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  orming operation
cab0: 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f  s with O(logN) o
cac0: 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f  r O(NlogN).** co
cad0: 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75  mplexity.  Becau
cae0: 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67  se N is just a g
caf0: 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67  uess, it is no g
cb00: 72 65 61 74 20 74 72 61 67 65 64 79 20 69 66 0a  reat tragedy if.
cb10: 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74  ** logN is a lit
cb20: 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  tle off..*/.stat
cb30: 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67  ic double estLog
cb40: 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f  (double N){.  do
cb50: 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20  uble logN = 1;. 
cb60: 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a   double x = 10;.
cb70: 20 20 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a    while( N>x ){.
cb80: 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20      logN += 1;. 
cb90: 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a     x *= 10;.  }.
cba0: 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d    return logN;.}
cbb0: 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74  ../*.** Two rout
cbc0: 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e  ines for printin
cbd0: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
cbe0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
cbf0: 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  x_info.** struct
cc00: 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74  ure.  Used for t
cc10: 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
cc20: 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e  ging only.  If n
cc30: 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45  either.** SQLITE
cc40: 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f  _TEST or SQLITE_
cc50: 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65  DEBUG are define
cc60: 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f  d, then these ro
cc70: 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f  utines.** are no
cc80: 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  -ops..*/.#if !de
cc90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
cca0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
ccb0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
ccc0: 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
ccd0: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49  void TRACE_IDX_I
cce0: 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e  NPUTS(sqlite3_in
ccf0: 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
cd00: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71  int i;.  if( !sq
cd10: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
cd20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
cd30: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
cd40: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
cd50: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
cd60: 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e  ntf("  constrain
cd70: 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65  t[%d]: col=%d te
cd80: 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73  rmid=%d op=%d us
cd90: 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  abled=%d\n",.   
cda0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
cdb0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
cdc0: 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
cdd0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
cde0: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20  ].iTermOffset,. 
cdf0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
ce00: 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20  aint[i].op,.    
ce10: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
ce20: 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20  t[i].usable);.  
ce30: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
ce40: 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  ->nOrderBy; i++)
ce50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
ce60: 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65  ugPrintf("  orde
ce70: 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20  rby[%d]: col=%d 
ce80: 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  desc=%d\n",.    
ce90: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
cea0: 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  aOrderBy[i].iCol
ceb0: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
cec0: 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29  OrderBy[i].desc)
ced0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
cee0: 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  oid TRACE_IDX_OU
cef0: 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e  TPUTS(sqlite3_in
cf00: 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
cf10: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71  int i;.  if( !sq
cf20: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
cf30: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
cf40: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
cf50: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
cf60: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
cf70: 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d  ntf("  usage[%d]
cf80: 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69  : argvIdx=%d omi
cf90: 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
cfa0: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
cfb0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
cfc0: 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20  .argvIndex,.    
cfd0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
cfe0: 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b  tUsage[i].omit);
cff0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
d000: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
d010: 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64  Num=%d\n", p->id
d020: 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  xNum);.  sqlite3
d030: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
d040: 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e  dxStr=%s\n", p->
d050: 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  idxStr);.  sqlit
d060: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d070: 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64   orderByConsumed
d080: 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72  =%d\n", p->order
d090: 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73  ByConsumed);.  s
d0a0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d0b0: 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f  f("  estimatedCo
d0c0: 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74  st=%g\n", p->est
d0d0: 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23  imatedCost);.}.#
d0e0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
d0f0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29  CE_IDX_INPUTS(A)
d100: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
d110: 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65  DX_OUTPUTS(A).#e
d120: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
d130: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
d140: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f 6d  LTABLE./*.** Com
d150: 70 75 74 65 20 74 68 65 20 62 65 73 74 20 69 6e  pute the best in
d160: 64 65 78 20 66 6f 72 20 61 20 76 69 72 74 75 61  dex for a virtua
d170: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  l table..**.** T
d180: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 69 73  he best index is
d190: 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65   computed by the
d1a0: 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
d1b0: 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
d1c0: 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75 6c  l.** table modul
d1d0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
d1e0: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
d1f0: 61 20 77 72 61 70 70 65 72 20 74 68 61 74 20 73  a wrapper that s
d200: 65 74 73 20 75 70 0a 2a 2a 20 74 68 65 20 73 71  ets up.** the sq
d210: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d220: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
d230: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75  is used to commu
d240: 6e 69 63 61 74 65 20 77 69 74 68 0a 2a 2a 20 78  nicate with.** x
d250: 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  BestIndex..**.**
d260: 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69 73   In a join, this
d270: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 62   routine might b
d280: 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70 6c  e called multipl
d290: 65 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 0a  e times for the.
d2a0: 2a 2a 20 73 61 6d 65 20 76 69 72 74 75 61 6c 20  ** same virtual 
d2b0: 74 61 62 6c 65 2e 20 20 54 68 65 20 73 71 6c 69  table.  The sqli
d2c0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
d2d0: 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
d2e0: 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  ted.** and initi
d2f0: 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65 20 66 69  alized on the fi
d300: 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  rst invocation a
d310: 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 61 6c 6c  nd reused on all
d320: 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69   subsequent.** i
d330: 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 65  nvocations.  The
d340: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
d350: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
d360: 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 0a   also used when.
d370: 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  ** code is gener
d380: 61 74 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  ated to access t
d390: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
d3a0: 2e 20 20 54 68 65 20 77 68 65 72 65 49 6e 66 6f  .  The whereInfo
d3b0: 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f 75  Delete() .** rou
d3c0: 74 69 6e 65 20 74 61 6b 65 73 20 63 61 72 65 20  tine takes care 
d3d0: 6f 66 20 66 72 65 65 69 6e 67 20 74 68 65 20 73  of freeing the s
d3e0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
d3f0: 6f 20 73 74 72 75 63 74 75 72 65 20 61 66 74 65  o structure afte
d400: 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64 79 20 68  r.** everybody h
d410: 61 73 20 66 69 6e 69 73 68 65 64 20 77 69 74 68  as finished with
d420: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64   it..*/.static d
d430: 6f 75 62 6c 65 20 62 65 73 74 56 69 72 74 75 61  ouble bestVirtua
d440: 6c 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  lIndex(.  Parse 
d450: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d460: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d470: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
d480: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
d490: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
d4a0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
d4b0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
d4c0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
d4d0: 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
d4e0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
d4f0: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
d500: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
d510: 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  ady,            
d520: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
d530: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
d540: 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
d550: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
d560: 72 42 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  rBy,            
d570: 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79 20  /* The order by 
d580: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
d590: 6f 72 64 65 72 42 79 55 73 61 62 6c 65 2c 20 20  orderByUsable,  
d5a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
d5b0: 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 6f 74  ue if we can pot
d5c0: 65 6e 74 69 61 6c 20 73 6f 72 74 20 2a 2f 0a 20  ential sort */. 
d5d0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
d5e0: 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20  nfo **ppIdxInfo 
d5f0: 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61  /* Index informa
d600: 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78  tion passed to x
d610: 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b 0a  BestIndex */.){.
d620: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
d630: 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71  pSrc->pTab;.  sq
d640: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
d650: 62 20 3d 20 70 54 61 62 2d 3e 70 56 74 61 62 3b  b = pTab->pVtab;
d660: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
d670: 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
d680: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
d690: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
d6a0: 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
d6b0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
d6c0: 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
d6d0: 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
d6e0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
d6f0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
d700: 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
d710: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
d720: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
d730: 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  t nOrderBy;.  in
d740: 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  t rc;..  /* If t
d750: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
d760: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
d770: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65  has not been pre
d780: 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c  viously.  ** all
d790: 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69  ocated and initi
d7a0: 61 6c 69 7a 65 64 20 66 6f 72 20 74 68 69 73 20  alized for this 
d7b0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 74  virtual table, t
d7c0: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a  hen allocate.  *
d7d0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
d7e0: 20 69 74 20 6e 6f 77 0a 20 20 2a 2f 0a 20 20 70   it now.  */.  p
d7f0: 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64 78  IdxInfo = *ppIdx
d800: 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78  Info;.  if( pIdx
d810: 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Info==0 ){.    i
d820: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 57 48  nt nTerm;.    WH
d830: 45 52 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d  ERETRACE(("Recom
d840: 70 75 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66  puting index inf
d850: 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20  o for %s...\n", 
d860: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  pTab->zName));..
d870: 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65      /* Count the
d880: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69   number of possi
d890: 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
d8a0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66   constraints ref
d8b0: 65 72 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f  erring.    ** to
d8c0: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
d8d0: 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ble */.    for(i
d8e0: 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d  =nTerm=0, pTerm=
d8f0: 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
d900: 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
d910: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
d920: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
d930: 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
d940: 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
d950: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
d960: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70  rm->eOperator&(p
d970: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d  Term->eOperator-
d980: 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  1))==0 );.      
d990: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
d9a0: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
d9b0: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
d9c0: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
d9d0: 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c  rator==WO_ISNULL
d9e0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
d9f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
da00: 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c   (WO_IN|WO_ISNUL
da10: 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
da20: 20 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20       nTerm++;.  
da30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
da40: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
da50: 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
da60: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
da70: 63 75 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20  current .    ** 
da80: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
da90: 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  en allocate spac
daa0: 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72  e for the aOrder
dab0: 42 79 20 70 61 72 74 20 6f 66 0a 20 20 20 20 2a  By part of.    *
dac0: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
dad0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
dae0: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  re..    */.    n
daf0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
db00: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
db10: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
db20: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
db30: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
db40: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
db50: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
db60: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
db70: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
db80: 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
db90: 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
dba0: 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
dbb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
dbc0: 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e 45   i==pOrderBy->nE
dbd0: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  xpr ){.        n
dbe0: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
dbf0: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
dc00: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
dc10: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
dc20: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
dc30: 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a   structure.    *
dc40: 2f 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 20 3d  /.    pIdxInfo =
dc50: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
dc60: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
dc70: 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66   sizeof(*pIdxInf
dc80: 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o).             
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43  + (sizeof(*pIdxC
dcb0: 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  ons) + sizeof(*p
dcc0: 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20  Usage))*nTerm.  
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
dcf0: 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79  eof(*pIdxOrderBy
dd00: 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  )*nOrderBy );.  
dd10: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
dd20: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
dd30: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
dd40: 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  e, "out of memor
dd50: 79 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  y");.      retur
dd60: 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 0a 20 20 20  n 0.0;.    }.   
dd70: 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49   *ppIdxInfo = pI
dd80: 64 78 49 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20  dxInfo;..    /* 
dd90: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
dda0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73  tructure.  The s
ddb0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
ddc0: 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  o structure cont
ddd0: 61 69 6e 73 0a 20 20 20 20 2a 2a 20 6d 61 6e 79  ains.    ** many
dde0: 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
ddf0: 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
de00: 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
de10: 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 20  stIndex from.   
de20: 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65   ** changing the
de30: 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  m.  We have to d
de40: 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73  o some funky cas
de50: 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f  ting in order to
de60: 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  .    ** initiali
de70: 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e  ze those fields.
de80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78  .    */.    pIdx
de90: 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73  Cons = (struct s
dea0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
deb0: 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e  straint*)&pIdxIn
dec0: 66 6f 5b 31 5d 3b 0a 20 20 20 20 70 49 64 78 4f  fo[1];.    pIdxO
ded0: 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74  rderBy = (struct
dee0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
def0: 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e  rderby*)&pIdxCon
df00: 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 70 55  s[nTerm];.    pU
df10: 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73  sage = (struct s
df20: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
df30: 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26  straint_usage*)&
df40: 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64  pIdxOrderBy[nOrd
df50: 65 72 42 79 5d 3b 0a 20 20 20 20 2a 28 69 6e 74  erBy];.    *(int
df60: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  *)&pIdxInfo->nCo
df70: 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d  nstraint = nTerm
df80: 3b 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49  ;.    *(int*)&pI
df90: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
dfa0: 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20   = nOrderBy;.   
dfb0: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
dfc0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
dfd0: 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
dfe0: 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  aConstraint = pI
dff0: 64 78 43 6f 6e 73 3b 0a 20 20 20 20 2a 28 73 74  dxCons;.    *(st
e000: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
e010: 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49  ex_orderby**)&pI
e020: 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  dxInfo->aOrderBy
e030: 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a   = pIdxOrderBy;.
e040: 20 20 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c      *(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 2a 29 26 70  raint_usage**)&p
e070: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
e080: 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20  aintUsage =.    
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 70 55 73 61 67 65 3b 0a 0a 20 20 20 20 66 6f   pUsage;..    fo
e0e0: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
e0f0: 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
e100: 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
e110: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54  +){.      if( pT
e120: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
e130: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
e140: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
e150: 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
e160: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54  m->eOperator&(pT
e170: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31  erm->eOperator-1
e180: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  ))==0 );.      t
e190: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
e1a0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
e1b0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e1c0: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
e1d0: 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  ator==WO_ISNULL 
e1e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
e1f0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
e200: 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_IN|WO_ISNULL
e210: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
e220: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
e230: 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d  iColumn = pTerm-
e240: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
e250: 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d       pIdxCons[j]
e260: 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69  .iTermOffset = i
e270: 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73  ;.      pIdxCons
e280: 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 70 54 65  [j].op = (u8)pTe
e290: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20  rm->eOperator;. 
e2a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65       /* The dire
e2b0: 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e  ct assignment in
e2c0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   the previous li
e2d0: 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f  ne is possible o
e2e0: 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20  nly because.    
e2f0: 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
e300: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
e310: 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
e320: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
e330: 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c  The.      ** fol
e340: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
e350: 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
e360: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
e370: 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f  ( WO_EQ==SQLITE_
e380: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
e390: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _EQ );.      ass
e3a0: 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
e3b0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
e3c0: 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  INT_LT );.      
e3d0: 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53  assert( WO_LE==S
e3e0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
e3f0: 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20  TRAINT_LE );.   
e400: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54     assert( WO_GT
e410: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
e420: 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a  ONSTRAINT_GT );.
e430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
e440: 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GE==SQLITE_INDE
e450: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20  X_CONSTRAINT_GE 
e460: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e470: 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54   WO_MATCH==SQLIT
e480: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
e490: 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20  NT_MATCH );.    
e4a0: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
e4b0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
e4c0: 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _EQ|WO_LT|WO_LE|
e4d0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d  WO_GT|WO_GE|WO_M
e4e0: 41 54 43 48 29 20 29 3b 0a 20 20 20 20 20 20 6a  ATCH) );.      j
e4f0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ++;.    }.    fo
e500: 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
e510: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  y; i++){.      E
e520: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
e530: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
e540: 72 3b 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64  r;.      pIdxOrd
e550: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20  erBy[i].iColumn 
e560: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
e570: 3b 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64 65  ;.      pIdxOrde
e580: 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
e590: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
e5a0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
e5b0: 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  }..  /* At this 
e5c0: 70 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  point, the sqlit
e5d0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
e5e0: 72 75 63 74 75 72 65 20 74 68 61 74 20 70 49 64  ructure that pId
e5f0: 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a  xInfo points.  *
e600: 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76 65 20 62  * to will have b
e610: 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  een initialized,
e620: 20 65 69 74 68 65 72 20 64 75 72 69 6e 67 20 74   either during t
e630: 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63  he current invoc
e640: 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75  ation or.  ** du
e650: 72 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72 20  ring some prior 
e660: 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77  invocation.  Now
e670: 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f   we just have to
e680: 20 63 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20   customize the. 
e690: 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 70   ** details of p
e6a0: 49 64 78 49 6e 66 6f 20 66 6f 72 20 74 68 65 20  IdxInfo for the 
e6b0: 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69  current invocati
e6c0: 6f 6e 20 61 6e 64 20 70 61 73 73 20 69 74 20 74  on and pass it t
e6d0: 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65  o.  ** xBestInde
e6e0: 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  x..  */..  /* Th
e6f0: 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75  e module name mu
e700: 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 20 41  st be defined. A
e710: 6c 73 6f 2c 20 62 79 20 74 68 69 73 20 70 6f 69  lso, by this poi
e720: 6e 74 20 74 68 65 72 65 20 6d 75 73 74 0a 20 20  nt there must.  
e730: 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  ** be a pointer 
e740: 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  to an sqlite3_vt
e750: 61 62 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74  ab structure. Ot
e760: 68 65 72 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c  herwise.  ** sql
e770: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
e780: 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64 20 68  nNames() would h
e790: 61 76 65 20 70 69 63 6b 65 64 20 75 70 20 74 68  ave picked up th
e7a0: 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20  e error. .  */. 
e7b0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61   assert( pTab->a
e7c0: 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54  zModuleArg && pT
e7d0: 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b  ab->azModuleArg[
e7e0: 30 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0] );.  assert( 
e7f0: 70 56 74 61 62 20 29 3b 0a 23 69 66 20 30 0a 20  pVtab );.#if 0. 
e800: 20 69 66 28 20 70 54 61 62 2d 3e 70 56 74 61 62   if( pTab->pVtab
e810: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
e820: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
e830: 65 2c 20 22 75 6e 64 65 66 69 6e 65 64 20 6d 6f  e, "undefined mo
e840: 64 75 6c 65 20 25 73 20 66 6f 72 20 74 61 62 6c  dule %s for tabl
e850: 65 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  e %s",.        p
e860: 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67  Tab->azModuleArg
e870: 5b 30 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  [0], pTab->zName
e880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 2e  );.    return 0.
e890: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  0;.  }.#endif.. 
e8a0: 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f 6e   /* Set the aCon
e8b0: 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65  straint[].usable
e8c0: 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69 74   fields and init
e8d0: 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a  ialize all .  **
e8e0: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
e8f0: 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  s to zero..  **.
e900: 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74    ** aConstraint
e910: 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75  [].usable is tru
e920: 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  e for constraint
e930: 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  s where the righ
e940: 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65  t-hand.  ** side
e950: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72   contains only r
e960: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
e970: 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
e980: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  of the current. 
e990: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f   ** table.  In o
e9a0: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
e9b0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
e9c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
e9d0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
e9e0: 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a    column = expr.
e9f0: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65    **.  ** and we
ea00: 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
ea10: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65  a join, then the
ea20: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63   constraint on c
ea30: 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f  olumn is .  ** o
ea40: 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c  nly valid if all
ea50: 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63   tables referenc
ea60: 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72  ed in expr occur
ea70: 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
ea80: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
ea90: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
eaa0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
eab0: 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61  aConstraints[] a
eac0: 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e  rray contains en
ead0: 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  tries for all co
eae0: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f  nstraints.  ** o
eaf0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
eb00: 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20 77  ble.  That way w
eb10: 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20 63  e only have to c
eb20: 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a 20  ompute it once. 
eb30: 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20   ** even though 
eb40: 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20  we might try to 
eb50: 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e  pick the best in
eb60: 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  dex multiple tim
eb70: 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63  es..  ** For eac
eb80: 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69 63  h attempt at pic
eb90: 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 74  king an index, t
eba0: 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c  he order of tabl
ebb0: 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a  es in the.  ** j
ebc0: 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66  oin might be dif
ebd0: 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76  ferent so we hav
ebe0: 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  e to recompute t
ebf0: 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20  he usable flag. 
ec00: 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20   ** each time.. 
ec10: 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   */.  pIdxCons =
ec20: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
ec30: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
ec40: 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
ec50: 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70  aConstraint;.  p
ec60: 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
ec70: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
ec80: 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ge;.  for(i=0; i
ec90: 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
eca0: 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
ecb0: 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20  xCons++){.    j 
ecc0: 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
ecd0: 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54 65  mOffset;.    pTe
ece0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
ecf0: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75  .    pIdxCons->u
ed00: 73 61 62 6c 65 20 3d 20 20 28 70 54 65 72 6d 2d  sable =  (pTerm-
ed10: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
ed20: 6f 74 52 65 61 64 79 29 3d 3d 30 20 3f 31 3a 30  otReady)==0 ?1:0
ed30: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
ed40: 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Usage, 0, sizeof
ed50: 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78  (pUsage[0])*pIdx
ed60: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
ed70: 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  t);.  if( pIdxIn
ed80: 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
ed90: 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  xStr ){.    sqli
eda0: 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
edb0: 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a  o->idxStr);.  }.
edc0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53    pIdxInfo->idxS
edd0: 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  tr = 0;.  pIdxIn
ede0: 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
edf0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
ee00: 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
ee10: 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72  ;.  pIdxInfo->or
ee20: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
ee30: 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  0;.  pIdxInfo->e
ee40: 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53  stimatedCost = S
ee50: 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20  QLITE_BIG_DBL / 
ee60: 32 2e 30 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  2.0;.  nOrderBy 
ee70: 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  = pIdxInfo->nOrd
ee80: 65 72 42 79 3b 0a 20 20 69 66 28 20 70 49 64 78  erBy;.  if( pIdx
ee90: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 26  Info->nOrderBy &
eea0: 26 20 21 6f 72 64 65 72 42 79 55 73 61 62 6c 65  & !orderByUsable
eeb0: 20 29 7b 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26   ){.    *(int*)&
eec0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
eed0: 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 28  By = 0;.  }..  (
eee0: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
eef0: 74 79 4f 66 66 28 70 50 61 72 73 65 2d 3e 64 62  tyOff(pParse->db
ef00: 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
ef10: 28 22 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72  ("xBestIndex for
ef20: 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   %s\n", pTab->zN
ef30: 61 6d 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49  ame));.  TRACE_I
ef40: 44 58 5f 49 4e 50 55 54 53 28 70 49 64 78 49 6e  DX_INPUTS(pIdxIn
ef50: 66 6f 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61  fo);.  rc = pVta
ef60: 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73  b->pModule->xBes
ef70: 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 49  tIndex(pVtab, pI
ef80: 64 78 49 6e 66 6f 29 3b 0a 20 20 54 52 41 43 45  dxInfo);.  TRACE
ef90: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 49 64  _IDX_OUTPUTS(pId
efa0: 78 49 6e 66 6f 29 3b 0a 20 20 28 76 6f 69 64 29  xInfo);.  (void)
efb0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
efc0: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 0a 20 20  pParse->db);..  
efd0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
efe0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
eff0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
f000: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
f010: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f020: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
f030: 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d  f( !pVtab->zErrM
f040: 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  sg ){.      sqli
f050: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f060: 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  se, "%s", sqlite
f070: 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20  3ErrStr(rc));.  
f080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
f090: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f0a0: 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74  Parse, "%s", pVt
f0b0: 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
f0c0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
f0d0: 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
f0e0: 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  db, pVtab->zErrM
f0f0: 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45  sg);.  pVtab->zE
f100: 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f  rrMsg = 0;..  fo
f110: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
f120: 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
f130: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70  i++){.    if( !p
f140: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
f150: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26  aint[i].usable &
f160: 26 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  & pUsage[i].argv
f170: 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
f180: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f190: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
f1a0: 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78      "table %s: x
f1b0: 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e  BestIndex return
f1c0: 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c  ed an invalid pl
f1d0: 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  an", pTab->zName
f1e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f1f0: 30 2e 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  0.0;.    }.  }..
f200: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
f210: 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
f220: 4f 72 64 65 72 42 79 3b 0a 20 20 72 65 74 75 72  OrderBy;.  retur
f230: 6e 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  n pIdxInfo->esti
f240: 6d 61 74 65 64 43 6f 73 74 3b 0a 7d 0a 23 65 6e  matedCost;.}.#en
f250: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
f260: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
f270: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  */../*.** Find t
f280: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f  he query plan fo
f290: 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70 61  r accessing a pa
f2a0: 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20  rticular table. 
f2b0: 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65   Write the.** be
f2c0: 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e  st query plan an
f2d0: 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20  d its cost into 
f2e0: 74 68 65 20 57 68 65 72 65 43 6f 73 74 20 6f 62  the WhereCost ob
f2f0: 6a 65 63 74 20 73 75 70 70 6c 69 65 64 20 61 73  ject supplied as
f300: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 72   the.** last par
f310: 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ameter..**.** Th
f320: 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 6c  e lowest cost pl
f330: 61 6e 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f  an wins.  The co
f340: 73 74 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  st is an estimat
f350: 65 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20  e of the amount 
f360: 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69  of.** CPU and di
f370: 73 6b 20 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70  sk I/O need to p
f380: 72 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65  rocess the reque
f390: 73 74 20 75 73 69 6e 67 20 74 68 65 20 73 65 6c  st using the sel
f3a0: 65 63 74 65 64 20 70 6c 61 6e 2e 0a 2a 2a 20 46  ected plan..** F
f3b0: 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c  actors that infl
f3c0: 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75  uence cost inclu
f3d0: 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  de:.**.**    *  
f3e0: 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  The estimated nu
f3f0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
f400: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  t will be retrie
f410: 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20  ved.  (The.**   
f420: 20 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65      fewer the be
f430: 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  tter.).**.**    
f440: 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  *  Whether or no
f450: 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f  t sorting must o
f460: 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ccur..**.**    *
f470: 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
f480: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73   there must be s
f490: 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20  eparate lookups 
f4a0: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
f4b0: 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65  index and in the
f4c0: 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a   main table..**.
f4d0: 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  ** If there was 
f4e0: 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
f4f0: 61 75 73 65 20 61 74 74 61 63 68 65 64 20 74 6f  ause attached to
f500: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   the table in th
f510: 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  e SELECT.** stat
f520: 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  ement, then this
f530: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 63   function only c
f540: 6f 6e 73 69 64 65 72 73 20 70 6c 61 6e 73 20 75  onsiders plans u
f550: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 6e 61 6d  sing the .** nam
f560: 65 64 20 69 6e 64 65 78 2e 20 49 66 20 6f 6e 65  ed index. If one
f570: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
f580: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
f590: 6e 65 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53  ned cost is.** S
f5a0: 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49  QLITE_BIG_DBL. I
f5b0: 66 20 61 20 70 6c 61 6e 20 63 61 6e 20 62 65 20  f a plan can be 
f5c0: 66 6f 75 6e 64 20 74 68 61 74 20 75 73 65 73 20  found that uses 
f5d0: 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 2c  the named index,
f5e0: 20 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 6f   .** then the co
f5f0: 73 74 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  st is calculated
f600: 20 69 6e 20 74 68 65 20 75 73 75 61 6c 20 77 61   in the usual wa
f610: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4e 4f  y..**.** If a NO
f620: 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
f630: 20 77 61 73 20 61 74 74 61 63 68 65 64 20 74 6f   was attached to
f640: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   the table in th
f650: 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61  e SELECT .** sta
f660: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 6e 6f 20  tement, then no 
f670: 69 6e 64 65 78 65 73 20 61 72 65 20 63 6f 6e 73  indexes are cons
f680: 69 64 65 72 65 64 2e 20 48 6f 77 65 76 65 72 2c  idered. However,
f690: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 0a 2a   the selected .*
f6a0: 2a 20 70 6c 61 6e 20 6d 61 79 20 73 74 69 6c 6c  * plan may still
f6b0: 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   take advantage 
f6c0: 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 62 75  of the tables bu
f6d0: 69 6c 74 2d 69 6e 20 72 6f 77 69 64 0a 2a 2a 20  ilt-in rowid.** 
f6e0: 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
f6f0: 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28   void bestIndex(
f700: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f710: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f720: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
f730: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
f740: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
f750: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
f760: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
f770: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
f780: 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
f790: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
f7a0: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
f7b0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
f7c0: 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
f7d0: 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
f7e0: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
f7f0: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78  vailable */.  Ex
f800: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
f810: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
f820: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f830: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
f840: 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20  *pCost          
f850: 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74    /* Lowest cost
f860: 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29   query plan */.)
f870: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
f880: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
f890: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
f8a0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
f8b0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ause */.  int iC
f8c0: 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  ur = pSrc->iCurs
f8d0: 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72  or;   /* The cur
f8e0: 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  sor of the table
f8f0: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 20   to be accessed 
f900: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
f910: 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
f920: 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
f930: 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
f940: 2f 0a 20 20 69 6e 74 20 72 65 76 3b 20 20 20 20  /.  int rev;    
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f960: 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61 6e 20  /* True to scan 
f970: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
f980: 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67   */.  int wsFlag
f990: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
f9a0: 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63    /* Flags assoc
f9b0: 69 61 74 65 64 20 77 69 74 68 20 70 50 72 6f 62  iated with pProb
f9c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 3b 20  e */.  int nEq; 
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f9f0: 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
fa00: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 71  ints */.  int eq
fa10: 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20  TermMask;       
fa20: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
fa30: 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20   valid equality 
fa40: 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 64  operators */.  d
fa50: 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20  ouble cost;     
fa60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
fa70: 73 74 20 6f 66 20 75 73 69 6e 67 20 70 50 72 6f  st of using pPro
fa80: 62 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e  be */.  double n
fa90: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
faa0: 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
fab0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
fac0: 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  in result set */
fad0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
faf0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
fb00: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  /.  Bitmask mask
fb10: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
fb20: 2f 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20 74  /* Bitmask for t
fb30: 68 65 20 70 53 72 63 20 74 61 62 6c 65 20 2a 2f  he pSrc table */
fb40: 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  ..  WHERETRACE((
fb50: 22 62 65 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d  "bestIndex: tbl=
fb60: 25 73 20 6e 6f 74 52 65 61 64 79 3d 25 6c 6c 78  %s notReady=%llx
fb70: 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d  \n", pSrc->pTab-
fb80: 3e 7a 4e 61 6d 65 2c 6e 6f 74 52 65 61 64 79 29  >zName,notReady)
fb90: 29 3b 0a 20 20 70 50 72 6f 62 65 20 3d 20 70 53  );.  pProbe = pS
fba0: 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78  rc->pTab->pIndex
fbb0: 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f  ;.  if( pSrc->no
fbc0: 74 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20  tIndexed ){.    
fbd0: 70 50 72 6f 62 65 20 3d 20 30 3b 0a 20 20 7d 0a  pProbe = 0;.  }.
fbe0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62  .  /* If the tab
fbf0: 6c 65 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  le has no indice
fc00: 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
fc10: 6e 6f 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  no terms in the 
fc20: 77 68 65 72 65 0a 20 20 2a 2a 20 63 6c 61 75 73  where.  ** claus
fc30: 65 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  e that refer to 
fc40: 74 68 65 20 52 4f 57 49 44 2c 20 74 68 65 6e 20  the ROWID, then 
fc50: 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  we will never be
fc60: 20 61 62 6c 65 20 74 6f 20 64 6f 0a 20 20 2a 2a   able to do.  **
fc70: 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
fc80: 74 68 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c  than a full tabl
fc90: 65 20 73 63 61 6e 20 6f 6e 20 74 68 69 73 20 74  e scan on this t
fca0: 61 62 6c 65 2e 20 20 57 65 20 6d 69 67 68 74 20  able.  We might 
fcb0: 61 73 0a 20 20 2a 2a 20 77 65 6c 6c 20 70 75 74  as.  ** well put
fcc0: 20 69 74 20 66 69 72 73 74 20 69 6e 20 74 68 65   it first in the
fcd0: 20 6a 6f 69 6e 20 6f 72 64 65 72 2e 20 20 54 68   join order.  Th
fce0: 61 74 20 77 61 79 2c 20 70 65 72 68 61 70 73 20  at way, perhaps 
fcf0: 69 74 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 72  it can be.  ** r
fd00: 65 66 65 72 65 6e 63 65 64 20 62 79 20 6f 74 68  eferenced by oth
fd10: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  er tables in the
fd20: 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 6d 65   join..  */.  me
fd30: 6d 73 65 74 28 70 43 6f 73 74 2c 20 30 2c 20 73  mset(pCost, 0, s
fd40: 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a  izeof(*pCost));.
fd50: 20 20 69 66 28 20 70 50 72 6f 62 65 3d 3d 30 20    if( pProbe==0 
fd60: 26 26 0a 20 20 20 20 20 66 69 6e 64 54 65 72 6d  &&.     findTerm
fd70: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
fd80: 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57  0, WO_EQ|WO_IN|W
fd90: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
fda0: 7c 57 4f 5f 47 45 2c 30 29 3d 3d 30 20 26 26 0a  |WO_GE,0)==0 &&.
fdb0: 20 20 20 20 20 28 70 4f 72 64 65 72 42 79 3d 3d       (pOrderBy==
fdc0: 30 20 7c 7c 20 21 73 6f 72 74 61 62 6c 65 42 79  0 || !sortableBy
fdd0: 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64  Rowid(iCur, pOrd
fde0: 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61 73 6b  erBy, pWC->pMask
fdf0: 53 65 74 2c 20 26 72 65 76 29 29 20 29 7b 0a 20  Set, &rev)) ){. 
fe00: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
fe10: 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20   pCost->rCost = 
fe20: 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a  SQLITE_BIG_DBL;.
fe30: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
fe40: 61 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20  a rowid=EXPR or 
fe50: 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 63  rowid IN (...) c
fe60: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20 74  onstraints. If t
fe70: 68 65 72 65 20 77 61 73 0a 20 20 2a 2a 20 61 6e  here was.  ** an
fe80: 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
fe90: 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  se attached to t
fea0: 68 69 73 20 74 61 62 6c 65 2c 20 73 6b 69 70 20  his table, skip 
feb0: 74 68 69 73 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  this step..  */.
fec0: 20 20 69 66 28 20 21 70 53 72 63 2d 3e 70 49 6e    if( !pSrc->pIn
fed0: 64 65 78 20 29 7b 0a 20 20 20 20 70 54 65 72 6d  dex ){.    pTerm
fee0: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
fef0: 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
ff00: 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
ff10: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
ff20: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  erm ){.      Exp
ff30: 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 20 20  r *pExpr;.      
ff40: 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
ff50: 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49  ags = WHERE_ROWI
ff60: 44 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20  D_EQ;.      if( 
ff70: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
ff80: 20 26 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20   & WO_EQ ){.    
ff90: 20 20 20 20 2f 2a 20 52 6f 77 69 64 3d 3d 20 69      /* Rowid== i
ffa0: 73 20 61 6c 77 61 79 73 20 74 68 65 20 62 65 73  s always the bes
ffb0: 74 20 70 69 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f  t pick.  Look no
ffc0: 20 66 75 72 74 68 65 72 2e 20 20 42 65 63 61 75   further.  Becau
ffd0: 73 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20  se only.        
ffe0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ** a single row 
fff0: 69 73 20 67 65 6e 65 72 61 74 65 64 2c 20 6f 75  is generated, ou
10000 74 70 75 74 20 69 73 20 61 6c 77 61 79 73 20 69  tput is always i
10010 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a  n sorted order *
10020 2f 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  /.        pCost-
10030 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20  >plan.wsFlags = 
10040 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 7c  WHERE_ROWID_EQ |
10050 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20   WHERE_UNIQUE;. 
10060 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c         pCost->pl
10070 61 6e 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  an.nEq = 1;.    
10080 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
10090 22 2e 2e 2e 20 62 65 73 74 20 69 73 20 72 6f 77  "... best is row
100a0 69 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  id\n"));.       
100b0 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20   pCost->rCost = 
100c0 30 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  0;.        pCost
100d0 2d 3e 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ->nRow = 1;.    
100e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
100f0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 45 78    }else if( (pEx
10100 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
10110 72 29 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a  r)->pList!=0 ){.
10120 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
10130 20 49 4e 20 28 4c 49 53 54 29 3a 20 63 6f 73 74   IN (LIST): cost
10140 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20   is NlogN where 
10150 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
10160 6f 66 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20  of list.        
10170 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 20 2a 2f  ** elements.  */
10180 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
10190 72 43 6f 73 74 20 3d 20 70 43 6f 73 74 2d 3e 6e  rCost = pCost->n
101a0 52 6f 77 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  Row = pExpr->pLi
101b0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
101c0 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
101d0 2a 3d 20 65 73 74 4c 6f 67 28 70 43 6f 73 74 2d  *= estLog(pCost-
101e0 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 7d  >rCost);.      }
101f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
10200 20 52 6f 77 69 64 20 49 4e 20 28 53 45 4c 45 43   Rowid IN (SELEC
10210 54 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67  T): cost is Nlog
10220 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  N where N is the
10230 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a   number of rows.
10240 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
10250 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
10260 69 6e 6e 65 72 20 73 65 6c 65 63 74 2e 20 20 57  inner select.  W
10270 65 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  e have no way to
10280 20 65 73 74 69 6d 61 74 65 0a 20 20 20 20 20 20   estimate.      
10290 20 20 2a 2a 20 74 68 61 74 20 76 61 6c 75 65 20    ** that value 
102a0 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64 20 67  so make a wild g
102b0 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  uess. */.       
102c0 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 31   pCost->nRow = 1
102d0 30 30 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73  00;.        pCos
102e0 74 2d 3e 72 43 6f 73 74 20 3d 20 32 30 30 3b 0a  t->rCost = 200;.
102f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48        }.      WH
10300 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 72  ERETRACE(("... r
10310 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a 20 25 2e  owid IN cost: %.
10320 39 67 5c 6e 22 2c 20 70 43 6f 73 74 2d 3e 72 43  9g\n", pCost->rC
10330 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  ost));.    }.  .
10340 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20      /* Estimate 
10350 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 74 61  the cost of a ta
10360 62 6c 65 20 73 63 61 6e 2e 20 20 49 66 20 77 65  ble scan.  If we
10370 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77   do not know how
10380 20 6d 61 6e 79 0a 20 20 20 20 2a 2a 20 65 6e 74   many.    ** ent
10390 72 69 65 73 20 61 72 65 20 69 6e 20 74 68 65 20  ries are in the 
103a0 74 61 62 6c 65 2c 20 75 73 65 20 31 20 6d 69 6c  table, use 1 mil
103b0 6c 69 6f 6e 20 61 73 20 61 20 67 75 65 73 73 2e  lion as a guess.
103c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 73 74  .    */.    cost
103d0 20 3d 20 70 50 72 6f 62 65 20 3f 20 70 50 72 6f   = pProbe ? pPro
103e0 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20  be->aiRowEst[0] 
103f0 3a 20 31 30 30 30 30 30 30 3b 0a 20 20 20 20 57  : 1000000;.    W
10400 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
10410 74 61 62 6c 65 20 73 63 61 6e 20 62 61 73 65 20  table scan base 
10420 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 63  cost: %.9g\n", c
10430 6f 73 74 29 29 3b 0a 20 20 20 20 77 73 46 6c 61  ost));.    wsFla
10440 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  gs = WHERE_ROWID
10450 5f 52 41 4e 47 45 3b 0a 20 20 0a 20 20 20 20 2f  _RANGE;.  .    /
10460 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 73  * Check for cons
10470 74 72 61 69 6e 74 73 20 6f 6e 20 61 20 72 61 6e  traints on a ran
10480 67 65 20 6f 66 20 72 6f 77 69 64 73 20 69 6e 20  ge of rowids in 
10490 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a 20 20  a table scan..  
104a0 20 20 2a 2f 0a 20 20 20 20 70 54 65 72 6d 20 3d    */.    pTerm =
104b0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
104c0 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
104d0 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  y, WO_LT|WO_LE|W
104e0 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a  O_GT|WO_GE, 0);.
104f0 20 20 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b      if( pTerm ){
10500 0a 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54  .      if( findT
10510 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
10520 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
10530 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a  LT|WO_LE, 0) ){.
10540 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
10550 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  |= WHERE_TOP_LIM
10560 49 54 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74  IT;.        cost
10570 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73   /= 3;  /* Guess
10580 20 74 68 61 74 20 72 6f 77 69 64 3c 45 58 50 52   that rowid<EXPR
10590 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d   eliminates two-
105a0 74 68 69 72 64 73 20 6f 66 20 72 6f 77 73 20 2a  thirds of rows *
105b0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
105c0 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
105d0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
105e0 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
105f0 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  E, 0) ){.       
10600 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
10610 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
10620 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20       cost /= 3; 
10630 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20 72   /* Guess that r
10640 6f 77 69 64 3e 45 58 50 52 20 65 6c 69 6d 69 6e  owid>EXPR elimin
10650 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20  ates two-thirds 
10660 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  of rows */.     
10670 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54 52   }.      WHERETR
10680 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20  ACE(("... rowid 
10690 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f  range reduces co
106a0 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
106b0 6f 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ost));.    }else
106c0 7b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20  {.      wsFlags 
106d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  = 0;.    }.    n
106e0 52 6f 77 20 3d 20 63 6f 73 74 3b 0a 20 20 0a 20  Row = cost;.  . 
106f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62     /* If the tab
10700 6c 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74  le scan does not
10710 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
10720 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e  ER BY clause, in
10730 63 72 65 61 73 65 0a 20 20 20 20 2a 2a 20 74 68  crease.    ** th
10740 65 20 63 6f 73 74 20 62 79 20 4e 6c 6f 67 4e 20  e cost by NlogN 
10750 74 6f 20 63 6f 76 65 72 20 74 68 65 20 65 78 70  to cover the exp
10760 65 6e 73 65 20 6f 66 20 73 6f 72 74 69 6e 67 2e  ense of sorting.
10770 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64   */.    if( pOrd
10780 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66  erBy ){.      if
10790 28 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69  ( sortableByRowi
107a0 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79  d(iCur, pOrderBy
107b0 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  , pWC->pMaskSet,
107c0 20 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20   &rev) ){.      
107d0 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
107e0 52 45 5f 4f 52 44 45 52 42 59 7c 57 48 45 52 45  RE_ORDERBY|WHERE
107f0 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 20 20  _ROWID_RANGE;.  
10800 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b        if( rev ){
10810 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c 61  .          wsFla
10820 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
10830 52 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  RSE;.        }. 
10840 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10850 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74      cost += cost
10860 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20  *estLog(cost);. 
10870 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
10880 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20  E(("... sorting 
10890 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 74  increases cost t
108a0 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
108b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
108c0 0a 20 20 20 20 69 66 28 20 63 6f 73 74 3c 70 43  .    if( cost<pC
108d0 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20  ost->rCost ){.  
108e0 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
108f0 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70   = cost;.      p
10900 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f  Cost->nRow = nRo
10910 77 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  w;.      pCost->
10920 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 77  plan.wsFlags = w
10930 73 46 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  sFlags;.    }.  
10940 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
10950 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
10960 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 53 65 61 72  ZATION.  /* Sear
10970 63 68 20 66 6f 72 20 61 6e 20 4f 52 2d 63 6c 61  ch for an OR-cla
10980 75 73 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  use that can be 
10990 75 73 65 64 20 74 6f 20 6c 6f 6f 6b 20 75 70 20  used to look up 
109a0 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  the table..  */.
109b0 20 20 6d 61 73 6b 53 72 63 20 3d 20 67 65 74 4d    maskSrc = getM
109c0 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
109d0 74 2c 20 69 43 75 72 29 3b 0a 20 20 66 6f 72 28  t, iCur);.  for(
109e0 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  i=0, pTerm=pWC->
109f0 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
10a00 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
10a10 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
10a20 74 65 6d 70 57 43 3b 0a 20 20 20 20 74 65 6d 70  tempWC;.    temp
10a30 57 43 20 3d 20 2a 70 57 43 3b 0a 20 20 20 20 69  WC = *pWC;.    i
10a40 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
10a50 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20 20  tor==WO_OR .    
10a60 20 20 20 20 26 26 20 28 28 70 54 65 72 6d 2d 3e      && ((pTerm->
10a70 70 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73  prereqAll & ~mas
10a80 6b 53 72 63 29 20 26 20 6e 6f 74 52 65 61 64 79  kSrc) & notReady
10a90 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
10aa0 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  (pTerm->u.pOrInf
10ab0 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 6d  o->indexable & m
10ac0 61 73 6b 53 72 63 29 21 3d 30 20 29 7b 0a 20 20  askSrc)!=0 ){.  
10ad0 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
10ae0 2a 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d  *pOrWC = &pTerm-
10af0 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
10b00 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
10b10 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20  *pOrTerm;.      
10b20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74  int j;.      int
10b30 20 73 6f 72 74 61 62 6c 65 20 3d 20 30 3b 0a 20   sortable = 0;. 
10b40 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f 74       double rTot
10b50 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 52  al = 0;.      nR
10b60 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  ow = 0;.      fo
10b70 72 28 6a 3d 30 2c 20 70 4f 72 54 65 72 6d 3d 70  r(j=0, pOrTerm=p
10b80 4f 72 57 43 2d 3e 61 3b 20 6a 3c 70 4f 72 57 43  OrWC->a; j<pOrWC
10b90 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 4f  ->nTerm; j++, pO
10ba0 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
10bb0 20 20 57 68 65 72 65 43 6f 73 74 20 73 54 65 72    WhereCost sTer
10bc0 6d 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 57  mCost;.        W
10bd0 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
10be0 4d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 74  Multi-index OR t
10bf0 65 73 74 69 6e 67 20 66 6f 72 20 74 65 72 6d 20  esting for term 
10c00 25 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c 6e 22 2c  %d of %d....\n",
10c10 20 6a 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20   j,i));.        
10c20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  if( pOrTerm->eOp
10c30 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29  erator==WO_AND )
10c40 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
10c50 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 20  eClause *pAndWC 
10c60 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41  = &pOrTerm->u.pA
10c70 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
10c80 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28        bestIndex(
10c90 70 50 61 72 73 65 2c 20 70 41 6e 64 57 43 2c 20  pParse, pAndWC, 
10ca0 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20  pSrc, notReady, 
10cb0 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a  0, &sTermCost);.
10cc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10cd0 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
10ce0 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20  ursor==iCur ){. 
10cf0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
10d00 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20  a = pOrTerm;.   
10d10 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54         tempWC.nT
10d20 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
10d30 20 20 20 62 65 73 74 49 6e 64 65 78 28 70 50 61     bestIndex(pPa
10d40 72 73 65 2c 20 26 74 65 6d 70 57 43 2c 20 70 53  rse, &tempWC, pS
10d50 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 30 2c  rc, notReady, 0,
10d60 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20   &sTermCost);.  
10d70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10d80 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
10d90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10da0 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 54 65     rTotal += sTe
10db0 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b 0a 20 20  rmCost.rCost;.  
10dc0 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73 54        nRow += sT
10dd0 65 72 6d 43 6f 73 74 2e 6e 52 6f 77 3b 0a 20 20  ermCost.nRow;.  
10de0 20 20 20 20 20 20 69 66 28 20 72 54 6f 74 61 6c        if( rTotal
10df0 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29  >=pCost->rCost )
10e00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10e10 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
10e20 42 79 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By!=0 ){.       
10e30 20 69 66 28 20 73 6f 72 74 61 62 6c 65 42 79 52   if( sortableByR
10e40 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64 65  owid(iCur, pOrde
10e50 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53  rBy, pWC->pMaskS
10e60 65 74 2c 20 26 72 65 76 29 20 26 26 20 21 72 65  et, &rev) && !re
10e70 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  v ){.          s
10e80 6f 72 74 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  ortable = 1;.   
10e90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10ea0 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20        rTotal += 
10eb0 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77  nRow*estLog(nRow
10ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  );.          WHE
10ed0 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f  RETRACE(("... so
10ee0 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20  rting increases 
10ef0 4f 52 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c  OR cost to %.9g\
10f00 6e 22 2c 20 72 54 6f 74 61 6c 29 29 3b 0a 20 20  n", rTotal));.  
10f10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10f20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
10f30 28 28 22 2e 2e 2e 20 6d 75 6c 74 69 2d 69 6e 64  (("... multi-ind
10f40 65 78 20 4f 52 20 63 6f 73 74 3d 25 2e 39 67 20  ex OR cost=%.9g 
10f50 6e 72 6f 77 3d 25 2e 39 67 5c 6e 22 2c 0a 20 20  nrow=%.9g\n",.  
10f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f70 72 54 6f 74 61 6c 2c 20 6e 52 6f 77 29 29 3b 0a  rTotal, nRow));.
10f80 20 20 20 20 20 20 69 66 28 20 72 54 6f 74 61 6c        if( rTotal
10f90 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b  <pCost->rCost ){
10fa0 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
10fb0 72 43 6f 73 74 20 3d 20 72 54 6f 74 61 6c 3b 0a  rCost = rTotal;.
10fc0 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e          pCost->n
10fd0 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  Row = nRow;.    
10fe0 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
10ff0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
11000 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20  MULTI_OR;.      
11010 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e    pCost->plan.u.
11020 70 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 20  pTerm = pTerm;. 
11030 20 20 20 20 20 20 20 69 66 28 20 73 6f 72 74 61         if( sorta
11040 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ble ){.         
11050 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
11060 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4f 52 44  lags = WHERE_ORD
11070 45 52 42 59 7c 57 48 45 52 45 5f 4d 55 4c 54 49  ERBY|WHERE_MULTI
11080 5f 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OR;.        }. 
11090 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
110a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
110b0 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
110c0 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 2f 2a 20  ZATION */..  /* 
110d0 49 66 20 74 68 65 20 70 53 72 63 20 74 61 62 6c  If the pSrc tabl
110e0 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  e is the right t
110f0 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
11100 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79 20  OIN then we may 
11110 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e 20  not.  ** use an 
11120 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66 79  index to satisfy
11130 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61   IS NULL constra
11140 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61 62  ints on that tab
11150 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a  le.  This is.  *
11160 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e  * because column
11170 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  s might end up b
11180 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68 65  eing NULL if the
11190 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
111a0 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20 63  match -.  ** a c
111b0 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69 63  ircumstance whic
111c0 68 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e  h the index cann
111d0 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73 63 6f  ot help us disco
111e0 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32 31  ver.  Ticket #21
111f0 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  77..  */.  if( (
11200 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  pSrc->jointype &
11210 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
11220 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d      eqTermMask =
11230 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20   WO_EQ|WO_IN;.  
11240 7d 65 6c 73 65 7b 0a 20 20 20 20 65 71 54 65 72  }else{.    eqTer
11250 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  mMask = WO_EQ|WO
11260 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20  _IN|WO_ISNULL;. 
11270 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61 74   }..  /* Look at
11280 20 65 61 63 68 20 69 6e 64 65 78 2e 0a 20 20 2a   each index..  *
11290 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  /.  if( pSrc->pI
112a0 6e 64 65 78 20 29 7b 0a 20 20 20 20 70 50 72 6f  ndex ){.    pPro
112b0 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65  be = pSrc->pInde
112c0 78 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20 70  x;.  }.  for(; p
112d0 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 28 70  Probe; pProbe=(p
112e0 53 72 63 2d 3e 70 49 6e 64 65 78 20 3f 20 30 20  Src->pIndex ? 0 
112f0 3a 20 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29  : pProbe->pNext)
11300 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 69 6e  ){.    double in
11310 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20 31 3b 0a  Multiplier = 1;.
11320 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
11330 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25 73 3a 5c  ("... index %s:\
11340 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d  n", pProbe->zNam
11350 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75  e));..    /* Cou
11360 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
11370 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
11380 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 73  index that are s
11390 61 74 69 73 66 69 65 64 0a 20 20 20 20 2a 2a 20  atisfied.    ** 
113a0 62 79 20 78 3d 45 58 50 52 20 63 6f 6e 73 74 72  by x=EXPR constr
113b0 61 69 6e 74 73 20 6f 72 20 78 20 49 4e 20 28 2e  aints or x IN (.
113c0 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ..) constraints.
113d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 73 46 6c  .    */.    wsFl
113e0 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ags = 0;.    for
113f0 28 69 3d 30 3b 20 69 3c 70 50 72 6f 62 65 2d 3e  (i=0; i<pProbe->
11400 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
11410 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72       int j = pPr
11420 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  obe->aiColumn[i]
11430 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
11440 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
11450 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
11460 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70 50 72   eqTermMask, pPr
11470 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  obe);.      if( 
11480 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b  pTerm==0 ) break
11490 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20  ;.      wsFlags 
114a0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
114b0 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  EQ;.      if( pT
114c0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
114d0 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
114e0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
114f0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
11500 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
11510 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
11520 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
11530 78 70 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  xpr->pSelect!=0 
11540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d  ){.          inM
11550 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 32 35 3b  ultiplier *= 25;
11560 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11570 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20  f( pExpr->pList 
11580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d  ){.          inM
11590 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70 45 78  ultiplier *= pEx
115a0 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
115b0 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   + 1;.        }.
115c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
115d0 20 20 6e 52 6f 77 20 3d 20 70 50 72 6f 62 65 2d    nRow = pProbe-
115e0 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69  >aiRowEst[i] * i
115f0 6e 4d 75 6c 74 69 70 6c 69 65 72 3b 0a 20 20 20  nMultiplier;.   
11600 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 65   cost = nRow * e
11610 73 74 4c 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69  stLog(inMultipli
11620 65 72 29 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69  er);.    nEq = i
11630 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  ;.    if( pProbe
11640 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
11650 6e 65 20 26 26 20 28 77 73 46 6c 61 67 73 20 26  ne && (wsFlags &
11660 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
11670 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
11680 20 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43   nEq==pProbe->nC
11690 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 77  olumn ){.      w
116a0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
116b0 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20  UNIQUE;.    }.  
116c0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
116d0 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64 20 69 6e 4d  ..... nEq=%d inM
116e0 75 6c 74 3d 25 2e 39 67 20 63 6f 73 74 3d 25 2e  ult=%.9g cost=%.
116f0 39 67 5c 6e 22 2c 6e 45 71 2c 69 6e 4d 75 6c 74  9g\n",nEq,inMult
11700 69 70 6c 69 65 72 2c 63 6f 73 74 29 29 3b 0a 0a  iplier,cost));..
11710 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20      /* Look for 
11720 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
11730 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  s.    */.    if(
11740 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f   nEq<pProbe->nCo
11750 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  lumn ){.      in
11760 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t j = pProbe->ai
11770 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20  Column[nEq];.   
11780 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
11790 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
117a0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
117b0 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
117c0 5f 47 45 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20  _GE, pProbe);.  
117d0 20 20 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b      if( pTerm ){
117e0 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
117f0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
11800 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20  _RANGE;.        
11810 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
11820 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
11830 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
11840 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20  , pProbe) ){.   
11850 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
11860 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  = WHERE_TOP_LIMI
11870 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73  T;.          cos
11880 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  t /= 3;.        
11890 20 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20    nRow /= 3;.   
118a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
118b0 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  f( findTerm(pWC,
118c0 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
118d0 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
118e0 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20   pProbe) ){.    
118f0 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
11900 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
11910 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74  ;.          cost
11920 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   /= 3;.         
11930 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20   nRow /= 3;.    
11940 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48      }.        WH
11950 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e  ERETRACE((".....
11960 2e 20 72 61 6e 67 65 20 72 65 64 75 63 65 73 20  . range reduces 
11970 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
11980 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d   cost));.      }
11990 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
119a0 64 64 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61  dd the additiona
119b0 6c 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  l cost of sortin
119c0 67 20 69 66 20 74 68 61 74 20 69 73 20 61 20 66  g if that is a f
119d0 61 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  actor..    */.  
119e0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
119f0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 46  {.      if( (wsF
11a00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
11a10 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26 0a 20 20  UMN_IN)==0 &&.  
11a20 20 20 20 20 20 20 20 20 20 69 73 53 6f 72 74 69           isSorti
11a30 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 70  ngIndex(pParse,p
11a40 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 70 50 72  WC->pMaskSet,pPr
11a50 6f 62 65 2c 69 43 75 72 2c 70 4f 72 64 65 72 42  obe,iCur,pOrderB
11a60 79 2c 6e 45 71 2c 26 72 65 76 29 20 29 7b 0a 20  y,nEq,&rev) ){. 
11a70 20 20 20 20 20 20 20 69 66 28 20 77 73 46 6c 61         if( wsFla
11a80 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  gs==0 ){.       
11a90 20 20 20 77 73 46 6c 61 67 73 20 3d 20 57 48 45     wsFlags = WHE
11aa0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b  RE_COLUMN_RANGE;
11ab0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11ac0 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
11ad0 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20  ERE_ORDERBY;.   
11ae0 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a       if( rev ){.
11af0 20 20 20 20 20 20 20 20 20 20 77 73 46 6c 61 67            wsFlag
11b00 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52  s |= WHERE_REVER
11b10 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  SE;.        }.  
11b20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11b30 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a     cost += cost*
11b40 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20  estLog(cost);.  
11b50 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
11b60 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62  (("...... orderb
11b70 79 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74  y increases cost
11b80 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73   to %.9g\n", cos
11b90 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t));.      }.   
11ba0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
11bb0 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 63 61   to see if we ca
11bc0 6e 20 67 65 74 20 61 77 61 79 20 77 69 74 68 20  n get away with 
11bd0 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69  using just the i
11be0 6e 64 65 78 20 77 69 74 68 6f 75 74 0a 20 20 20  ndex without.   
11bf0 20 2a 2a 20 65 76 65 72 20 72 65 61 64 69 6e 67   ** ever reading
11c00 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20   the table.  If 
11c10 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
11c20 2c 20 74 68 65 6e 20 68 61 6c 76 65 20 74 68 65  , then halve the
11c30 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20  .    ** cost of 
11c40 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 20 20  this index..    
11c50 2a 2f 0a 20 20 20 20 69 66 28 20 77 73 46 6c 61  */.    if( wsFla
11c60 67 73 20 26 26 20 70 53 72 63 2d 3e 63 6f 6c 55  gs && pSrc->colU
11c70 73 65 64 20 3c 20 28 28 28 42 69 74 6d 61 73 6b  sed < (((Bitmask
11c80 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b  )1)<<(BMS-1)) ){
11c90 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
11ca0 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
11cb0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
11cc0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
11cd0 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pProbe->nColumn;
11ce0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
11cf0 6e 74 20 78 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt x = pProbe->a
11d00 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
11d10 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
11d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26  ){.          m &
11d30 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29  = ~(((Bitmask)1)
11d40 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  <<x);.        }.
11d50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11d60 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m==0 ){.      
11d70 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
11d80 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
11d90 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 32 3b 0a       cost /= 2;.
11da0 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
11db0 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78 2d  CE(("...... idx-
11dc0 6f 6e 6c 79 20 72 65 64 75 63 65 73 20 63 6f 73  only reduces cos
11dd0 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
11de0 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st));.      }.  
11df0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
11e00 68 69 73 20 69 6e 64 65 78 20 68 61 73 20 61 63  his index has ac
11e10 68 69 65 76 65 64 20 74 68 65 20 6c 6f 77 65 73  hieved the lowes
11e20 74 20 63 6f 73 74 20 73 6f 20 66 61 72 2c 20 74  t cost so far, t
11e30 68 65 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20  hen use it..    
11e40 2a 2f 0a 20 20 20 20 69 66 28 20 77 73 46 6c 61  */.    if( wsFla
11e50 67 73 21 3d 30 20 26 26 20 63 6f 73 74 20 3c 20  gs!=0 && cost < 
11e60 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a  pCost->rCost ){.
11e70 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f        pCost->rCo
11e80 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20  st = cost;.     
11e90 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e   pCost->nRow = n
11ea0 52 6f 77 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  Row;.      pCost
11eb0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  ->plan.wsFlags =
11ec0 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20   wsFlags;.      
11ed0 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20  pCost->plan.nEq 
11ee0 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73  = nEq;.      ass
11ef0 65 72 74 28 20 70 43 6f 73 74 2d 3e 70 6c 61 6e  ert( pCost->plan
11f00 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
11f10 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 20 20  _INDEXED );.    
11f20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e    pCost->plan.u.
11f30 70 49 64 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20  pIdx = pProbe;. 
11f40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
11f50 65 70 6f 72 74 20 74 68 65 20 62 65 73 74 20 72  eport the best r
11f60 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20 70 43 6f  esult.  */.  pCo
11f70 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
11f80 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a   |= eqTermMask;.
11f90 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 62    WHERETRACE(("b
11fa0 65 73 74 20 69 6e 64 65 78 20 69 73 20 25 73 2c  est index is %s,
11fb0 20 63 6f 73 74 3d 25 2e 39 67 2c 20 6e 72 6f 77   cost=%.9g, nrow
11fc0 3d 25 2e 39 67 2c 20 77 73 46 6c 61 67 73 3d 25  =%.9g, wsFlags=%
11fd0 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20  x, nEq=%d\n",.  
11fe0 20 20 20 20 20 20 28 70 43 6f 73 74 2d 3e 70 6c        (pCost->pl
11ff0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
12000 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 3f  RE_INDEXED)!=0 ?
12010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43  .             pC
12020 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  ost->plan.u.pIdx
12030 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e 65  ->zName : "(none
12040 29 22 2c 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 2c  )", pCost->nRow,
12050 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
12060 72 43 6f 73 74 2c 20 70 43 6f 73 74 2d 3e 70 6c  rCost, pCost->pl
12070 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70 43 6f 73  an.wsFlags, pCos
12080 74 2d 3e 70 6c 61 6e 2e 6e 45 71 29 29 3b 0a 7d  t->plan.nEq));.}
12090 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65  .../*.** Disable
120a0 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
120b0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78  HERE clause.  Ex
120c0 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73  cept, do not dis
120d0 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a  able the term.**
120e0 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20   if it controls 
120f0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
12100 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74  N and it did not
12110 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
12120 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47  e ON.** or USING
12130 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20   clause of that 
12140 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  join..**.** Cons
12150 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32  ider the term t2
12160 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66  .z='ok' in the f
12170 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73  ollowing queries
12180 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53  :.**.**   (1)  S
12190 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
121a0 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
121b0 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20  t1.a=t2.x WHERE 
121c0 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
121d0 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2)  SELECT * FRO
121e0 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
121f0 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41  2 ON t1.a=t2.x A
12200 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  ND t2.z='ok'.** 
12210 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20    (3)  SELECT * 
12220 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52  FROM t1, t2 WHER
12230 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  E t1.a=t2.x AND 
12240 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20  t2.z='ok'.**.** 
12250 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73  The t2.z='ok' is
12260 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65   disabled in the
12270 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20   in (2) because 
12280 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a  it originates.**
12290 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
122a0 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20  e.  The term is 
122b0 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20  disabled in (3) 
122c0 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f  because it is no
122d0 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c  t part.** of a L
122e0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20  EFT OUTER JOIN. 
122f0 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72   In (1), the ter
12300 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65  m is not disable
12310 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69  d..**.** Disabli
12320 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73  ng a term causes
12330 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f   that term to no
12340 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74  t be tested in t
12350 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
12360 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44   of the join.  D
12370 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f  isabling is an o
12380 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68  ptimization.  Wh
12390 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74  en terms are sat
123a0 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64  isfied.** by ind
123b0 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65  ices, we disable
123c0 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74   them to prevent
123d0 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73   redundant tests
123e0 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a   in the inner.**
123f0 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64   loop.  We would
12400 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   get the correct
12410 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68   results if noth
12420 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69  ing were ever di
12430 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a  sabled,.** but j
12440 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61  oins might run a
12450 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20   little slower. 
12460 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f   The trick is to
12470 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68   disable as much
12480 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69  .** as we can wi
12490 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20  thout disabling 
124a0 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65  too much.  If we
124b0 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29   disabled in (1)
124c0 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68  , we'd get.** th
124d0 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20  e wrong answer. 
124e0 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33   See ticket #813
124f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12500 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65   disableTerm(Whe
12510 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
12520 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
12530 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a  m){.  if( pTerm.
12540 20 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28        && ALWAYS(
12550 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
12560 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
12570 29 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  ).      && (pLev
12580 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30  el->iLeftJoin==0
12590 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
125a0 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
125b0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
125c0 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e    ){.    pTerm->
125d0 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
125e0 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70  CODED;.    if( p
125f0 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  Term->iParent>=0
12600 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
12610 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
12620 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65  Term->pWC->a[pTe
12630 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
12640 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65      if( (--pOthe
12650 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b  r->nChild)==0 ){
12660 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
12670 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74  Term(pLevel, pOt
12680 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  her);.      }.  
12690 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
126a0 20 41 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e   Apply the affin
126b0 69 74 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  ities associated
126c0 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
126d0 6e 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64  n columns of ind
126e0 65 78 0a 2a 2a 20 70 49 64 78 20 74 6f 20 74 68  ex.** pIdx to th
126f0 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  e values in the 
12700 6e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  n registers star
12710 74 69 6e 67 20 61 74 20 62 61 73 65 2e 0a 2a 2f  ting at base..*/
12720 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
12730 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50  eApplyAffinity(P
12740 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
12750 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 49  t base, int n, I
12760 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
12770 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 56 64  f( n>0 ){.    Vd
12780 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
12790 70 56 64 62 65 3b 0a 20 20 20 20 61 73 73 65 72  pVdbe;.    asser
127a0 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 73  t( v!=0 );.    s
127b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
127c0 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
127d0 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73   base, n);.    s
127e0 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
127f0 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 3b  ityStr(v, pIdx);
12800 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
12810 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
12820 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61 73 65  nge(pParse, base
12830 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  , n);.  }.}.../*
12840 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
12850 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65  e for a single e
12860 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20  quality term of 
12870 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
12880 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a  .  An equality.*
12890 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69  * term can be ei
128a0 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58  ther X=expr or X
128b0 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65   IN (...).   pTe
128c0 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74  rm is the term t
128d0 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a  o be .** coded..
128e0 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  **.** The curren
128f0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
12900 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65  constraint is le
12910 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ft in register i
12920 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  Reg..**.** For a
12930 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74   constraint of t
12940 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20  he form X=expr, 
12950 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
12960 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  s evaluated and 
12970 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  its.** result is
12980 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61   left on the sta
12990 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61  ck.  For constra
129a0 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ints of the form
129b0 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74   X IN (...).** t
129c0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
129d0 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20   up a loop that 
129e0 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65  will iterate ove
129f0 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
12a00 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  X..*/.static int
12a10 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
12a20 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
12a30 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
12a40 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
12a50 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
12a60 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20  pTerm,   /* The 
12a70 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
12a80 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63  E clause to be c
12a90 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
12aa0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a  evel *pLevel, /*
12ab0 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74   When level of t
12ac0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77  he FROM clause w
12ad0 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
12ae0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
12af0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
12b00 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
12b10 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
12b20 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
12b30 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
12b40 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
12b50 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
12b60 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b80 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
12b90 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
12ba0 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
12bb0 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
12bc0 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
12bd0 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
12be0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
12bf0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
12c00 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
12c10 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
12c20 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
12c30 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
12c40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12c50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
12c60 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
12c70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12c80 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
12c90 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
12ca0 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
12cb0 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
12cc0 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73  op *pIn;..    as
12cd0 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
12ce0 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
12cf0 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
12d00 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
12d10 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
12d20 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 54  , pX, 0);.    iT
12d30 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  ab = pX->iTable;
12d40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12d50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
12d60 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ind, iTab, 0);. 
12d70 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
12d80 76 2c 20 22 25 2e 2a 73 22 2c 20 70 58 2d 3e 73  v, "%.*s", pX->s
12d90 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e  pan.n, pX->span.
12da0 7a 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  z));.    assert(
12db0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
12dc0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
12dd0 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20 69 66 28  _ABLE );.    if(
12de0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
12df0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  n==0 ){.      pL
12e00 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
12e10 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
12e20 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  abel(v);.    }. 
12e30 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
12e40 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65  nIn++;.    pLeve
12e50 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20  l->u.in.aInLoop 
12e60 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
12e70 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
12e80 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76  pParse->db, pLev
12e90 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
12ea0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ec0 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75  sizeof(pLevel->u
12ed0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  .in.aInLoop[0])*
12ee0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
12ef0 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
12f00 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
12f10 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
12f20 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
12f30 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
12f40 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e  - 1;.      pIn->
12f50 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20  iCur = iTab;.   
12f60 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
12f70 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
12f80 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
12f90 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
12fa0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12fb0 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52  _Rowid, iTab, iR
12fc0 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
12fd0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
12fe0 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
12ff0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
13000 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
13010 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20   0, iReg);.     
13020 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
13030 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
13040 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a  _IsNull, iReg);.
13050 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13060 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
13070 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  n = 0;.    }.#en
13080 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c  dif.  }.  disabl
13090 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
130a0 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  erm);.  return i
130b0 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
130c0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
130d0 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61   will evaluate a
130e0 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  ll == and IN con
130f0 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a  straints for an.
13100 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68 65 20 76  ** index.  The v
13110 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  alues for all co
13120 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 6c 65  nstraints are le
13130 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ft on the stack.
13140 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
13150 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62  le, consider tab
13160 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  le t1(a,b,c,d,e,
13170 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31  f) with index i1
13180 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70  (a,b,c)..** Supp
13190 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ose the WHERE cl
131a0 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61  ause is this:  a
131b0 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c  ==5 AND b IN (1,
131c0 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44  2,3) AND c>5 AND
131d0 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64   c<10.** The ind
131e0 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61  ex has as many a
131f0 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79  s three equality
13200 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75   constraints, bu
13210 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61  t in this.** exa
13220 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20  mple, the third 
13230 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20  "c" value is an 
13240 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20  inequality.  So 
13250 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e  only two .** con
13260 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64  straints are cod
13270 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
13280 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  e will generate 
13290 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
132a0 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49  .** a==5 and b I
132b0 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20  N (1,2,3).  The 
132c0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
132d0 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20  or a and b will 
132e0 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  be stored.** in 
132f0 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
13300 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e  sters and the in
13310 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
13320 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74   register is ret
13330 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  urned..**.** In 
13340 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
13350 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
13360 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
13370 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
13380 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
13390 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
133a0 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
133b0 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
133c0 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
133d0 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
133e0 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
133f0 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
13400 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  ory cell..**.** 
13410 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77  This routine alw
13420 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74  ays allocates at
13430 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72   least one memor
13440 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72  y cell and retur
13450 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ns.** the index 
13460 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  of that memory c
13470 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68  ell. The code th
13480 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73  at.** calls this
13490 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73   routine will us
134a0 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  e that memory ce
134b0 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ll to store the 
134c0 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b  termination.** k
134d0 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
134e0 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72  loop.  If one or
134f0 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f   more IN operato
13500 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a  rs appear, then.
13510 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
13520 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64  allocates an add
13530 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f  itional nEq memo
13540 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74  ry cells for int
13550 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f  ernal.** use..*/
13560 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
13570 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
13580 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13590 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
135a0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
135b0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
135c0 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68  evel,   /* Which
135d0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
135e0 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20  the FROM we are 
135f0 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72  coding */.  Wher
13600 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
13610 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
13620 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61  lause */.  Bitma
13630 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
13640 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73 20   /* Which parts 
13650 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74  of FROM have not
13660 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20   yet been coded 
13670 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52  */.  int nExtraR
13680 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  eg         /* Nu
13690 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
136a0 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
136b0 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ate */.){.  int 
136c0 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  nEq = pLevel->pl
136d0 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65  an.nEq;   /* The
136e0 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
136f0 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
13700 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62  to code */.  Vdb
13710 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
13720 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
13730 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
13740 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
13750 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
13760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13770 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
13780 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
13790 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d   */.  int iCur =
137a0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
137b0 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ;   /* The curso
137c0 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  r of the table *
137d0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
137e0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
137f0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f    /* A single co
13800 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f  nstraint term */
13810 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13830 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
13840 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
13850 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
13860 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
13870 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
13880 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
13890 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
138a0 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
138b0 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20  o allocate */.. 
138c0 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
138d0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
138e0 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
138f0 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
13900 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c   */.  assert( pL
13910 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
13920 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
13930 45 44 20 29 3b 0a 20 20 70 49 64 78 20 3d 20 70  ED );.  pIdx = p
13940 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
13950 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  dx;..  /* Figure
13960 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65   out how many me
13970 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69  mory cells we wi
13980 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c  ll need then all
13990 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f  ocate them..  */
139a0 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61  .  regBase = pPa
139b0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
139c0 20 6e 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e   nReg = pLevel->
139d0 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72  plan.nEq + nExtr
139e0 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  aReg;.  pParse->
139f0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20  nMem += nReg;.. 
13a00 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
13a10 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
13a20 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  aints.  */.  ass
13a30 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
13a40 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72  mn>=nEq );.  for
13a50 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  (j=0; j<nEq; j++
13a60 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  ){.    int r1;. 
13a70 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d     int k = pIdx-
13a80 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
13a90 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
13aa0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
13ab0 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65   notReady, pLeve
13ac0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c  l->plan.wsFlags,
13ad0 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20   pIdx);.    if( 
13ae0 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d 30 29 20  NEVER(pTerm==0) 
13af0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
13b00 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
13b10 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
13b20 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 31 20  D)==0 );.    r1 
13b30 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
13b40 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
13b50 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73  , pLevel, regBas
13b60 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31  e+j);.    if( r1
13b70 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20  !=regBase+j ){. 
13b80 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31       if( nReg==1
13b90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13ba0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
13bb0 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  g(pParse, regBas
13bc0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42  e);.        regB
13bd0 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20  ase = r1;.      
13be0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
13bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13c00 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  (v, OP_SCopy, r1
13c10 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
13c20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13c30 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
13c40 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
13c50 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
13c60 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
13c70 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
13c80 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
13c90 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
13ca0 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  (WO_ISNULL|WO_IN
13cb0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))==0 ){.      s
13cc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13cd0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
13ce0 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
13cf0 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
13d00 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
13d10 65 67 42 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  egBase;.}../*.**
13d20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
13d30 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
13d40 70 57 43 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  pWC contains no 
13d50 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 61 72  terms that.** ar
13d60 65 20 6e 6f 74 20 76 69 72 74 75 61 6c 20 61 6e  e not virtual an
13d70 64 20 77 68 69 63 68 20 68 61 76 65 20 6e 6f 74  d which have not
13d80 20 62 65 65 6e 20 63 6f 64 65 64 2e 0a 2a 2a 0a   been coded..**.
13d90 2a 2a 20 54 6f 20 70 75 74 20 69 74 20 61 6e 6f  ** To put it ano
13da0 74 68 65 72 20 77 61 79 2c 20 72 65 74 75 72 6e  ther way, return
13db0 20 54 52 55 45 20 69 66 20 6e 6f 20 61 64 64 69   TRUE if no addi
13dc0 74 69 6f 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  tional WHERE cla
13dd0 75 73 65 73 0a 2a 2a 20 74 65 73 74 73 20 61 72  uses.** tests ar
13de0 65 20 72 65 71 75 69 72 65 64 20 69 6e 20 6f 72  e required in or
13df0 64 65 72 20 74 6f 20 65 73 74 61 62 6c 69 73 68  der to establish
13e00 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e   that the curren
13e10 74 20 72 6f 77 0a 2a 2a 20 73 68 6f 75 6c 64 20  t row.** should 
13e20 67 6f 20 74 6f 20 6f 75 74 70 75 74 20 61 6e 64  go to output and
13e30 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   return FALSE if
13e40 20 74 68 65 72 65 20 61 72 65 20 73 6f 6d 65 20   there are some 
13e50 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20  terms of.** the 
13e60 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
13e70 74 20 6e 65 65 64 20 74 6f 20 62 65 20 76 61 6c  t need to be val
13e80 69 64 61 74 65 64 20 62 65 66 6f 72 65 20 6f 75  idated before ou
13e90 74 70 75 74 69 6e 67 20 74 68 65 20 72 6f 77 2e  tputing the row.
13ea0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
13eb0 68 65 72 65 52 6f 77 52 65 61 64 79 46 6f 72 4f  hereRowReadyForO
13ec0 75 74 70 75 74 28 57 68 65 72 65 43 6c 61 75 73  utput(WhereClaus
13ed0 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65  e *pWC){.  Where
13ee0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
13ef0 6e 74 20 6a 3b 0a 20 0a 20 20 66 6f 72 28 70 54  nt j;. .  for(pT
13f00 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57  erm=pWC->a, j=pW
13f10 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  C->nTerm; j>0; j
13f20 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
13f30 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74    if( (pTerm->wt
13f40 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
13f50 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
13f60 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
13f70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
13f80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
13f90 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
13fa0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c   start of the iL
13fb0 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20  evel-th loop in 
13fc0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
13fd0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
13fe0 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
13ff0 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69  pWInfo..*/.stati
14000 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e  c Bitmask codeOn
14010 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68  eLoopStart(.  Wh
14020 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
14030 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69     /* Complete i
14040 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
14050 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
14060 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  e */.  int iLeve
14070 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
14080 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57  hich level of pW
14090 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64  Info->a[] should
140a0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75   be coded */.  u
140b0 38 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  8 wctrlFlags,   
140c0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
140d0 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
140e0 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
140f0 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d  eInt.h */.  Bitm
14100 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20  ask notReady    
14110 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73   /* Which tables
14120 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61   are currently a
14130 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  vailable */.){. 
14140 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20   int j, k;      
14150 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
14160 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
14170 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
14180 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
14190 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sor for the tabl
141a0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e  e */.  int addrN
141b0 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  xt;         /* W
141c0 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20  here to jump to 
141d0 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
141e0 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a  e next IN case *
141f0 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c  /.  int omitTabl
14200 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e;       /* True
14210 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69   if we use the i
14220 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  ndex only */.  i
14230 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20  nt bRev;        
14240 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
14250 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69  e need to scan i
14260 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
14270 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
14280 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65  *pLevel;  /* The
14290 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20   where level to 
142a0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  be coded */.  Wh
142b0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
142c0 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
142d0 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  ion of the entir
142e0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
142f0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
14300 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
14310 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63      /* A WHERE c
14320 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
14330 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
14340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14350 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
14360 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  xt */.  Vdbe *v;
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14380 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
14390 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64  repared stmt und
143a0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73  er constructions
143b0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
143c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
143d0 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  tem;  /* FROM cl
143e0 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
143f0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  coded */.  int a
14400 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
14410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
14420 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
14430 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
14440 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
14450 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
14460 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
14470 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
14480 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  ith next cycle *
14490 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 53 65  /.  int regRowSe
144a0 74 3b 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  t;       /* Writ
144b0 65 20 72 6f 77 69 64 73 20 74 6f 20 74 68 69 73  e rowids to this
144c0 20 52 6f 77 53 65 74 20 69 66 20 6e 6f 6e 2d 6e   RowSet if non-n
144d0 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 69 6e 74  egative */.  int
144e0 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79   codeRowSetEarly
144f0 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 64  ; /* True if ind
14500 65 78 20 66 75 6c 6c 79 20 63 6f 6e 73 74 72 61  ex fully constra
14510 69 6e 73 20 74 68 65 20 73 65 61 72 63 68 20 2a  ins the search *
14520 2f 0a 20 20 0a 0a 20 20 70 50 61 72 73 65 20 3d  /.  ..  pParse =
14530 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
14540 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
14550 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 70 57  Vdbe;.  pWC = pW
14560 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c 65  Info->pWC;.  pLe
14570 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
14580 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 54 61 62  [iLevel];.  pTab
14590 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  Item = &pWInfo->
145a0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
145b0 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43  el->iFrom];.  iC
145c0 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
145d0 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d  Cursor;.  bRev =
145e0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
145f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
14600 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 6f 6d  EVERSE)!=0;.  om
14610 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65  itTable = (pLeve
14620 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
14630 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
14640 29 21 3d 30 3b 0a 20 20 72 65 67 52 6f 77 53 65  )!=0;.  regRowSe
14650 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 72 65 67 52  t = pWInfo->regR
14660 6f 77 53 65 74 3b 0a 20 20 63 6f 64 65 52 6f 77  owSet;.  codeRow
14670 53 65 74 45 61 72 6c 79 20 3d 20 30 3b 0a 0a 20  SetEarly = 0;.. 
14680 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
14690 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
146a0 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
146b0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
146c0 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ** for the curre
146d0 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74  nt loop.  Jump t
146e0 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65  o addrBrk to bre
146f0 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
14700 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63  ..  ** Jump to c
14710 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
14720 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
14730 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
14740 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20  he.  ** loop..  
14750 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65  **.  ** When the
14760 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  re is an IN oper
14770 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61  ator, we also ha
14780 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c  ve a "addrNxt" l
14790 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d  abel that.  ** m
147a0 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  eans to continue
147b0 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
147c0 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74  N value combinat
147d0 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20  ion.  When.  ** 
147e0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20  there are no IN 
147f0 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  operators in the
14800 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
14810 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  e "addrNxt" labe
14820 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61  l.  ** is the sa
14830 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e  me as "addrBrk".
14840 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20  .  */.  addrBrk 
14850 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
14860 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
14870 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
14880 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
14890 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76   addrCont = pLev
148a0 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73  el->addrCont = s
148b0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
148c0 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66  bel(v);..  /* If
148d0 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
148e0 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
148f0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61  FT OUTER JOIN, a
14900 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a  llocate and.  **
14910 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
14920 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
14930 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
14940 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
14950 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
14960 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74   left table of t
14970 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
14980 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
14990 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
149a0 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [0].jointype & J
149b0 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
149c0 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a    pLevel->iLeftJ
149d0 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oin = ++pParse->
149e0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
149f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14a00 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c  P_Integer, 0, pL
14a10 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
14a20 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
14a30 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54  t((v, "init LEFT
14a40 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66   JOIN no-match f
14a50 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66  lag"));.  }..#if
14a60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14a70 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
14a80 69 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  if(  (pLevel->pl
14a90 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
14aa0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
14ab0 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  !=0 ){.    /* Ca
14ac0 73 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65  se 0:  The table
14ad0 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61   is a virtual-ta
14ae0 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46  ble.  Use the VF
14af0 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a  ilter and VNext.
14b00 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
14b10 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
14b20 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ta..    */.    i
14b30 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33  nt iReg;   /* P3
14b40 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46   Value for OP_VF
14b50 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c  ilter */.    sql
14b60 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14b70 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76  *pVtabIdx = pLev
14b80 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  el->plan.u.pVtab
14b90 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  Idx;.    int nCo
14ba0 6e 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61 62  nstraint = pVtab
14bb0 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  Idx->nConstraint
14bc0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71 6c  ;.    struct sql
14bd0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
14be0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73  raint_usage *aUs
14bf0 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c20 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
14c30 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
14c40 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75  ;.    const stru
14c50 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
14c60 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f  _constraint *aCo
14c70 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20  nstraint =.     
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ca0 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
14cb0 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Idx->aConstraint
14cc0 3b 0a 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71  ;..    iReg = sq
14cd0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
14ce0 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74  e(pParse, nConst
14cf0 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 70 50  raint+2);.    pP
14d00 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
14d10 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 66 6f 72  Cache++;.    for
14d20 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72  (j=1; j<=nConstr
14d30 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  aint; j++){.    
14d40 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f    for(k=0; k<nCo
14d50 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a  nstraint; k++){.
14d60 20 20 20 20 20 20 20 20 69 66 28 20 61 55 73 61          if( aUsa
14d70 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d  ge[k].argvIndex=
14d80 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
14d90 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e  int iTerm = aCon
14da0 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d  straint[k].iTerm
14db0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
14dc0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
14dd0 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
14de0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  e );.          s
14df0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
14e00 50 61 72 73 65 2c 20 70 57 43 2d 3e 61 5b 69 54  Parse, pWC->a[iT
14e10 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67  erm].pExpr->pRig
14e20 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20  ht, iReg+j+1);. 
14e30 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14e40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14e50 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e  }.      if( k==n
14e60 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65  Constraint ) bre
14e70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ak;.    }.    as
14e80 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69  sert( pParse->di
14e90 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 20 29 3b  sableColCache );
14ea0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73  .    pParse->dis
14eb0 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  ableColCache--;.
14ec0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14ed0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14ee0 67 65 72 2c 20 70 56 74 61 62 49 64 78 2d 3e 69  ger, pVtabIdx->i
14ef0 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20  dxNum, iReg);.  
14f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14f10 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
14f20 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b  r, j-1, iReg+1);
14f30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14f40 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69  AddOp4(v, OP_VFi
14f50 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72  lter, iCur, addr
14f60 42 72 6b 2c 20 69 52 65 67 2c 20 70 56 74 61 62  Brk, iReg, pVtab
14f70 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20  Idx->idxStr,.   
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65     pVtabIdx->nee
14fa0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20  dToFreeIdxStr ? 
14fb0 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f  P4_MPRINTF : P4_
14fc0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74  STATIC);.    pVt
14fd0 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65  abIdx->needToFre
14fe0 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
14ff0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e   for(j=0; j<nCon
15000 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20  straint; j++){. 
15010 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b       if( aUsage[
15020 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20  j].omit ){.     
15030 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61     int iTerm = a
15040 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54  Constraint[j].iT
15050 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
15060 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
15070 4c 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69  Level, &pWC->a[i
15080 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Term]);.      }.
15090 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
150a0 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
150b0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
150c0 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
150d0 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
150e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
150f0 76 29 3b 0a 20 20 20 20 63 6f 64 65 52 6f 77 53  v);.    codeRowS
15100 65 74 45 61 72 6c 79 20 3d 20 72 65 67 52 6f 77  etEarly = regRow
15110 53 65 74 3e 3d 30 20 3f 20 77 68 65 72 65 52 6f  Set>=0 ? whereRo
15120 77 52 65 61 64 79 46 6f 72 4f 75 74 70 75 74 28  wReadyForOutput(
15130 70 57 43 29 20 3a 20 30 3b 0a 20 20 20 20 69 66  pWC) : 0;.    if
15140 28 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c  ( codeRowSetEarl
15150 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
15160 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15170 4f 50 5f 56 52 6f 77 69 64 2c 20 69 43 75 72 2c  OP_VRowid, iCur,
15180 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71   iReg);.      sq
15190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
151a0 76 2c 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 2c  v, OP_RowSetAdd,
151b0 20 72 65 67 52 6f 77 53 65 74 2c 20 69 52 65 67   regRowSet, iReg
151c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
151d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
151e0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 65  ange(pParse, iRe
151f0 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  g, nConstraint+2
15200 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
15210 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
15220 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
15230 0a 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  ..  if( pLevel->
15240 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
15250 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b  HERE_ROWID_EQ ){
15260 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20  .    /* Case 1: 
15270 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79   We can directly
15280 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
15290 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e  gle row using an
152a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
152b0 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72   equality compar
152c0 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
152d0 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f   ROWID field.  O
152e0 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
152f0 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d    we reference m
15300 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69  ultiple rows usi
15310 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28  ng a "rowid IN (
15320 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20  ...)".    **    
15330 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e        construct.
15340 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
15350 72 31 3b 0a 20 20 20 20 69 6e 74 20 72 74 6d 70  r1;.    int rtmp
15360 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
15370 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
15380 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
15390 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
153a0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
153b0 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20  Q|WO_IN, 0);.   
153c0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
153d0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
153e0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
153f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15400 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
15410 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 61  r==iCur );.    a
15420 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
15430 3d 3d 30 20 29 3b 0a 20 20 20 20 72 31 20 3d 20  ==0 );.    r1 = 
15440 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
15450 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
15460 70 4c 65 76 65 6c 2c 20 72 74 6d 70 29 3b 0a 20  pLevel, rtmp);. 
15470 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
15480 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
15490 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
154a0 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
154b0 49 6e 74 2c 20 72 31 2c 20 61 64 64 72 4e 78 74  Int, r1, addrNxt
154c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
154d0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
154e0 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20  otExists, iCur, 
154f0 61 64 64 72 4e 78 74 2c 20 72 31 29 3b 0a 20 20  addrNxt, r1);.  
15500 20 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c    codeRowSetEarl
15510 79 20 3d 20 28 70 57 43 2d 3e 6e 54 65 72 6d 3d  y = (pWC->nTerm=
15520 3d 31 20 26 26 20 72 65 67 52 6f 77 53 65 74 3e  =1 && regRowSet>
15530 3d 30 29 20 3f 31 3a 30 3b 0a 20 20 20 20 69 66  =0) ?1:0;.    if
15540 28 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c  ( codeRowSetEarl
15550 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
15560 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15570 4f 50 5f 52 6f 77 53 65 74 41 64 64 2c 20 72 65  OP_RowSetAdd, re
15580 67 52 6f 77 53 65 74 2c 20 72 31 29 3b 0a 20 20  gRowSet, r1);.  
15590 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52    }.    sqlite3R
155a0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
155b0 61 72 73 65 2c 20 72 74 6d 70 29 3b 0a 20 20 20  arse, rtmp);.   
155c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
155d0 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65   "pk"));.    pLe
155e0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
155f0 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  p;.  }else if( p
15600 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
15610 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
15620 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 2f  D_RANGE ){.    /
15630 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68 61  * Case 2:  We ha
15640 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  ve an inequality
15650 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
15660 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
15670 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eld..    */.    
15680 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f  int testOp = OP_
15690 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74  Noop;.    int st
156a0 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d  art;.    int mem
156b0 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  EndValue = 0;.  
156c0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74    WhereTerm *pSt
156d0 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20  art, *pEnd;..   
156e0 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
156f0 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53 74  le==0 );.    pSt
15700 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  art = findTerm(p
15710 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
15720 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f  tReady, WO_GT|WO
15730 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 70 45 6e  _GE, 0);.    pEn
15740 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  d = findTerm(pWC
15750 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
15760 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
15770 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62  E, 0);.    if( b
15780 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65  Rev ){.      pTe
15790 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20  rm = pStart;.   
157a0 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
157b0 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70  ;.      pEnd = p
157c0 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Term;.    }.    
157d0 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
157e0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
157f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15800 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
15810 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74 61   defines the sta
15820 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  rt bound */.    
15830 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b    int r1, rTemp;
15840 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
15850 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67  ters for holding
15860 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
15870 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ary */..      /*
15880 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
15890 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f  onstant maps TK_
158a0 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f  xx codes into co
158b0 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20  rresponding .   
158c0 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64     ** seek opcod
158d0 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20  es.  It depends 
158e0 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
158f0 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78  ordering of TK_x
15900 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  x.      */.     
15910 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f   const u8 aMoveO
15920 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
15930 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20     /* TK_GT */  
15940 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20  OP_SeekGt,.     
15950 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a        /* TK_LE *
15960 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20  /  OP_SeekLe,.  
15970 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
15980 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c  T */  OP_SeekLt,
15990 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
159a0 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GE */  OP_Seek
159b0 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  Ge.      };.    
159c0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
159d0 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20  =TK_GT+1 );     
159e0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
159f0 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a  e ordering.. */.
15a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
15a10 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20  _LT==TK_GT+2 ); 
15a20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20       /*  ... of 
15a30 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73  the TK_xx values
15a40 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ... */.      ass
15a50 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47  ert( TK_GE==TK_G
15a60 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20  T+3 );      /*  
15a70 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e  ... is correcct.
15a80 20 2a 2f 0a 0a 20 20 20 20 20 20 70 58 20 3d 20   */..      pX = 
15a90 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
15aa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
15ab0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
15ac0 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  rt( pStart->left
15ad0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
15ae0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
15af0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
15b00 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
15b10 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
15b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15b30 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70  Op3(v, aMoveOp[p
15b40 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43  X->op-TK_GT], iC
15b50 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ur, addrBrk, r1)
15b60 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
15b70 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
15b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15b90 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
15ba0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
15bb0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
15bc0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15bd0 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b  (pParse, rTemp);
15be0 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
15bf0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
15c00 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
15c10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15c20 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
15c30 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
15c40 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
15c50 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Brk);.    }.    
15c60 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
15c70 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
15c80 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
15c90 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
15ca0 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
15cb0 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c   assert( pEnd->l
15cc0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
15cd0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56  );.      memEndV
15ce0 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  alue = ++pParse-
15cf0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
15d00 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
15d10 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
15d20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20   memEndValue);. 
15d30 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d       if( pX->op=
15d40 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LT || pX->op
15d50 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20  ==TK_GT ){.     
15d60 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
15d70 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65   ? OP_Le : OP_Ge
15d80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15d90 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
15da0 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
15db0 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  P_Gt;.      }.  
15dc0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
15dd0 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20  pLevel, pEnd);. 
15de0 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d     }.    start =
15df0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15e00 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
15e10 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
15e20 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
15e30 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  _Next;.    pLeve
15e40 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
15e50 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
15e60 74 61 72 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c  tart;.    pLevel
15e70 2d 3e 70 35 20 3d 20 28 70 53 74 61 72 74 3d 3d  ->p5 = (pStart==
15e80 30 20 26 26 20 70 45 6e 64 3d 3d 30 29 20 3f 31  0 && pEnd==0) ?1
15e90 3a 30 3b 0a 20 20 20 20 63 6f 64 65 52 6f 77 53  :0;.    codeRowS
15ea0 65 74 45 61 72 6c 79 20 3d 20 72 65 67 52 6f 77  etEarly = regRow
15eb0 53 65 74 3e 3d 30 20 3f 20 77 68 65 72 65 52 6f  Set>=0 ? whereRo
15ec0 77 52 65 61 64 79 46 6f 72 4f 75 74 70 75 74 28  wReadyForOutput(
15ed0 70 57 43 29 20 3a 20 30 3b 0a 20 20 20 20 69 66  pWC) : 0;.    if
15ee0 28 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c  ( codeRowSetEarl
15ef0 79 20 7c 7c 20 74 65 73 74 4f 70 21 3d 4f 50 5f  y || testOp!=OP_
15f00 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 6e  Noop ){.      in
15f10 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
15f20 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
15f30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15f40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15f50 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 72 31 29  Rowid, iCur, r1)
15f60 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74  ;.      if( test
15f70 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  Op!=OP_Noop ){. 
15f80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15f90 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74  beAddOp3(v, test
15fa0 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c  Op, memEndValue,
15fb0 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20   addrBrk, r1);. 
15fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15fd0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
15fe0 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
15ff0 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
16000 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
16010 20 20 20 20 20 69 66 28 20 63 6f 64 65 52 6f 77       if( codeRow
16020 53 65 74 45 61 72 6c 79 20 29 7b 0a 20 20 20 20  SetEarly ){.    
16030 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16040 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53  ddOp2(v, OP_RowS
16050 65 74 41 64 64 2c 20 72 65 67 52 6f 77 53 65 74  etAdd, regRowSet
16060 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r1);.      }. 
16070 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
16080 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16090 65 2c 20 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20  e, r1);.    }.  
160a0 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
160b0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
160c0 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52   (WHERE_COLUMN_R
160d0 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  ANGE|WHERE_COLUM
160e0 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a 20  N_EQ) ){.    /* 
160f0 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75  Case 3: A scan u
16100 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20  sing an index.. 
16110 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
16120 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63       The WHERE c
16130 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69  lause may contai
16140 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65  n zero or more e
16150 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20  quality .    ** 
16160 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22          terms ("
16170 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72  ==" or "IN" oper
16180 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65  ators) that refe
16190 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a  r to the N.    *
161a0 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d  *         left-m
161b0 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ost columns of t
161c0 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79  he index. It may
161d0 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20   also contain.  
161e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65    **         ine
161f0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
16200 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72  nts (>, <, >= or
16210 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65   <=) on the inde
16220 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  xed.    **      
16230 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69     column that i
16240 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
16250 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74  ws the N equalit
16260 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a  ies. Only .    *
16270 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69  *         the ri
16280 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  ght-most column 
16290 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61  can be an inequa
162a0 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20  lity - the rest 
162b0 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  must.    **     
162c0 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22      use the "=="
162d0 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74   and "IN" operat
162e0 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ors. For example
162f0 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  , if the .    **
16300 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69           index i
16310 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68  s on (x,y,z), th
16320 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
16330 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c   clauses are all
16340 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
16350 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20   optimized:.    
16360 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
16370 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20       x=5.    ** 
16380 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
16390 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20  ND y=10.    **  
163a0 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
163b0 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y<10.    **   
163c0 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
163d0 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   y>5 AND y<10.  
163e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
163f0 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20  x=5 AND y=5 AND 
16400 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20  z<=10.    **.   
16410 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
16420 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65  z<10 term of the
16430 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f   following canno
16440 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a  t be used, only.
16450 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
16460 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20  he x=5 term:.   
16470 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
16480 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c        x=5 AND z<
16490 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
164a0 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62           N may b
164b0 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  e zero if there 
164c0 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
164d0 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
164e0 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68  **         If th
164f0 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75  ere are no inequ
16500 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
16510 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a  s, then N is at.
16520 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
16530 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a  east one..    **
16540 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
16550 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  This case is als
16560 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72  o used when ther
16570 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
16580 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20  lause.    **    
16590 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73       constraints
165a0 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73   but an index is
165b0 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79   selected anyway
165c0 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a  , in order.    *
165d0 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72  *         to for
165e0 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  ce the output or
165f0 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74  der to conform t
16600 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  o an ORDER BY.. 
16610 20 20 20 2a 2f 20 20 0a 20 20 20 20 69 6e 74 20     */  .    int 
16620 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20  aStartOp[] = {. 
16630 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c       0,.      0,
16640 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64  .      OP_Rewind
16650 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32  ,           /* 2
16660 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72  : (!start_constr
16670 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71  aints && startEq
16680 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20   &&  !bRev) */. 
16690 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20       OP_Last,   
166a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20            /* 3: 
166b0 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
166c0 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
166d0 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &   bRev) */.   
166e0 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20     OP_SeekGt,   
166f0 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73          /* 4: (s
16700 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
16710 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26    && !startEq &&
16720 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
16730 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20   OP_SeekLt,     
16740 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61        /* 5: (sta
16750 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
16760 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20  && !startEq &&  
16770 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
16780 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20  P_SeekGe,       
16790 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74      /* 6: (start
167a0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
167b0 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52    startEq && !bR
167c0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
167d0 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20  SeekLe          
167e0 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63    /* 7: (start_c
167f0 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
16800 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76  startEq &&  bRev
16810 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
16820 69 6e 74 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b  int aEndOp[] = {
16830 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20  .      OP_Noop, 
16840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
16850 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69  : (!end_constrai
16860 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  nts) */.      OP
16870 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20  _IdxGE,         
16880 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f     /* 1: (end_co
16890 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52  nstraints && !bR
168a0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
168b0 49 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20  IdxLT           
168c0 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e    /* 2: (end_con
168d0 73 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76  straints && bRev
168e0 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
168f0 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c  int nEq = pLevel
16900 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 0a 20 20 20 20  ->plan.nEq;.    
16910 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d  int isMinQuery =
16920 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
16930 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70  If this is an op
16940 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d  timized SELECT m
16950 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69  in(x).. */.    i
16960 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
16970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
16980 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  ase register hol
16990 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20  ding constraint 
169a0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e  values */.    in
169b0 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  t r1;           
169c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
169d0 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  mp register */. 
169e0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
169f0 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20  angeStart = 0;  
16a00 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
16a10 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
16a20 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57  e start */.    W
16a30 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
16a40 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  End = 0;    /* I
16a50 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
16a60 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e  aint at range en
16a70 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  d */.    int sta
16a80 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rtEq;           
16a90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
16aa0 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65   range start use
16ab0 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
16ac0 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b  /.    int endEq;
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61     /* True if ra
16af0 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c  nge end uses ==,
16b00 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
16b10 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74   int start_const
16b20 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a  raints;       /*
16b30 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   Start of range 
16b40 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a  is constrained *
16b50 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  /.    int nConst
16b60 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  raint;          
16b70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16b80 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
16b90 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
16ba0 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Idx;         /* 
16bb0 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c  The index we wil
16bc0 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20  l be using */.  
16bd0 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
16be0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
16bf0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
16c00 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  e index */.    i
16c10 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30  nt nExtraReg = 0
16c20 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
16c30 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
16c40 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69   needed */.    i
16c50 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
16c60 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69      /* Instructi
16c70 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 0a 20 20  on opcode */..  
16c80 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
16c90 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20  >plan.u.pIdx;.  
16ca0 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76    iIdxCur = pLev
16cb0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
16cc0 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
16cd0 75 6d 6e 5b 6e 45 71 5d 3b 20 20 20 20 20 2f 2a  umn[nEq];     /*
16ce0 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e 65 71   Column for ineq
16cf0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
16d00 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  ts */..    /* If
16d10 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73   this loop satis
16d20 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65  fies a sort orde
16d30 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65 71  r (pOrderBy) req
16d40 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a  uest that .    *
16d50 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  * was passed to 
16d60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
16d70 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45   implement a "SE
16d80 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22  LECT min(x) ..."
16d90 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20   .    ** query, 
16da0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
16db0 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20  will only allow 
16dc0 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20  the loop to run 
16dd0 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e  for.    ** a sin
16de0 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54  gle iteration. T
16df0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
16e00 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74  he first row ret
16e10 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f  urned.    ** sho
16e20 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e  uld not have a N
16e30 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64  ULL value stored
16e40 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75   in 'x'. If colu
16e50 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a  mn 'x' is.    **
16e60 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61   the first one a
16e70 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75  fter the nEq equ
16e80 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
16e90 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a  s in the index,.
16ea0 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75      ** this requ
16eb0 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61  ires some specia
16ec0 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20  l handling..    
16ed0 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74 72  */.    if( (wctr
16ee0 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  lFlags&WHERE_ORD
16ef0 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20  ERBY_MIN)!=0.   
16f00 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c    && (pLevel->pl
16f10 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45  an.wsFlags&WHERE
16f20 5f 4f 52 44 45 52 42 59 29 0a 20 20 20 20 20 26  _ORDERBY).     &
16f30 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  & (pIdx->nColumn
16f40 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  >nEq).    ){.   
16f50 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f     /* assert( pO
16f60 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31  rderBy->nExpr==1
16f70 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20   ); */.      /* 
16f80 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
16f90 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[0].pExpr->iC
16fa0 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
16fb0 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f  olumn[nEq] ); */
16fc0 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72  .      isMinQuer
16fd0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78  y = 1;.      nEx
16fe0 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
16ff0 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61  }..    /* Find a
17000 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ny inequality co
17010 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66  nstraint terms f
17020 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  or the start and
17030 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20   end .    ** of 
17040 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20  the range. .    
17050 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
17060 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
17070 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
17080 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
17090 65 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28  eEnd = findTerm(
170a0 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  pWC, iCur, k, no
170b0 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57  tReady, (WO_LT|W
170c0 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20 20  O_LE), pIdx);.  
170d0 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
170e0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
170f0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
17100 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
17110 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
17120 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66   pRangeStart = f
17130 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
17140 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, k, notReady, 
17150 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70  (WO_GT|WO_GE), p
17160 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74  Idx);.      nExt
17170 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
17180 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
17190 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
171a0 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  te all constrain
171b0 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d  t terms using ==
171c0 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e   or IN.    ** an
171d0 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  d store the valu
171e0 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
171f0 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  s in an array of
17200 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
17210 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65  * starting at re
17220 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  gBase..    */.  
17230 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65    regBase = code
17240 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
17250 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c  (pParse, pLevel,
17260 20 70 57 43 2c 20 6e 6f 74 52 65 61 64 79 2c 20   pWC, notReady, 
17270 6e 45 78 74 72 61 52 65 67 29 3b 0a 20 20 20 20  nExtraReg);.    
17280 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
17290 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 0a 20 20 20  ->addrNxt;...   
172a0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
172b0 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72  ing a reverse or
172c0 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61  der scan on an a
172d0 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
172e0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  or.    ** a forw
172f0 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
17300 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
17310 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
17320 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  e the .    ** st
17330 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
17340 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
17350 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
17360 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 52     */.    if( bR
17370 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74  ev==(pIdx->aSort
17380 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49  Order[nEq]==SQLI
17390 54 45 5f 53 4f 5f 41 53 43 29 20 29 7b 0a 20 20  TE_SO_ASC) ){.  
173a0 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
173b0 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c  rm *, pRangeEnd,
173c0 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
173d0 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
173e0 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
173f0 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  && pRangeStart->
17400 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
17410 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
17420 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
17430 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  & pRangeStart->e
17440 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45  Operator & WO_GE
17450 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
17460 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70  ( pRangeEnd && p
17470 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
17480 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  tor & WO_LE );. 
17490 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
174a0 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65  ngeEnd && pRange
174b0 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
174c0 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73 74   WO_GE );.    st
174d0 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53  artEq = !pRangeS
174e0 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74  tart || pRangeSt
174f0 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
17500 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
17510 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70      endEq =   !p
17520 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e  RangeEnd || pRan
17530 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
17540 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
17550 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73  ;.    start_cons
17560 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65  traints = pRange
17570 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a  Start || nEq>0;.
17580 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
17590 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f   index cursor to
175a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
175b0 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
175c0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
175d0 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
175e0 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  eStart ){.      
175f0 69 6e 74 20 64 63 63 20 3d 20 70 50 61 72 73 65  int dcc = pParse
17600 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
17610 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 61  e;.      if( pRa
17620 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ngeEnd ){.      
17630 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
17640 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20  eColCache++;.   
17650 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17660 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
17670 65 2c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  e, pRangeStart->
17680 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 72  pExpr->pRight, r
17690 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
176a0 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
176b0 6c 65 43 6f 6c 43 61 63 68 65 20 3d 20 64 63 63  leColCache = dcc
176c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
176d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
176e0 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b  IsNull, regBase+
176f0 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
17700 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
17710 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ++;.    }else if
17720 28 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a  ( isMinQuery ){.
17730 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17740 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
17750 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e  ll, 0, regBase+n
17760 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  Eq);.      nCons
17770 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
17780 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20  startEq = 0;.   
17790 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
177a0 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ints = 1;.    }.
177b0 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66      codeApplyAff
177c0 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65  inity(pParse, re
177d0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
177e0 6e 74 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 6f  nt, pIdx);.    o
177f0 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74  p = aStartOp[(st
17800 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c  art_constraints<
17810 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c  <2) + (startEq<<
17820 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20  1) + bRev];.    
17830 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b  assert( op!=0 );
17840 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
17850 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a  p==OP_Rewind );.
17860 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17870 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20  ==OP_Last );.   
17880 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
17890 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20  P_SeekGt );.    
178a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
178b0 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74  _SeekGe );.    t
178c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
178d0 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65  SeekLe );.    te
178e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
178f0 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c  eekLt );.    sql
17900 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17910 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
17920 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
17930 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17940 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
17950 4e 54 5f 54 4f 5f 50 54 52 28 6e 43 6f 6e 73 74  NT_TO_PTR(nConst
17960 72 61 69 6e 74 29 2c 20 50 34 5f 49 4e 54 33 32  raint), P4_INT32
17970 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  );..    /* Load 
17980 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
17990 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
179a0 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65  straint at the e
179b0 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
179c0 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e   range (if any).
179d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e  .    */.    nCon
179e0 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20  straint = nEq;. 
179f0 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64     if( pRangeEnd
17a00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17a10 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
17a20 2c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78  , pRangeEnd->pEx
17a30 70 72 2d 3e 70 52 69 67 68 74 2c 20 72 65 67 42  pr->pRight, regB
17a40 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
17a50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17a60 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
17a70 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
17a80 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  rNxt);.      cod
17a90 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
17aa0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
17ab0 6e 45 71 2b 31 2c 20 70 49 64 78 29 3b 0a 20 20  nEq+1, pIdx);.  
17ac0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
17ad0 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  +;.    }..    /*
17ae0 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
17af0 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65   body */.    pLe
17b00 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
17b10 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
17b20 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (v);..    /* Che
17b30 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ck if the index 
17b40 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74  cursor is past t
17b50 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61  he end of the ra
17b60 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d  nge. */.    op =
17b70 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45   aEndOp[(pRangeE
17b80 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20  nd || nEq) * (1 
17b90 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65  + bRev)];.    te
17ba0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e  stcase( op==OP_N
17bb0 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63  oop );.    testc
17bc0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
17bd0 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
17be0 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  e( op==OP_IdxLT 
17bf0 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f  );.    if( op!=O
17c00 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
17c10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17c20 34 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  4(v, op, iIdxCur
17c30 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
17c40 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
17c50 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
17c60 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 43  TE_INT_TO_PTR(nC
17c70 6f 6e 73 74 72 61 69 6e 74 29 2c 20 50 34 5f 49  onstraint), P4_I
17c80 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  NT32);.      sql
17c90 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
17ca0 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20  (v, endEq!=bRev 
17cb0 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ?1:0);.    }..  
17cc0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
17cd0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
17ce0 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20  straints, check 
17cf0 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20  that the value. 
17d00 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62     ** of the tab
17d10 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  le column that t
17d20 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
17d30 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e  ntrains is not N
17d40 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69  ULL..    ** If i
17d50 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68  t is, jump to th
17d60 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
17d70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
17d80 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71    */.    r1 = sq
17d90 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
17da0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73  pParse);.    tes
17db0 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70  tcase( pLevel->p
17dc0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
17dd0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b  ERE_BTM_LIMIT );
17de0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
17df0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
17e00 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
17e10 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28  LIMIT );.    if(
17e20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
17e30 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42  Flags & (WHERE_B
17e40 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
17e50 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20  OP_LIMIT) ){.   
17e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17e70 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
17e80 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c  n, iIdxCur, nEq,
17e90 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
17ea0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17eb0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20   OP_IsNull, r1, 
17ec0 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d  addrCont);.    }
17ed0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
17ee0 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20  e table cursor, 
17ef0 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
17f00 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
17f10 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61  Level, pRangeSta
17f20 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65  rt);.    disable
17f30 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
17f40 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 63 6f 64  ngeEnd);.    cod
17f50 65 52 6f 77 53 65 74 45 61 72 6c 79 20 3d 20 72  eRowSetEarly = r
17f60 65 67 52 6f 77 53 65 74 3e 3d 30 20 3f 20 77 68  egRowSet>=0 ? wh
17f70 65 72 65 52 6f 77 52 65 61 64 79 46 6f 72 4f 75  ereRowReadyForOu
17f80 74 70 75 74 28 70 57 43 29 20 3a 20 30 3b 0a 20  tput(pWC) : 0;. 
17f90 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c     if( !omitTabl
17fa0 65 20 7c 7c 20 63 6f 64 65 52 6f 77 53 65 74 45  e || codeRowSetE
17fb0 61 72 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 71  arly ){.      sq
17fc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17fd0 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20  v, OP_IdxRowid, 
17fe0 69 49 64 78 43 75 72 2c 20 72 31 29 3b 0a 20 20  iIdxCur, r1);.  
17ff0 20 20 20 20 69 66 28 20 63 6f 64 65 52 6f 77 53      if( codeRowS
18000 65 74 45 61 72 6c 79 20 29 7b 0a 20 20 20 20 20  etEarly ){.     
18010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18020 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53 65  dOp2(v, OP_RowSe
18030 74 41 64 64 2c 20 72 65 67 52 6f 77 53 65 74 2c  tAdd, regRowSet,
18040 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   r1);.      }els
18050 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
18060 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18070 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 72  OP_Seek, iCur, r
18080 31 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64  1);  /* Deferred
18090 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 20 20 7d   seek */.      }
180a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
180b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
180c0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20  (pParse, r1);.. 
180d0 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65     /* Record the
180e0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65   instruction use
180f0 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
18100 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65  he loop. Disable
18110 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63   .    ** WHERE c
18120 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65  lause terms made
18130 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68   redundant by th
18140 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63  e index range sc
18150 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  an..    */.    p
18160 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76  Level->op = bRev
18170 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f   ? OP_Prev : OP_
18180 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Next;.    pLevel
18190 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a  ->p1 = iIdxCur;.
181a0 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
181b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
181c0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
181d0 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
181e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
181f0 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20  MULTI_OR ){.    
18200 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 77 6f 20  /* Case 4:  Two 
18210 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
18220 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73  ly indexed terms
18230 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
18240 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
18250 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
18260 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
18270 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29  ABLE t1(a,b,c,d)
18280 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
18290 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
182a0 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (a);.    **   CR
182b0 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e  EATE INDEX i2 ON
182c0 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(b);.    **  
182d0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33   CREATE INDEX i3
182e0 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a   ON t1(c);.    *
182f0 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
18300 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
18310 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20  E a=5 OR b=7 OR 
18320 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a  (c=11 AND d=13).
18330 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e      **.    ** In
18340 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68   the example, th
18350 65 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e  ere are three in
18360 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
18370 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20  ected by OR..   
18380 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74   ** The top of t
18390 68 65 20 6c 6f 6f 70 20 69 73 20 63 6f 6e 73 74  he loop is const
183a0 72 75 63 74 65 64 20 62 79 20 63 72 65 61 74 69  ructed by creati
183b0 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65  ng a RowSet obje
183c0 63 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f  ct.    ** and po
183d0 70 75 6c 61 74 69 6e 67 20 69 74 2e 20 20 54 68  pulating it.  Th
183e0 65 6e 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  en looping over 
183f0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
18400 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20  rowset..    **. 
18410 20 20 20 2a 2a 20 20 20 20 20 20 20 20 4e 75 6c     **        Nul
18420 6c 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  l 1.    **      
18430 20 20 23 20 66 69 6c 6c 20 52 6f 77 53 65 74 20    # fill RowSet 
18440 31 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 77  1 with entries w
18450 68 65 72 65 20 61 3d 35 20 75 73 69 6e 67 20 69  here a=5 using i
18460 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  1.    **        
18470 23 20 66 69 6c 6c 20 52 6f 77 73 65 74 20 31 20  # fill Rowset 1 
18480 77 69 74 68 20 65 6e 74 72 69 65 73 20 77 68 65  with entries whe
18490 72 65 20 62 3d 37 20 75 73 69 6e 67 20 69 32 0a  re b=7 using i2.
184a0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 23 20      **        # 
184b0 66 69 6c 6c 20 52 6f 77 73 65 74 20 31 20 77 69  fill Rowset 1 wi
184c0 74 68 20 65 6e 74 72 69 65 73 20 77 68 65 72 65  th entries where
184d0 20 63 3d 31 31 20 61 6e 64 20 64 3d 31 33 20 69   c=11 and d=13 i
184e0 33 20 61 6e 64 20 74 31 0a 20 20 20 20 2a 2a 20  3 and t1.    ** 
184f0 20 20 20 20 41 3a 20 52 6f 77 53 65 74 52 65 61      A: RowSetRea
18500 64 20 31 2c 20 42 2c 20 32 0a 20 20 20 20 2a 2a  d 1, B, 2.    **
18510 20 20 20 20 20 20 20 20 53 65 65 6b 20 20 20 20          Seek    
18520 20 20 20 69 2c 20 32 0a 20 20 20 20 2a 2a 0a 20     i, 2.    **. 
18530 20 20 20 2a 2a 20 54 68 65 20 62 6f 74 74 6f 6d     ** The bottom
18540 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f   of the loop loo
18550 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ks like this:.  
18560 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
18570 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 30 2c     Goto       0,
18580 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 42 3a   A.    **     B:
18590 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
185a0 72 65 67 4f 72 52 6f 77 73 65 74 3b 20 20 20 20  regOrRowset;    
185b0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
185c0 6f 6c 64 69 6e 67 20 74 68 65 20 52 6f 77 53 65  olding the RowSe
185d0 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  t object */.    
185e0 69 6e 74 20 72 65 67 4e 65 78 74 52 6f 77 69 64  int regNextRowid
185f0 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74  ;      /* Regist
18600 65 72 20 68 6f 6c 64 69 6e 67 20 6e 65 78 74 20  er holding next 
18610 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 57 68 65  rowid */.    Whe
18620 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
18630 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c      /* The OR-cl
18640 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20  ause broken out 
18650 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
18660 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
18670 70 4f 72 54 65 72 6d 3b 20 20 20 20 2f 2a 20 41  pOrTerm;    /* A
18680 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20   single subterm 
18690 77 69 74 68 69 6e 20 74 68 65 20 4f 52 2d 63 6c  within the OR-cl
186a0 61 75 73 65 20 2a 2f 0a 20 20 20 20 53 72 63 4c  ause */.    SrcL
186b0 69 73 74 20 6f 6e 65 54 61 62 3b 20 20 20 20 20  ist oneTab;     
186c0 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20     /* Shortened 
186d0 74 61 62 6c 65 20 6c 69 73 74 20 2a 2f 0a 20 20  table list */.  
186e0 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c   .    pTerm = pL
186f0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65  evel->plan.u.pTe
18700 72 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rm;.    assert( 
18710 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
18720 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
18730 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20  Operator==WO_OR 
18740 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
18750 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
18760 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30   TERM_ORINFO)!=0
18770 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20   );.    pOrWc = 
18780 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
18790 6f 2d 3e 77 63 3b 0a 20 20 20 20 63 6f 64 65 52  o->wc;.    codeR
187a0 6f 77 53 65 74 45 61 72 6c 79 20 3d 20 28 72 65  owSetEarly = (re
187b0 67 52 6f 77 53 65 74 3e 3d 30 20 26 26 20 70 57  gRowSet>=0 && pW
187c0 43 2d 3e 6e 54 65 72 6d 3d 3d 31 29 20 3f 31 3a  C->nTerm==1) ?1:
187d0 30 3b 0a 0a 20 20 20 20 69 66 28 20 63 6f 64 65  0;..    if( code
187e0 52 6f 77 53 65 74 45 61 72 6c 79 20 29 7b 0a 20  RowSetEarly ){. 
187f0 20 20 20 20 20 72 65 67 4f 72 52 6f 77 73 65 74       regOrRowset
18800 20 3d 20 72 65 67 52 6f 77 53 65 74 3b 0a 20 20   = regRowSet;.  
18810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
18820 65 67 4f 72 52 6f 77 73 65 74 20 3d 20 73 71 6c  egOrRowset = sql
18830 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
18840 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
18850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18860 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
18870 65 67 4f 72 52 6f 77 73 65 74 29 3b 0a 20 20 20  egOrRowset);.   
18880 20 7d 0a 20 20 20 20 6f 6e 65 54 61 62 2e 6e 53   }.    oneTab.nS
18890 72 63 20 3d 20 31 3b 0a 20 20 20 20 6f 6e 65 54  rc = 1;.    oneT
188a0 61 62 2e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  ab.nAlloc = 1;. 
188b0 20 20 20 6f 6e 65 54 61 62 2e 61 5b 30 5d 20 3d     oneTab.a[0] =
188c0 20 2a 70 54 61 62 49 74 65 6d 3b 0a 20 20 20 20   *pTabItem;.    
188d0 66 6f 72 28 6a 3d 30 2c 20 70 4f 72 54 65 72 6d  for(j=0, pOrTerm
188e0 3d 70 4f 72 57 63 2d 3e 61 3b 20 6a 3c 70 4f 72  =pOrWc->a; j<pOr
188f0 57 63 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  Wc->nTerm; j++, 
18900 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
18910 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75    WhereInfo *pSu
18920 62 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  bWInfo;.      if
18930 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
18940 75 72 73 6f 72 21 3d 69 43 75 72 20 26 26 20 70  ursor!=iCur && p
18950 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
18960 72 21 3d 57 4f 5f 41 4e 44 20 29 20 63 6f 6e 74  r!=WO_AND ) cont
18970 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 53 75 62  inue;.      pSub
18980 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
18990 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
189a0 2c 20 26 6f 6e 65 54 61 62 2c 20 70 4f 72 54 65  , &oneTab, pOrTe
189b0 72 6d 2d 3e 70 45 78 70 72 2c 20 30 2c 0a 20 20  rm->pExpr, 0,.  
189c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189d0 20 20 20 20 20 20 57 48 45 52 45 5f 46 49 4c 4c        WHERE_FILL
189e0 5f 52 4f 57 53 45 54 20 7c 20 57 48 45 52 45 5f  _ROWSET | WHERE_
189f0 4f 4d 49 54 5f 4f 50 45 4e 20 7c 20 57 48 45 52  OMIT_OPEN | WHER
18a00 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 2c 0a 20 20  E_OMIT_CLOSE,.  
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a20 20 20 20 20 20 20 72 65 67 4f 72 52 6f 77 73 65        regOrRowse
18a30 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  t);.      if( pS
18a40 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ubWInfo ){.     
18a50 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
18a60 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20  nd(pSubWInfo);. 
18a70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18a80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18a90 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
18aa0 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Cont);.    if( !
18ab0 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20  codeRowSetEarly 
18ac0 29 7b 0a 20 20 20 20 20 20 72 65 67 4e 65 78 74  ){.      regNext
18ad0 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
18ae0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
18af0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 43 6f 6e  );.      addrCon
18b00 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71  t = .         sq
18b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18b20 76 2c 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64  v, OP_RowSetRead
18b30 2c 20 72 65 67 4f 72 52 6f 77 73 65 74 2c 61 64  , regOrRowset,ad
18b40 64 72 42 72 6b 2c 72 65 67 4e 65 78 74 52 6f 77  drBrk,regNextRow
18b50 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
18b60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18b70 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 72  OP_Seek, iCur, r
18b80 65 67 4e 65 78 74 52 6f 77 69 64 29 3b 0a 20 20  egNextRowid);.  
18b90 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
18ba0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18bb0 2c 20 72 65 67 4e 65 78 74 52 6f 77 69 64 29 3b  , regNextRowid);
18bc0 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
18bd0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
18be0 70 50 61 72 73 65 2c 20 72 65 67 4f 72 52 6f 77  pParse, regOrRow
18bf0 73 65 74 29 3b 20 2f 2f 20 50 72 65 73 65 72 76  set); // Preserv
18c00 65 20 74 68 65 20 52 6f 77 53 65 74 20 2a 2f 0a  e the RowSet */.
18c10 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
18c20 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 20 20   = OP_Goto;.    
18c30 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 61    pLevel->p2 = a
18c40 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 7d 65 6c  ddrCont;.    }el
18c50 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
18c60 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
18c70 20 20 20 20 7d 0a 20 20 20 20 64 69 73 61 62 6c      }.    disabl
18c80 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
18c90 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  erm);.  }else.#e
18ca0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
18cb0 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
18cc0 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20  ION */..  {.    
18cd0 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65 72  /* Case 5:  Ther
18ce0 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69  e is no usable i
18cf0 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64  ndex.  We must d
18d00 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  o a complete.   
18d10 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
18d20 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
18d30 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
18d40 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
18d50 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ble==0 );.    as
18d60 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 29 3b  sert( bRev==0 );
18d70 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
18d80 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70  = OP_Next;.    p
18d90 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
18da0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
18db0 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
18dc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
18dd0 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  ewind, iCur, add
18de0 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65  rBrk);.    pLeve
18df0 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
18e00 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
18e10 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 63 6f 64  AN_STEP;.    cod
18e20 65 52 6f 77 53 65 74 45 61 72 6c 79 20 3d 20 30  eRowSetEarly = 0
18e30 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79  ;.  }.  notReady
18e40 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43   &= ~getMask(pWC
18e50 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->pMaskSet, iCur
18e60 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20  );..  /* Insert 
18e70 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65  code to test eve
18e80 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ry subexpression
18e90 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d   that can be com
18ea0 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d  pletely.  ** com
18eb0 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  puted using the 
18ec0 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74  current set of t
18ed0 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6b 20  ables..  */.  k 
18ee0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
18ef0 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
18f00 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
18f10 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
18f20 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73  xpr *pE;.    tes
18f30 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
18f40 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
18f50 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  TUAL );.    test
18f60 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
18f70 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
18f80 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  D );.    if( pTe
18f90 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
18fa0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
18fb0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
18fc0 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
18fd0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
18fe0 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63  notReady)!=0 ) c
18ff0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20  ontinue;.    pE 
19000 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
19010 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d      assert( pE!=
19020 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  0 );.    if( pLe
19030 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26  vel->iLeftJoin &
19040 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
19050 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
19060 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  in) ){.      con
19070 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
19080 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
19090 43 6f 6c 43 61 63 68 65 20 2b 3d 20 6b 3b 0a 20  ColCache += k;. 
190a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
190b0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
190c0 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
190d0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
190e0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
190f0 62 6c 65 43 6f 6c 43 61 63 68 65 20 2d 3d 20 6b  bleColCache -= k
19100 3b 0a 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20  ;.    k = 1;.   
19110 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
19120 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
19130 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c   }..  /* For a L
19140 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
19150 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  generate code th
19160 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74  at will record t
19170 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a  he fact that.  *
19180 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72  * at least one r
19190 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ow of the right 
191a0 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65  table has matche
191b0 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  d the left table
191c0 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  .  .  */.  if( p
191d0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
191e0 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
191f0 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
19200 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
19210 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
19220 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19230 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
19240 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
19250 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
19260 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c  nt((v, "record L
19270 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b  EFT JOIN hit"));
19280 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19290 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65  ClearColumnCache
192a0 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d  (pParse, pLevel-
192b0 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 20 20 73  >iTabCur);.    s
192c0 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 43  qlite3ExprClearC
192d0 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
192e0 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
192f0 75 72 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  ur);.    for(pTe
19300 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20  rm=pWC->a, j=0; 
19310 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b  j<pWC->nTerm; j+
19320 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
19330 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
19340 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
19350 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
19360 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
19370 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
19380 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
19390 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
193a0 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
193b0 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
193c0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
193d0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
193e0 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52  prereqAll & notR
193f0 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69  eady)!=0 ) conti
19400 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
19410 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  t( pTerm->pExpr 
19420 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19430 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
19440 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
19450 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
19460 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
19470 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
19480 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
19490 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
194a0 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 77   /*.  ** If it w
194b0 61 73 20 72 65 71 75 65 73 74 65 64 20 74 6f 20  as requested to 
194c0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
194d0 73 20 69 6e 20 61 20 72 6f 77 73 65 74 20 61 6e  s in a rowset an
194e0 64 20 74 68 61 74 20 68 61 73 0a 20 20 2a 2a 20  d that has.  ** 
194f0 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
19500 20 64 6f 2c 20 74 68 65 6e 20 64 6f 20 73 6f 20   do, then do so 
19510 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
19520 72 65 67 52 6f 77 53 65 74 3e 3d 30 20 26 26 20  regRowSet>=0 && 
19530 21 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79  !codeRowSetEarly
19540 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d   ){.    int r1 =
19550 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
19560 65 67 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  eg(pParse);.#ifn
19570 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19580 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
19590 20 69 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70   if(  (pLevel->p
195a0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
195b0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
195c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
195d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
195e0 76 2c 20 4f 50 5f 56 52 6f 77 69 64 2c 20 69 43  v, OP_VRowid, iC
195f0 75 72 2c 20 72 31 29 3b 0a 20 20 20 20 7d 65 6c  ur, r1);.    }el
19600 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
19610 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19620 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
19630 77 69 64 2c 20 69 43 75 72 2c 20 72 31 29 3b 0a  wid, iCur, r1);.
19640 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
19650 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19660 50 5f 52 6f 77 53 65 74 41 64 64 2c 20 72 65 67  P_RowSetAdd, reg
19670 52 6f 77 53 65 74 2c 20 72 31 29 3b 0a 20 20 20  RowSet, r1);.   
19680 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19690 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
196a0 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  1);.  }..  retur
196b0 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23  n notReady;.}..#
196c0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
196d0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68  E_TEST)./*.** Th
196e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
196f0 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78  able holds a tex
19700 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  t description of
19710 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65   query plan gene
19720 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  rated.** by the 
19730 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c  most recent call
19740 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
19750 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63  Begin().  Each c
19760 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69  all to WhereBegi
19770 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  n.** overwrites 
19780 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54  the previous.  T
19790 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
197a0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
197b0 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  ing and.** analy
197c0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61  sis only..*/.cha
197d0 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  r sqlite3_query_
197e0 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20  plan[BMS*2*40]; 
197f0 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
19800 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  join */.static i
19810 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20  nt nQPlan = 0;  
19820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19830 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e  ext free slow in
19840 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a   _query_plan[] *
19850 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
19860 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a  ITE_TEST */.../*
19870 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
19880 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
19890 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
198a0 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
198b0 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
198c0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
198d0 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20  f( pWInfo ){.   
198e0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
198f0 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e  i=0; i<pWInfo->n
19900 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  Level; i++){.   
19910 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
19920 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  _info *pInfo = p
19930 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78  WInfo->a[i].pIdx
19940 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
19950 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  pInfo ){.       
19960 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e   assert( pInfo->
19970 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
19980 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
19990 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
199a0 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65     if( pInfo->ne
199b0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
199c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
199d0 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e  te3_free(pInfo->
199e0 69 64 78 53 74 72 29 3b 0a 09 7d 0a 20 20 20 20  idxStr);..}.    
199f0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
19a00 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  e(db, pInfo);.  
19a10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19a20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
19a30 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20  (pWInfo->pWC);. 
19a40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
19a50 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
19a60 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
19a70 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
19a80 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
19a90 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
19aa0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
19ab0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
19ac0 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
19ad0 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
19ae0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
19af0 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
19b00 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
19b10 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
19b20 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
19b30 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
19b40 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
19b50 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
19b60 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
19b70 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
19b80 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
19b90 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
19ba0 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
19bb0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
19bc0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
19bd0 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
19be0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
19bf0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
19c00 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
19c10 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
19c20 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
19c30 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
19c40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
19c50 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
19c60 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
19c70 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
19c80 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
19c90 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
19ca0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
19cb0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
19cc0 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
19cd0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
19ce0 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
19cf0 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
19d00 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
19d10 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
19d20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
19d30 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
19d40 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
19d50 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
19d60 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
19d70 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
19d80 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
19d90 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
19da0 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
19db0 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
19dc0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
19dd0 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
19de0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
19df0 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
19e00 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
19e10 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e30 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
19e40 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
19e50 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
19e60 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
19e70 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
19e80 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
19e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ea0 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
19eb0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
19ec0 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
19ed0 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
19ee0 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
19ef0 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
19f00 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19f10 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
19f20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
19f30 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
19f40 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
19f50 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
19f60 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
19f70 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
19f80 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
19f90 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
19fa0 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
19fb0 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
19fc0 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
19fd0 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
19fe0 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
19ff0 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
1a000 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
1a010 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
1a020 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
1a030 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
1a040 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
1a050 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
1a060 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
1a070 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
1a080 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
1a090 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
1a0a0 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
1a0b0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
1a0c0 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
1a0d0 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
1a0e0 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
1a0f0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
1a100 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
1a110 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
1a120 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
1a130 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
1a140 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
1a150 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
1a160 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
1a170 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
1a180 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
1a190 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
1a1a0 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
1a1b0 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
1a1c0 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
1a1d0 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
1a1e0 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
1a1f0 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
1a200 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
1a210 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
1a220 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
1a230 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
1a240 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
1a250 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
1a260 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
1a270 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
1a280 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
1a290 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
1a2a0 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
1a2b0 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
1a2c0 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
1a2d0 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
1a2e0 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
1a2f0 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
1a300 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
1a310 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
1a320 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
1a330 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
1a340 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
1a350 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
1a360 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
1a370 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
1a380 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
1a390 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
1a3a0 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
1a3b0 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
1a3c0 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
1a3d0 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
1a3e0 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
1a3f0 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
1a400 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
1a410 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
1a420 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
1a430 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
1a440 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
1a450 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
1a460 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
1a470 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
1a480 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
1a490 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
1a4a0 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
1a4b0 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
1a4c0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
1a4d0 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
1a4e0 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
1a4f0 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
1a500 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
1a510 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
1a520 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
1a530 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1a540 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
1a550 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
1a560 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
1a570 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
1a580 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
1a590 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
1a5a0 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
1a5b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
1a5c0 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
1a5d0 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
1a5e0 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
1a5f0 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
1a600 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
1a610 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
1a620 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
1a630 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
1a640 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
1a650 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
1a660 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
1a670 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
1a680 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
1a690 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
1a6a0 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
1a6b0 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
1a6c0 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
1a6d0 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65  NG.**.** *ppOrde
1a6e0 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
1a6f0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
1a700 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1a710 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a  ECT statement,.*
1a720 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
1a730 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
1a740 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
1a750 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
1a760 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
1a770 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
1a780 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
1a790 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72  ement, then ppOr
1a7a0 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
1a7b0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78  *.** If an index
1a7c0 20 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20   can be used so 
1a7d0 74 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c  that the natural
1a7e0 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66   output order of
1a7f0 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63   the table.** sc
1a800 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f  an is correct fo
1a810 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
1a820 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74  lause, then that
1a830 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61   index is used a
1a840 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79  nd.** *ppOrderBy
1a850 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
1a860 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74    This is an opt
1a870 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70  imization that p
1a880 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e  revents an.** un
1a890 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f  necessary sort o
1a8a0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
1a8b0 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70   if an index app
1a8c0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
1a8d0 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
1a8e0 75 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  use already exis
1a8f0 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ts..**.** If the
1a900 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f   where clause lo
1a910 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72  ops cannot be ar
1a920 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64  ranged to provid
1a930 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
1a940 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74   output order, t
1a950 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72  hen the *ppOrder
1a960 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  By is unchanged.
1a970 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73  .*/.WhereInfo *s
1a980 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1a990 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1a9a0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
1a9b0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1a9c0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
1a9d0 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20  abList,    /* A 
1a9e0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
1a9f0 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
1aa00 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
1aa10 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  re,         /* T
1aa20 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1aa30 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a  */.  ExprList **
1aa40 70 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e  ppOrderBy, /* An
1aa50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1aa60 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75  , or NULL */.  u
1aa70 38 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  8 wctrlFlags,   
1aa80 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
1aa90 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
1aaa0 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
1aab0 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74  teInt.h */.  int
1aac0 20 72 65 67 52 6f 77 53 65 74 20 20 20 20 20 20   regRowSet      
1aad0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
1aae0 6f 6c 64 20 52 6f 77 53 65 74 20 69 66 20 57 48  old RowSet if WH
1aaf0 45 52 45 5f 46 49 4c 4c 5f 52 4f 57 53 45 54 20  ERE_FILL_ROWSET 
1ab00 69 73 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69  is set */.){.  i
1ab10 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1ab20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1ab30 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57  p counter */.  W
1ab40 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1ab50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
1ab60 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
1ab70 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
1ab80 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
1ab90 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1aba0 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
1abb0 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
1abc0 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42  se engine */.  B
1abd0 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
1abe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1abf0 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
1ac00 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
1ac10 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
1ac20 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
1ac30 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1ac40 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20  on mask set */. 
1ac50 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1ac60 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C;              
1ac70 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f   /* Decompositio
1ac80 6e 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  n of the WHERE c
1ac90 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
1aca0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1acb0 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20  pTabItem;  /* A 
1acc0 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f  single entry fro
1acd0 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  m pTabList */.  
1ace0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1acf0 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
1ad00 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
1ad10 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20  l in the pWInfo 
1ad20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  list */.  int iF
1ad30 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  rom;            
1ad40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1ad50 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63  st unused FROM c
1ad60 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f  lause element */
1ad70 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b  .  int andFlags;
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ad90 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74   AND-ed combinat
1ada0 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e  ion of all pWC->
1adb0 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20  a[].wtFlags */. 
1adc0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
1add0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1ade0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1adf0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
1ae00 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a   *pOrderBy = 0;.
1ae10 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
1ae20 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
1ae30 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
1ae40 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
1ae50 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
1ae60 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
1ae70 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61   .  */.  if( pTa
1ae80 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
1ae90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1aea0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1aeb0 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
1aec0 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
1aed0 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
1aee0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 70 4f  ;.  }..  if( ppO
1aef0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 70 4f  rderBy ){.    pO
1af00 72 64 65 72 42 79 20 3d 20 2a 70 70 4f 72 64 65  rderBy = *ppOrde
1af10 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  rBy;.  }..  /* A
1af20 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
1af30 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
1af40 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
1af50 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
1af60 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
1af70 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 64 62  value..  */.  db
1af80 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1af90 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
1afa0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1afb0 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,  .            
1afc0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1afd0 28 57 68 65 72 65 49 6e 66 6f 29 0a 20 20 20 20  (WhereInfo).    
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aff0 20 20 2b 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e    + (pTabList->n
1b000 53 72 63 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68  Src-1)*sizeof(Wh
1b010 65 72 65 4c 65 76 65 6c 29 0a 20 20 20 20 20 20  ereLevel).      
1b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b030 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 43 6c  + sizeof(WhereCl
1b040 61 75 73 65 29 0a 20 20 20 20 20 20 20 20 20 20  ause).          
1b050 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
1b060 7a 65 6f 66 28 57 68 65 72 65 4d 61 73 6b 53 65  zeof(WhereMaskSe
1b070 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 29 3b  t).           );
1b080 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1b090 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
1b0a0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
1b0b0 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  ror;.  }.  pWInf
1b0c0 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62  o->nLevel = pTab
1b0d0 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57  List->nSrc;.  pW
1b0e0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
1b0f0 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
1b100 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
1b110 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
1b120 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
1b130 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1b140 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 72 65 67 52  ;.  pWInfo->regR
1b150 6f 77 53 65 74 20 3d 20 28 77 63 74 72 6c 46 6c  owSet = (wctrlFl
1b160 61 67 73 20 26 20 57 48 45 52 45 5f 46 49 4c 4c  ags & WHERE_FILL
1b170 5f 52 4f 57 53 45 54 29 20 3f 20 72 65 67 52 6f  _ROWSET) ? regRo
1b180 77 53 65 74 20 3a 20 2d 31 3b 0a 20 20 70 57 49  wSet : -1;.  pWI
1b190 6e 66 6f 2d 3e 70 57 43 20 3d 20 70 57 43 20 3d  nfo->pWC = pWC =
1b1a0 20 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29 26   (WhereClause*)&
1b1b0 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f  pWInfo->a[pWInfo
1b1c0 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 70 57 49  ->nLevel];.  pWI
1b1d0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1b1e0 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20  = wctrlFlags;.  
1b1f0 70 4d 61 73 6b 53 65 74 20 3d 20 28 57 68 65 72  pMaskSet = (Wher
1b200 65 4d 61 73 6b 53 65 74 2a 29 26 70 57 43 5b 31  eMaskSet*)&pWC[1
1b210 5d 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74  ];..  /* Split t
1b220 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1b230 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75  into separate su
1b240 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65  bexpressions whe
1b250 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62  re each.  ** sub
1b260 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
1b270 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e  parated by an AN
1b280 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  D operator..  */
1b290 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70  .  initMaskSet(p
1b2a0 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72  MaskSet);.  wher
1b2b0 65 43 6c 61 75 73 65 49 6e 69 74 28 70 57 43 2c  eClauseInit(pWC,
1b2c0 20 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65   pParse, pMaskSe
1b2d0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
1b2e0 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70  rCodeConstants(p
1b2f0 50 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a  Parse, pWhere);.
1b300 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
1b310 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
1b320 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65  );.    .  /* Spe
1b330 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
1b340 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
1b350 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
1b360 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
1b370 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
1b380 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
1b390 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
1b3a0 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
1b3b0 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26  /.  if( pWhere &
1b3c0 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  & (pTabList->nSr
1b3d0 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  c==0 || sqlite3E
1b3e0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
1b3f0 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b  Join(pWhere)) ){
1b400 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1b410 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1b420 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e  pWhere, pWInfo->
1b430 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a  iBreak, SQLITE_J
1b440 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1b450 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
1b460 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
1b470 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
1b480 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
1b490 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
1b4a0 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
1b4b0 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62  When assigning b
1b4c0 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f  itmask values to
1b4d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72   FROM clause cur
1b4e0 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65  sors, it must be
1b4f0 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74  .  ** the case t
1b500 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20  hat if X is the 
1b510 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
1b520 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65  N-th FROM clause
1b530 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20   term then.  ** 
1b540 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
1b550 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
1b560 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66  terms to the lef
1b570 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65  t of the N-th te
1b580 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29  rm.  ** is (X-1)
1b590 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f  .   An expressio
1b5a0 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c  n from the ON cl
1b5b0 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
1b5c0 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a  OIN can use.  **
1b5d0 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74   its Expr.iRight
1b5e0 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20  JoinTable value 
1b5f0 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d  to find the bitm
1b600 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74  ask of the right
1b610 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74   table.  ** of t
1b620 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61  he join.  Subtra
1b630 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74  cting one from t
1b640 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62  he right table b
1b650 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20  itmask gives a. 
1b660 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20   ** bitmask for 
1b670 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
1b680 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f  e left of the jo
1b690 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65  in.  Knowing the
1b6a0 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f   bitmask.  ** fo
1b6b0 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
1b6c0 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
1b6d0 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72  ft join is impor
1b6e0 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33  tant.  Ticket #3
1b6f0 30 31 35 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  015..  */.  for(
1b700 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
1b710 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
1b720 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
1b730 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
1b740 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  a[i].iCursor);. 
1b750 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
1b760 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73  G.  {.    Bitmas
1b770 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b  k toTheLeft = 0;
1b780 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1b790 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1b7a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i++){.      Bitm
1b7b0 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28  ask m = getMask(
1b7c0 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
1b7d0 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
1b7e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1b7f0 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66   (m-1)==toTheLef
1b800 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65  t );.      toThe
1b810 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d  Left |= m;.    }
1b820 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1b830 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
1b840 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
1b850 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ons.  Note that 
1b860 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69  exprAnalyze() mi
1b870 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77  ght.  ** add new
1b880 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f   virtual terms o
1b890 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
1b8a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
1b8b0 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a    We do not.  **
1b8c0 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65   want to analyze
1b8d0 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74   these virtual t
1b8e0 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61  erms, so start a
1b8f0 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20  nalyzing at the 
1b900 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72  end.  ** and wor
1b910 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61  k forward so tha
1b920 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74  t the added virt
1b930 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65  ual terms are ne
1b940 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20  ver processed.. 
1b950 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a   */.  exprAnalyz
1b960 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 70  eAll(pTabList, p
1b970 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  WC);.  if( db->m
1b980 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1b990 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
1b9a0 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  inError;.  }..  
1b9b0 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65 73  /* Chose the bes
1b9c0 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  t index to use f
1b9d0 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
1b9e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1b9f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
1ba00 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74   loop fills in t
1ba10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1ba20 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  lds:.  **.  **  
1ba30 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64   pWInfo->a[].pId
1ba40 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65 78  x      The index
1ba50 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
1ba60 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f   level of the lo
1ba70 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  op..  **   pWInf
1ba80 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20 20  o->a[].wsFlags  
1ba90 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73   WHERE_xxx flags
1baa0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1bab0 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49   pIdx.  **   pWI
1bac0 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20  nfo->a[].nEq    
1bad0 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66     The number of
1bae0 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
1baf0 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57  raints.  **   pW
1bb00 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20  Info->a[].iFrom 
1bb10 20 20 20 20 57 68 69 63 68 20 74 65 72 6d 20 6f      Which term o
1bb20 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1bb30 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  e is being coded
1bb40 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
1bb50 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68  a[].iTabCur   Th
1bb60 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
1bb70 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  r the database t
1bb80 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e  able.  **   pWIn
1bb90 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20  fo->a[].iIdxCur 
1bba0 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f    The VDBE curso
1bbb0 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  r for the index.
1bbc0 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
1bbd0 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20 57 68 65  [].pTerm     Whe
1bbe0 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52  n wsFlags==WO_OR
1bbf0 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 20  , the OR-clause 
1bc00 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  term.  **.  ** T
1bc10 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69  his loop also fi
1bc20 67 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e 65  gures out the ne
1bc30 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66 20 74  sting order of t
1bc40 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
1bc50 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20  M.  ** clause.. 
1bc60 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
1bc70 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
1bc80 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61 62 4c  pTabItem = pTabL
1bc90 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76 65 6c  ist->a;.  pLevel
1bca0 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20   = pWInfo->a;.  
1bcb0 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20  andFlags = ~0;. 
1bcc0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
1bcd0 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72  * Optimizer Star
1bce0 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f  t ***\n"));.  fo
1bcf0 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c 65  r(i=iFrom=0, pLe
1bd00 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
1bd10 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1bd20 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
1bd30 0a 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 62  .    WhereCost b
1bd40 65 73 74 50 6c 61 6e 3b 20 20 20 20 20 20 20 20  estPlan;        
1bd50 20 2f 2a 20 4d 6f 73 74 20 65 66 66 69 63 69 65   /* Most efficie
1bd60 6e 74 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20  nt plan seen so 
1bd70 66 61 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  far */.    Index
1bd80 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
1bd90 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1bda0 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61  for FROM table a
1bdb0 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20  t pTabItem */.  
1bdc0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bde0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1bdf0 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f  r FROM tables */
1be00 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d  .    int bestJ =
1be10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1be20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
1be30 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73   j */.    Bitmas
1be40 6b 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  k m;            
1be50 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1be60 20 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20   value for j or 
1be70 62 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74  bestJ */.    int
1be80 20 6f 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20   once = 0;      
1be90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1bea0 20 77 68 65 6e 20 66 69 72 73 74 20 74 61 62 6c   when first tabl
1beb0 65 20 69 73 20 73 65 65 6e 20 2a 2f 0a 0a 20 20  e is seen */..  
1bec0 20 20 6d 65 6d 73 65 74 28 26 62 65 73 74 50 6c    memset(&bestPl
1bed0 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 65  an, 0, sizeof(be
1bee0 73 74 50 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65  stPlan));.    be
1bef0 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53  stPlan.rCost = S
1bf00 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20  QLITE_BIG_DBL;. 
1bf10 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20     for(j=iFrom, 
1bf20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62 4c 69  pTabItem=&pTabLi
1bf30 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54 61 62  st->a[j]; j<pTab
1bf40 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 2c  List->nSrc; j++,
1bf50 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20   pTabItem++){.  
1bf60 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f      int doNotReo
1bf70 72 64 65 72 3b 20 20 2f 2a 20 54 72 75 65 20 69  rder;  /* True i
1bf80 66 20 74 68 69 73 20 74 61 62 6c 65 20 73 68 6f  f this table sho
1bf90 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f 72 64  uld not be reord
1bfa0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 57 68  ered */.      Wh
1bfb0 65 72 65 43 6f 73 74 20 73 43 6f 73 74 3b 20 20  ereCost sCost;  
1bfc0 20 2f 2a 20 43 6f 73 74 20 69 6e 66 6f 72 6d 61   /* Cost informa
1bfd0 74 69 6f 6e 20 66 72 6f 6d 20 62 65 73 74 49 6e  tion from bestIn
1bfe0 64 65 78 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20  dex() */..      
1bff0 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20  doNotReorder =  
1c000 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74  (pTabItem->joint
1c010 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
1c020 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20  T_CROSS))!=0;.  
1c030 20 20 20 20 69 66 28 20 6f 6e 63 65 20 26 26 20      if( once && 
1c040 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
1c050 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d 20 3d 20  reak;.      m = 
1c060 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
1c070 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
1c080 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
1c090 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  (m & notReady)==
1c0a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1c0b0 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f   j==iFrom ) iFro
1c0c0 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  m++;.        con
1c0d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
1c0e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
1c0f0 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23  bItem->pTab );.#
1c100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c110 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1c120 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
1c130 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54  ual(pTabItem->pT
1c140 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ab) ){.        s
1c150 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1c160 6f 20 2a 70 56 74 61 62 49 64 78 3b 20 2f 2a 20  o *pVtabIdx; /* 
1c170 43 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20  Current virtual 
1c180 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
1c190 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1c1a0 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20  nfo **ppIdxInfo 
1c1b0 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e  = &pWInfo->a[j].
1c1c0 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pIdxInfo;.      
1c1d0 20 20 73 43 6f 73 74 2e 72 43 6f 73 74 20 3d 20    sCost.rCost = 
1c1e0 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78  bestVirtualIndex
1c1f0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54  (pParse, pWC, pT
1c200 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79  abItem, notReady
1c210 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c230 20 20 20 20 20 20 20 20 20 70 70 4f 72 64 65 72           ppOrder
1c240 42 79 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20  By ? *ppOrderBy 
1c250 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20 20 20 20  : 0, i==0,.     
1c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c280 20 20 70 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20    ppIdxInfo);.  
1c290 20 20 20 20 20 20 73 43 6f 73 74 2e 70 6c 61 6e        sCost.plan
1c2a0 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  .wsFlags = WHERE
1c2b0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20  _VIRTUALTABLE;. 
1c2c0 20 20 20 20 20 20 20 73 43 6f 73 74 2e 70 6c 61         sCost.pla
1c2d0 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d 20 70  n.u.pVtabIdx = p
1c2e0 56 74 61 62 49 64 78 20 3d 20 2a 70 70 49 64 78  VtabIdx = *ppIdx
1c2f0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 69 66  Info;.        if
1c300 28 20 70 56 74 61 62 49 64 78 20 26 26 20 70 56  ( pVtabIdx && pV
1c310 74 61 62 49 64 78 2d 3e 6f 72 64 65 72 42 79 43  tabIdx->orderByC
1c320 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 20  onsumed ){.     
1c330 20 20 20 20 20 73 43 6f 73 74 2e 70 6c 61 6e 2e       sCost.plan.
1c340 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
1c350 56 49 52 54 55 41 4c 54 41 42 4c 45 20 7c 20 57  VIRTUALTABLE | W
1c360 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20  HERE_ORDERBY;.  
1c370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c380 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e 45 71 20 3d  sCost.plan.nEq =
1c390 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
1c3a0 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f  (SQLITE_BIG_DBL/
1c3b0 32 2e 30 29 3c 73 43 6f 73 74 2e 72 43 6f 73 74  2.0)<sCost.rCost
1c3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1c3d0 20 54 68 65 20 63 6f 73 74 20 69 73 20 6e 6f 74   The cost is not
1c3e0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c   allowed to be l
1c3f0 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54  arger than SQLIT
1c400 45 5f 42 49 47 5f 44 42 4c 20 28 74 68 65 0a 20  E_BIG_DBL (the. 
1c410 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 69 74           ** init
1c420 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65  al value of lowe
1c430 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20 6c  stCost in this l
1c440 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20 74  oop. If it is, t
1c450 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hen.          **
1c460 20 74 68 65 20 28 63 6f 73 74 3c 6c 6f 77 65 73   the (cost<lowes
1c470 74 43 6f 73 74 29 20 74 65 73 74 20 62 65 6c 6f  tCost) test belo
1c480 77 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  w will never be 
1c490 74 72 75 65 2e 0a 20 20 20 20 20 20 20 20 20 20  true..          
1c4a0 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 73 43  */ .          sC
1c4b0 6f 73 74 2e 72 43 6f 73 74 20 3d 20 28 53 51 4c  ost.rCost = (SQL
1c4c0 49 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29  ITE_BIG_DBL/2.0)
1c4d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c4e0 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a    }else .#endif.
1c4f0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1c500 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  bestIndex(pParse
1c510 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c  , pWC, pTabItem,
1c520 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20   notReady,.     
1c530 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 3d               (i=
1c540 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 29  =0 && ppOrderBy)
1c550 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20   ? *ppOrderBy : 
1c560 30 2c 20 26 73 43 6f 73 74 29 3b 0a 20 20 20 20  0, &sCost);.    
1c570 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 6e    }.      if( on
1c580 63 65 3d 3d 30 20 7c 7c 20 73 43 6f 73 74 2e 72  ce==0 || sCost.r
1c590 43 6f 73 74 3c 62 65 73 74 50 6c 61 6e 2e 72 43  Cost<bestPlan.rC
1c5a0 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  ost ){.        o
1c5b0 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nce = 1;.       
1c5c0 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 43 6f 73   bestPlan = sCos
1c5d0 74 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 4a  t;.        bestJ
1c5e0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
1c5f0 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f      if( doNotReo
1c600 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rder ) break;.  
1c610 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1c620 6f 6e 63 65 20 29 3b 0a 20 20 20 20 61 73 73 65  once );.    asse
1c630 72 74 28 20 6e 6f 74 52 65 61 64 79 20 26 20 67  rt( notReady & g
1c640 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
1c650 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
1c660 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a  tJ].iCursor) );.
1c670 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
1c680 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73  "*** Optimizer s
1c690 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25 64 20  elects table %d 
1c6a0 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20  for loop %d\n", 
1c6b0 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20  bestJ,.         
1c6c0 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d    pLevel-pWInfo-
1c6d0 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62  >a));.    if( (b
1c6e0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
1c6f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
1c700 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ERBY)!=0 ){.    
1c710 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30    *ppOrderBy = 0
1c720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46  ;.    }.    andF
1c730 6c 61 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e  lags &= bestPlan
1c740 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  .plan.wsFlags;. 
1c750 20 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20     pLevel->plan 
1c760 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b  = bestPlan.plan;
1c770 0a 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61  .    if( bestPla
1c780 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
1c790 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
1c7a0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1c7b0 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
1c7c0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65  ->nTab++;.    }e
1c7d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
1c7e0 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b  l->iIdxCur = -1;
1c7f0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65  .    }.    notRe
1c800 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
1c810 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
1c820 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75  st->a[bestJ].iCu
1c830 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65  rsor);.    pLeve
1c840 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65 73 74 4a  l->iFrom = bestJ
1c850 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1c860 74 68 61 74 20 69 66 20 74 68 65 20 74 61 62 6c  that if the tabl
1c870 65 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 69  e scanned by thi
1c880 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e  s loop iteration
1c890 20 68 61 64 20 61 6e 0a 20 20 20 20 2a 2a 20 49   had an.    ** I
1c8a0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1c8b0 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74 2c   attached to it,
1c8c0 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65 64 20   that the named 
1c8d0 69 6e 64 65 78 20 69 73 20 62 65 69 6e 67 0a 20  index is being. 
1c8e0 20 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74     ** used for t
1c8f0 68 65 20 73 63 61 6e 2e 20 49 66 20 6e 6f 74 2c  he scan. If not,
1c900 20 74 68 65 6e 20 71 75 65 72 79 20 63 6f 6d 70   then query comp
1c910 69 6c 61 74 69 6f 6e 20 68 61 73 20 66 61 69 6c  ilation has fail
1c920 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75 72  ed..    ** Retur
1c930 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
1c940 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70 54  */.    pIdx = pT
1c950 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
1c960 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  .pIndex;.    if(
1c970 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69   pIdx ){.      i
1c980 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61  f( (bestPlan.pla
1c990 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1c9a0 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 7b  E_INDEXED)==0 ){
1c9b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c9c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1c9d0 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64   "cannot use ind
1c9e0 65 78 3a 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a  ex: %s", pIdx->z
1c9f0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
1ca00 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
1ca10 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ror;.      }else
1ca20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
1ca30 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
1ca40 61 75 73 65 20 69 73 20 75 73 65 64 2c 20 74 68  ause is used, th
1ca50 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 66 75  e bestIndex() fu
1ca60 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  nction is.      
1ca70 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
1ca80 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 64 65  to find the inde
1ca90 78 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  x specified in t
1caa0 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
1cab0 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ause.        ** 
1cac0 69 66 20 69 74 20 66 69 6e 64 20 61 6e 20 69 6e  if it find an in
1cad0 64 65 78 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 20  dex at all. */. 
1cae0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62         assert( b
1caf0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70  estPlan.plan.u.p
1cb00 49 64 78 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20  Idx==pIdx );.   
1cb10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1cb20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
1cb30 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
1cb40 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  shed ***\n"));. 
1cb50 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1cb60 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
1cb70 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
1cb80 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  r;.  }..  /* If 
1cb90 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
1cba0 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73  only selects a s
1cbb0 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20  ingle row, then 
1cbc0 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a  the ORDER BY.  *
1cbd0 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72 72 65  * clause is irre
1cbe0 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69  levant..  */.  i
1cbf0 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57  f( (andFlags & W
1cc00 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20  HERE_UNIQUE)!=0 
1cc10 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b 0a  && ppOrderBy ){.
1cc20 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
1cc30 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
1cc40 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
1cc50 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
1cc60 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  TE statement tha
1cc70 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a  t is requesting.
1cc80 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e    ** to use a on
1cc90 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
1cca0 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  , determine if t
1ccb0 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61  his is appropria
1ccc0 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65  te..  ** The one
1ccd0 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20  -pass algorithm 
1cce0 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68  only works if th
1ccf0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
1cd00 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
1cd10 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
1cd20 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65   update a single
1cd30 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   row..  */.  ass
1cd40 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
1cd50 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
1cd60 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
1cd70 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
1cd80 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72  1 );.  if( (wctr
1cd90 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
1cda0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
1cdb0 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67 73 20  =0 && (andFlags 
1cdc0 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
1cdd0 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 ){.    pWInfo
1cde0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b  ->okOnePass = 1;
1cdf0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
1ce00 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ].plan.wsFlags &
1ce10 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  = ~WHERE_IDX_ONL
1ce20 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  Y;.  }..  /* Ope
1ce30 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
1ce40 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
1ce50 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
1ce60 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
1ce70 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
1ce80 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ables..  */.  sq
1ce90 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
1cea0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
1ceb0 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  ); /* Insert the
1cec0 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72   cookie verifier
1ced0 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72 28 69   Goto */.  for(i
1cee0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
1cef0 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
1cf00 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
1cf10 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
1cf20 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
1cf30 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
1cf40 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
1cf50 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1cf60 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
1cf70 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
1cf80 78 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  x */..#ifndef SQ
1cf90 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
1cfa0 4e 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  N.    if( pParse
1cfb0 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
1cfc0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67        char *zMsg
1cfd0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  ;.      struct S
1cfe0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1cff0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
1d000 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
1d010 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  ;.      zMsg = s
1d020 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1d030 2c 20 22 54 41 42 4c 45 20 25 73 22 2c 20 70 49  , "TABLE %s", pI
1d040 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
1d050 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
1d060 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
1d070 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1d080 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1d090 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73   "%s AS %s", zMs
1d0a0 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  g, pItem->zAlias
1d0b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d0c0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
1d0d0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1d0e0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
1d0f0 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
1d100 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
1d110 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 57  (db, zMsg, "%s W
1d120 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c 0a 20  ITH INDEX %s",. 
1d130 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20            zMsg, 
1d140 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
1d150 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
1d160 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
1d170 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1d180 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
1d190 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  OR ){.        zM
1d1a0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1d1b0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1d1c0 25 73 20 56 49 41 20 4d 55 4c 54 49 2d 49 4e 44  %s VIA MULTI-IND
1d1d0 45 58 20 55 4e 49 4f 4e 22 2c 20 7a 4d 73 67 29  EX UNION", zMsg)
1d1e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1d1f0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
1d200 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
1d210 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
1d220 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20  OWID_RANGE) ){. 
1d230 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
1d240 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1d250 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e  , zMsg, "%s USIN
1d260 47 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20  G PRIMARY KEY", 
1d270 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 23  zMsg);.      }.#
1d280 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d290 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1d2a0 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 28        else if( (
1d2b0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1d2c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1d2d0 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
1d2e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d2f0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74  _index_info *pVt
1d300 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  abIdx = pLevel->
1d310 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b  plan.u.pVtabIdx;
1d320 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
1d330 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1d340 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49  db, zMsg, "%s VI
1d350 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
1d360 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a  X %d:%s", zMsg,.
1d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d380 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 69 64      pVtabIdx->id
1d390 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78 2d 3e  xNum, pVtabIdx->
1d3a0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 7d  idxStr);.      }
1d3b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
1d3c0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
1d3d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
1d3e0 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20 20 20  RDERBY ){.      
1d3f0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1d400 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1d410 67 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 22  g, "%s ORDER BY"
1d420 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
1d430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d440 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
1d450 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65 76 65  xplain, i, pLeve
1d460 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a 4d 73  l->iFrom, 0, zMs
1d470 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
1d480 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1d490 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
1d4a0 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61 62 49  AIN */.    pTabI
1d4b0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
1d4c0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
1d4d0 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
1d4e0 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
1d4f0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
1d500 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
1d510 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
1d520 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28  Schema);.    if(
1d530 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
1d540 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
1d550 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
1d560 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lect ) continue;
1d570 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d580 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1d590 45 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  E.    if( (pLeve
1d5a0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1d5b0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1d5c0 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
1d5d0 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61    int iCur = pTa
1d5e0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
1d5f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d600 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f  eAddOp4(v, OP_VO
1d610 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c  pen, iCur, 0, 0,
1d620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d630 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20           (const 
1d640 63 68 61 72 2a 29 70 54 61 62 2d 3e 70 56 74 61  char*)pTab->pVta
1d650 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20  b, P4_VTAB);.   
1d660 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1d670 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
1d680 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1d690 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
1d6a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63  .         && (wc
1d6b0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1d6c0 5f 4f 4d 49 54 5f 4f 50 45 4e 29 3d 3d 30 20 29  _OMIT_OPEN)==0 )
1d6d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  {.      int op =
1d6e0 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61   pWInfo->okOnePa
1d6f0 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74  ss ? OP_OpenWrit
1d700 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  e : OP_OpenRead;
1d710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
1d720 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
1d730 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
1d740 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70  r, iDb, pTab, op
1d750 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57  );.      if( !pW
1d760 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
1d770 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d  && pTab->nCol<BM
1d780 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  S ){.        Bit
1d790 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65  mask b = pTabIte
1d7a0 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  m->colUsed;.    
1d7b0 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
1d7c0 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20         for(; b; 
1d7d0 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20  b=b>>1, n++){}. 
1d7e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1d7f0 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 73 71  beChangeP2(v, sq
1d800 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1d810 41 64 64 72 28 76 29 2d 32 2c 20 6e 29 3b 0a 20  Addr(v)-2, n);. 
1d820 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1d830 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
1d840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1d850 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1d860 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
1d870 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
1d880 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
1d890 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  e);.    }.    pL
1d8a0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20  evel->iTabCur = 
1d8b0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
1d8c0 72 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  r;.    if( (pLev
1d8d0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1d8e0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
1d8f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e  )!=0 ){.      In
1d900 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76 65  dex *pIx = pLeve
1d910 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a  l->plan.u.pIdx;.
1d920 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
1d930 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  Key = sqlite3Ind
1d940 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
1d950 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69 6e  , pIx);.      in
1d960 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76  t iIdxCur = pLev
1d970 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
1d980 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
1d990 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
1d9a0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
1d9b0 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72 3e  assert( iIdxCur>
1d9c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1d9d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d9e0 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
1d9f0 73 2c 20 30 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75  s, 0, pIx->nColu
1da00 6d 6e 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  mn+1);.      sql
1da10 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1da20 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
1da30 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  IdxCur, pIx->tnu
1da40 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  m, iDb,.        
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f  (char*)pKey, P4_
1da70 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
1da80 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1da90 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
1daa0 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
1dab0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
1dac0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
1dad0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  arse, iDb);.  }.
1dae0 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d    pWInfo->iTop =
1daf0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1db00 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f  entAddr(v);..  /
1db10 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
1db20 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
1db30 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
1db40 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
1db50 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
1db60 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
1db70 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
1db80 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
1db90 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
1dba0 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
1dbb0 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
1dbc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
1dbd0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1dbe0 29 7b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  ){.    notReady 
1dbf0 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  = codeOneLoopSta
1dc00 72 74 28 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63  rt(pWInfo, i, wc
1dc10 74 72 6c 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61  trlFlags, notRea
1dc20 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  dy);.    pWInfo-
1dc30 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 57 49  >iContinue = pWI
1dc40 6e 66 6f 2d 3e 61 5b 69 5d 2e 61 64 64 72 43 6f  nfo->a[i].addrCo
1dc50 6e 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  nt;.  }..#ifdef 
1dc60 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20  SQLITE_TEST  /* 
1dc70 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  For testing and 
1dc80 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
1dc90 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72  ly */.  /* Recor
1dca0 64 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70  d in the query p
1dcb0 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lan information 
1dcc0 61 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e  about the curren
1dcd0 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64  t table.  ** and
1dce0 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
1dcf0 74 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66  to access it (if
1dd00 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74   any).  If the t
1dd10 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a  able itself.  **
1dd20 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74   is not used, it
1dd30 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27  s name is just '
1dd40 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65  {}'.  If no inde
1dd50 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74  x is used.  ** t
1dd60 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74  he index is list
1dd70 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20  ed as "{}".  If 
1dd80 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
1dd90 69 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a  is used the.  **
1dda0 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27   index name is '
1ddb0 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  *'..  */.  for(i
1ddc0 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
1ddd0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
1dde0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74  char *z;.    int
1ddf0 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d   n;.    pLevel =
1de00 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
1de10 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
1de20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
1de30 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
1de40 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41  z = pTabItem->zA
1de50 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d  lias;.    if( z=
1de60 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65  =0 ) z = pTabIte
1de70 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a  m->pTab->zName;.
1de80 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
1de90 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
1dea0 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
1deb0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
1dec0 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a  ery_plan)-10 ){.
1ded0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
1dee0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
1def0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
1df00 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1df10 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
1df20 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
1df30 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  {}", 2);.       
1df40 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
1df50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1df60 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
1df70 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
1df80 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Plan], z, n);.  
1df90 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
1dfa0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1dfb0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
1dfc0 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
1dfd0 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  ' ';.    }.    t
1dfe0 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
1dff0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
1e000 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
1e010 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1e020 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1e030 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
1e040 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20  ID_RANGE );.    
1e050 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
1e060 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
1e070 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
1e080 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
1e090 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73  .      memcpy(&s
1e0a0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
1e0b0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c  n[nQPlan], "* ",
1e0c0 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   2);.      nQPla
1e0d0 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  n += 2;.    }els
1e0e0 65 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70  e if( (pLevel->p
1e0f0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1e100 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
1e110 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ){.      n = sql
1e120 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65  ite3Strlen30(pLe
1e130 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
1e140 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1e150 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
1e160 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
1e170 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20  ery_plan)-2 ){. 
1e180 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
1e190 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
1e1a0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65  n[nQPlan], pLeve
1e1b0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
1e1c0 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
1e1d0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
1e1e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1e1f0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
1e200 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  n++] = ' ';.    
1e210 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1e220 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
1e230 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
1e240 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20  nQPlan], "{} ", 
1e250 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  3);.      nQPlan
1e260 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 3;.    }.  }
1e270 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e  .  while( nQPlan
1e280 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75  >0 && sqlite3_qu
1e290 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d  ery_plan[nQPlan-
1e2a0 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73  1]==' ' ){.    s
1e2b0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
1e2c0 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  n[--nQPlan] = 0;
1e2d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71  .  }.  sqlite3_q
1e2e0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
1e2f0 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20  ] = 0;.  nQPlan 
1e300 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  = 0;.#endif /* S
1e310 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65  QLITE_TEST // Te
1e320 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
1e330 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a  ing use only */.
1e340 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
1e350 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64   continuation ad
1e360 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65  dress in the Whe
1e370 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
1e380 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65  .  Then.  ** cle
1e390 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
1e3a0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
1e3b0 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
1e3c0 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
1e3d0 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
1e3e0 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 77 68  BeginError:.  wh
1e3f0 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
1e400 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
1e410 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
1e420 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f  nerate the end o
1e430 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
1e440 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  .  See comments 
1e450 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  on .** sqlite3Wh
1e460 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61  ereBegin() for a
1e470 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
1e480 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
1e490 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57  qlite3WhereEnd(W
1e4a0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1e4b0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
1e4c0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
1e4d0 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  rse;.  Vdbe *v =
1e4e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1e4f0 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
1e500 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
1e510 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1e520 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
1e530 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  bList;.  sqlite3
1e540 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1e550 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  b;..  /* Generat
1e560 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69  e loop terminati
1e570 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  on code..  */.  
1e580 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72  sqlite3ExprClear
1e590 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
1e5a0 73 65 2c 20 2d 31 29 3b 0a 20 20 66 6f 72 28 69  se, -1);.  for(i
1e5b0 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d  =pTabList->nSrc-
1e5c0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
1e5d0 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
1e5e0 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  nfo->a[i];.    s
1e5f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1e600 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
1e610 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  ->addrCont);.   
1e620 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
1e630 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
1e640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e650 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  Op2(v, pLevel->o
1e660 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  p, pLevel->p1, p
1e670 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20  Level->p2);.    
1e680 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1e690 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d  ngeP5(v, pLevel-
1e6a0 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >p5);.    }.    
1e6b0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
1e6c0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1e6d0 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76  _IN_ABLE && pLev
1e6e0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29  el->u.in.nIn>0 )
1e6f0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49  {.      struct I
1e700 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
1e710 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73    int j;.      s
1e720 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1e730 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
1e740 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  ->addrNxt);.    
1e750 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e    for(j=pLevel->
1e760 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70  u.in.nIn, pIn=&p
1e770 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
1e780 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a  oop[j-1]; j>0; j
1e790 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20  --, pIn--){.    
1e7a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1e7b0 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
1e7c0 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20  addrInTop+1);.  
1e7d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e7e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
1e7f0 78 74 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  xt, pIn->iCur, p
1e800 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
1e810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e820 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
1e830 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
1e840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e850 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e860 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
1e870 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
1e880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1e890 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
1e8a0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
1e8b0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
1e8c0 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
1e8d0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
1e8e0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
1e8f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
1e900 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d  P_IfPos, pLevel-
1e910 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
1e920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e930 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
1e940 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ow, pTabList->a[
1e950 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
1e960 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
1e970 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20  IdxCur>=0 ){.   
1e980 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e990 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
1e9a0 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
1e9b0 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
1e9c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e9d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1e9e0 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
1e9f0 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
1ea00 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1ea10 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
1ea20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
1ea30 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74  he "break" point
1ea40 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70   is here, just p
1ea50 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
1ea60 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20  he outer loop.. 
1ea70 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f   ** Set it..  */
1ea80 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1ea90 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57  solveLabel(v, pW
1eaa0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a  Info->iBreak);..
1eab0 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f    /* Close all o
1eac0 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
1ead0 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62  at were opened b
1eae0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
1eaf0 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  gin..  */.  for(
1eb00 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
1eb10 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  fo->a; i<pTabLis
1eb20 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c  t->nSrc; i++, pL
1eb30 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72  evel++){.    str
1eb40 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1eb50 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54   *pTabItem = &pT
1eb60 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
1eb70 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61  ->iFrom];.    Ta
1eb80 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
1eb90 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
1eba0 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
1ebb0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
1ebc0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
1ebd0 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
1ebe0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
1ebf0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1ec00 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
1ec10 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
1ec20 4d 49 54 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b  MIT_CLOSE)==0 ){
1ec30 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e  .      if( !pWIn
1ec40 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
1ec50 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
1ec60 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1ec70 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
1ec80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ec90 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
1eca0 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  lose, pTabItem->
1ecb0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
1ecc0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 65  }.      if( (pLe
1ecd0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1ece0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1ecf0 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
1ed00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ed10 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
1ed20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
1ed30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ed40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1ed50 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64  scan uses an ind
1ed60 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75  ex, make code su
1ed70 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72  bstitutions to r
1ed80 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  ead data.    ** 
1ed90 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69  from the index i
1eda0 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20  n preference to 
1edb0 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74  the table. Somet
1edc0 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73  imes, this means
1edd0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
1ede0 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20  e need never be 
1edf0 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20  read from. This 
1ee00 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  is a performance
1ee10 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61   boost,.    ** a
1ee20 73 20 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c  s the vdbe level
1ee30 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65   waits until the
1ee40 20 74 61 62 6c 65 20 69 73 20 72 65 61 64 20 62   table is read b
1ee50 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20  efore actually. 
1ee60 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68     ** seeking th
1ee70 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74  e table cursor t
1ee80 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72  o the record cor
1ee90 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
1eea0 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a  e current.    **
1eeb0 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
1eec0 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a   index..    ** .
1eed0 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
1eee0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
1eef0 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
1ef00 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
1ef10 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
1ef20 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
1ef30 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
1ef40 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
1ef50 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
1ef60 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
1ef70 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
1ef80 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
1ef90 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
1efa0 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
1efb0 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
1efc0 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
1efd0 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
1efe0 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
1eff0 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
1f000 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1f010 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1f020 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
1f030 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  EXED)!=0 ){.    
1f040 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74    int k, j, last
1f050 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
1f060 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64 65 78  pOp;.      Index
1f070 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d   *pIdx = pLevel-
1f080 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20  >plan.u.pIdx;.  
1f090 20 20 20 20 69 6e 74 20 75 73 65 49 6e 64 65 78      int useIndex
1f0a0 4f 6e 6c 79 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Only = pLevel->p
1f0b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1f0c0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20  ERE_IDX_ONLY;.. 
1f0d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
1f0e0 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f  x!=0 );.      pO
1f0f0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
1f100 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  etOp(v, pWInfo->
1f110 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73  iTop);.      las
1f120 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
1f130 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1f140 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66       for(k=pWInf
1f150 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b  o->iTop; k<last;
1f160 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   k++, pOp++){.  
1f170 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
1f180 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  1!=pLevel->iTabC
1f190 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
1f1a0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
1f1b0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
1f1c0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  n ){.          f
1f1d0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
1f1e0 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
1f1f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1f200 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69  Op->p2==pIdx->ai
1f210 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20  Column[j] ){.   
1f220 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
1f230 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  p2 = j;.        
1f240 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
1f250 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
1f260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
1f270 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1f280 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1f290 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1f2a0 28 21 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 7c  (!useIndexOnly |
1f2b0 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  | j<pIdx->nColum
1f2c0 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
1f2d0 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
1f2e0 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
1f2f0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
1f300 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
1f310 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
1f320 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
1f330 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
1f340 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
1f350 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52  opcode==OP_NullR
1f360 6f 77 20 26 26 20 75 73 65 49 6e 64 65 78 4f 6e  ow && useIndexOn
1f370 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
1f380 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
1f390 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  _Noop;.        }
1f3a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f3b0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63   }..  /* Final c
1f3c0 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 77 68  leanup.  */.  wh
1f3d0 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
1f3e0 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
1f3f0 6e 3b 0a 7d 0a                                   n;.}.