/ Hex Artifact Content
Login

Artifact b25a7ecf75cfdd7de430934f62f9e17083b9b806:


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 35  : where.c,v 1.35
0340: 35 20 32 30 30 38 2f 31 32 2f 33 30 20 31 37 3a  5 2008/12/30 17:
0350: 35 35 3a 30 30 20 64 72 68 20 45 78 70 20 24 0a  55:00 drh Exp $.
0360: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0370: 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a  iteInt.h"../*.**
0380: 20 54 72 61 63 65 20 6f 75 74 70 75 74 20 6d 61   Trace output ma
0390: 63 72 6f 73 0a 2a 2f 0a 23 69 66 20 64 65 66 69  cros.*/.#if defi
03a0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
03b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
03c0: 54 45 5f 44 45 42 55 47 29 0a 69 6e 74 20 73 71  TE_DEBUG).int sq
03d0: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
03e0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
03f0: 30 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  0.# define WHERE
0400: 54 52 41 43 45 28 58 29 20 20 69 66 28 73 71 6c  TRACE(X)  if(sql
0410: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 29 20  ite3WhereTrace) 
0420: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0430: 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65 66  tf X.#else.# def
0440: 69 6e 65 20 57 48 45 52 45 54 52 41 43 45 28 58  ine WHERETRACE(X
0450: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72  ).#endif../* For
0460: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 0a 2a  ward reference.*
0470: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0480: 20 57 68 65 72 65 43 6c 61 75 73 65 20 57 68 65   WhereClause Whe
0490: 72 65 43 6c 61 75 73 65 3b 0a 74 79 70 65 64 65  reClause;.typede
04a0: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4d 61  f struct WhereMa
04b0: 73 6b 53 65 74 20 57 68 65 72 65 4d 61 73 6b 53  skSet WhereMaskS
04c0: 65 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  et;.typedef stru
04d0: 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 57  ct WhereOrInfo W
04e0: 68 65 72 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65  hereOrInfo;.type
04f0: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0500: 41 6e 64 49 6e 66 6f 20 57 68 65 72 65 41 6e 64  AndInfo WhereAnd
0510: 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66 20 73 74  Info;.typedef st
0520: 72 75 63 74 20 57 68 65 72 65 43 6f 73 74 20 57  ruct WhereCost W
0530: 68 65 72 65 43 6f 73 74 3b 0a 0a 2f 2a 0a 2a 2a  hereCost;../*.**
0540: 20 54 68 65 20 71 75 65 72 79 20 67 65 6e 65 72   The query gener
0550: 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72 72  ator uses an arr
0560: 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20  ay of instances 
0570: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
0580: 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74 20  e to.** help it 
0590: 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62 65  analyze the sube
05a0: 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
05b0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
05c0: 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20 63   Each WHERE.** c
05d0: 6c 61 75 73 65 20 73 75 62 65 78 70 72 65 73 73  lause subexpress
05e0: 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
05f0: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
0600: 20 62 79 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   by AND operator
0610: 73 2e 0a 2a 2a 20 28 4e 6f 74 65 3a 20 74 68 65  s..** (Note: the
0620: 20 73 61 6d 65 20 64 61 74 61 20 73 74 72 75 63   same data struc
0630: 74 75 72 65 20 69 73 20 61 6c 73 6f 20 72 65 75  ture is also reu
0640: 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 67 72  sed to hold a gr
0650: 6f 75 70 20 6f 66 20 74 65 72 6d 73 0a 2a 2a 20  oup of terms.** 
0660: 73 65 70 61 72 61 74 65 64 20 62 79 20 4f 52 20  separated by OR 
0670: 6f 70 65 72 61 74 6f 72 73 2e 20 20 42 75 74 20  operators.  But 
0680: 61 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  at the top-level
0690: 2c 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  , everything is 
06a0: 41 4e 44 0a 2a 2a 20 73 65 70 61 72 61 74 65 64  AND.** separated
06b0: 2e 29 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65  .).**.** All Whe
06c0: 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c  reTerms are coll
06d0: 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  ected into a sin
06e0: 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  gle WhereClause 
06f0: 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20  structure.  .** 
0700: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
0710: 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a  entity holds:.**
0720: 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72 65  .**        Where
0730: 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72  Term.pWC->a[Wher
0740: 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68  eTerm.idx] == Wh
0750: 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68  ereTerm.**.** Wh
0760: 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20  en a term is of 
0770: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 3c               X <
0790: 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a  op> <expr>.**.**
07a0: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
07b0: 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f  lumn name and <o
07c0: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72  p> is one of cer
07d0: 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a  tain operators,.
07e0: 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65 72  ** then WhereTer
07f0: 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64  m.leftCursor and
0800: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66   WhereTerm.u.lef
0810: 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74  tColumn record t
0820: 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  he.** cursor num
0830: 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ber and column n
0840: 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68  umber for X.  Wh
0850: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
0860: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
0870: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
0880: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
0890: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
08a0: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
08b0: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
08c0: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
08d0: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
08e0: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
08f0: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
0900: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
0910: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
0920: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
0930: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65  s..**.** A Where
0940: 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20  Term might also 
0950: 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
0960: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
0970: 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20  d by OR:.**.**  
0980: 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70         (t1.X <op
0990: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31  > <expr>) OR (t1
09a0: 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20  .Y <op> <expr>) 
09b0: 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  OR .....**.** In
09c0: 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73   this second cas
09d0: 65 2c 20 77 74 46 6c 61 67 20 61 73 20 74 68 65  e, wtFlag as the
09e0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74   TERM_ORINFO set
09f0: 20 61 6e 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d   and eOperator==
0a00: 57 4f 5f 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65  WO_OR.** and the
0a10: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
0a20: 49 6e 66 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74  Info field point
0a30: 73 20 74 6f 20 61 75 78 69 6c 69 61 72 79 20 69  s to auxiliary i
0a40: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a  nformation that.
0a50: 2a 2a 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ** is collected 
0a60: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20  about the.**.** 
0a70: 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  If a term in the
0a80: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
0a90: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74  es not match eit
0aa0: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
0ab0: 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67  revious.** categ
0ac0: 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65  ories, then eOpe
0ad0: 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57  rator==0.  The W
0ae0: 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66  hereTerm.pExpr f
0af0: 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65  ield is still se
0b00: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67  t.** to the orig
0b10: 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73 69  inal subexpressi
0b20: 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77  on content and w
0b30: 74 46 6c 61 67 73 20 69 73 20 73 65 74 20 75 70  tFlags is set up
0b40: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a   appropriately.*
0b50: 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66  * but no other f
0b60: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65  ields in the Whe
0b70: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72  reTerm object ar
0b80: 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a  e meaningful..**
0b90: 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74  .** When eOperat
0ba0: 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67  or!=0, prereqRig
0bb0: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
0bc0: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
0bd0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
0be0: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
0bf0: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
0c00: 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73   single WhereMas
0c10: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74  kSet structure t
0c20: 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72  ranslates.** cur
0c30: 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  sor number into 
0c40: 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61  bits and the tra
0c50: 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73  nslated bit is s
0c60: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65  tored in the pre
0c70: 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20  req.** fields.  
0c80: 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  The translation 
0c90: 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72  is used in order
0ca0: 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65   to maximize the
0cb0: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69   number of.** bi
0cc0: 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  ts that will fit
0cd0: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20   in a Bitmask.  
0ce0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
0cf0: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65  numbers might be
0d00: 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f  .** spread out o
0d10: 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61  ver the non-nega
0d20: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20  tive integers.  
0d30: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
0d40: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
0d50: 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38  rs might be 3, 8
0d60: 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c  , 9, 10, 20, 23,
0d70: 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68   41, and 45.  Th
0d80: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a  e WhereMaskSet.*
0d90: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
0da0: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
0db0: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
0dc0: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
0dd0: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
0de0: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
0df0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
0e00: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
0e10: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
0e20: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
0e30: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
0e40: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
0e50: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
0e60: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
0e70: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
0e80: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
0e90: 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  7..**.** The num
0ea0: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
0eb0: 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65  a join is limite
0ec0: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
0ed0: 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72  of bits.** in pr
0ee0: 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70 72  ereqRight and pr
0ef0: 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65  ereqAll.  The de
0f00: 66 61 75 6c 74 20 69 73 20 36 34 20 62 69 74 73  fault is 64 bits
0f10: 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a  , hence SQLite.*
0f20: 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74  * is only able t
0f30: 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20  o process joins 
0f40: 77 69 74 68 20 36 34 20 6f 72 20 66 65 77 65 72  with 64 or fewer
0f50: 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65   tables..*/.type
0f60: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0f70: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0f80: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f90: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0fb0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0fc0: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
0fd0: 74 20 69 73 20 74 68 69 73 20 74 65 72 6d 20 2a  t is this term *
0fe0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1000: 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50  isable pWC->a[iP
1010: 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73  arent] when this
1020: 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a   term disabled *
1030: 2f 0a 20 20 69 6e 74 20 6c 65 66 74 43 75 72 73  /.  int leftCurs
1040: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  or;         /* C
1050: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1060: 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78  X in "X <op> <ex
1070: 70 72 3e 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  pr>" */.  union 
1080: 7b 0a 20 20 20 20 69 6e 74 20 6c 65 66 74 43 6f  {.    int leftCo
1090: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lumn;         /*
10a0: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
10b0: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
10c0: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68  expr>" */.    Wh
10d0: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
10e0: 66 6f 3b 20 20 20 2f 2a 20 45 78 74 72 61 20 69  fo;   /* Extra i
10f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f  nformation if eO
1100: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a  perator==WO_OR *
1110: 2f 0a 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e  /.    WhereAndIn
1120: 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a  fo *pAndInfo; /*
1130: 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   Extra informati
1140: 6f 6e 20 69 66 20 65 4f 70 65 72 61 74 6f 72 3d  on if eOperator=
1150: 3d 57 4f 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75  =WO_AND */.  } u
1160: 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  ;.  u16 eOperato
1170: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
1180: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
1190: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
11a0: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
11b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
11c0: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
11d0: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
11e0: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
11f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1200: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
1210: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
1220: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
1230: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
1240: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
1250: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
1260: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
1270: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
1280: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
1290: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
12a0: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
12b0: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
12c0: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
12d0: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
12e0: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
12f0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
1300: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
1310: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
1320: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
1330: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
1340: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
1350: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
1360: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1370: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
1380: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
1390: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
13a0: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
13b0: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
13c0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
13d0: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
13e0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
13f0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
1400: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
1410: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
1420: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
1430: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
1440: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
1450: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
1460: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
1470: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
1480: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
1490: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
14a0: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
14b0: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
14c0: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
14d0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
14e0: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
14f0: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
1500: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
1510: 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ng */../*.** An 
1520: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1530: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1540: 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e  ure holds all in
1550: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1560: 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  a.** WHERE claus
1570: 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20  e.  Mostly this 
1580: 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66  is a container f
1590: 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  or one or more W
15a0: 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74  hereTerms..*/.st
15b0: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
15c0: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
15d0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se;           /*
15e0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
15f0: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  ext */.  WhereMa
1600: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
1610: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 6f 66 20    /* Mapping of 
1620: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d  table cursor num
1630: 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73  bers to bitmasks
1640: 20 2a 2f 0a 20 20 75 38 20 6f 70 3b 20 20 20 20   */.  u8 op;    
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1660: 2a 20 53 70 6c 69 74 20 6f 70 65 72 61 74 6f 72  * Split operator
1670: 2e 20 20 54 4b 5f 41 4e 44 20 6f 72 20 54 4b 5f  .  TK_AND or TK_
1680: 4f 52 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  OR */.  int nTer
1690: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
16a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
16b0: 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c  rms */.  int nSl
16c0: 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
16d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
16e0: 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f  ntries in a[] */
16f0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b  .  WhereTerm *a;
1700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1710: 61 63 68 20 61 5b 5d 20 64 65 73 63 72 69 62 65  ach a[] describe
1720: 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  s a term of the 
1730: 57 48 45 52 45 20 63 6c 75 61 73 65 20 2a 2f 0a  WHERE cluase */.
1740: 20 20 57 68 65 72 65 54 65 72 6d 20 61 53 74 61    WhereTerm aSta
1750: 74 69 63 5b 34 5d 3b 20 20 20 20 2f 2a 20 49 6e  tic[4];    /* In
1760: 69 74 69 61 6c 20 73 74 61 74 69 63 20 73 70 61  itial static spa
1770: 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 7d 3b  ce for a[] */.};
1780: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54  ../*.** A WhereT
1790: 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74  erm with eOperat
17a0: 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74  or==WO_OR has it
17b0: 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e  s u.pOrInfo poin
17c0: 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20  ter set to.** a 
17d0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
17e0: 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f  cated instance o
17f0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1800: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
1810: 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f  ruct WhereOrInfo
1820: 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65   {.  WhereClause
1830: 20 77 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   wc;          /*
1840: 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69   Decomposition i
1850: 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a  nto subterms */.
1860: 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61    Bitmask indexa
1870: 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69  ble;       /* Bi
1880: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64  tmask of all ind
1890: 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e  exable tables in
18a0: 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d   the clause */.}
18b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65  ;../*.** A Where
18c0: 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61  Term with eOpera
18d0: 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20  tor==WO_AND has 
18e0: 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70  its u.pAndInfo p
18f0: 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a  ointer set to.**
1900: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
1910: 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63  llocated instanc
1920: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1930: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
1940: 0a 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64  .struct WhereAnd
1950: 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c  Info {.  WhereCl
1960: 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20  ause wc;        
1970: 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78 70 72    /* The subexpr
1980: 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75  ession broken ou
1990: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
19a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
19b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
19c0: 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63  cture keeps trac
19d0: 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a  k of a mapping.*
19e0: 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63  * between VDBE c
19f0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e  ursor numbers an
1a00: 64 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69  d bits of the bi
1a10: 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54  tmasks in WhereT
1a20: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  erm..**.** The V
1a30: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1a40: 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74  rs are small int
1a50: 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20  egers contained 
1a60: 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69  in .** SrcList_i
1a70: 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20  tem.iCursor and 
1a80: 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c  Expr.iTable fiel
1a90: 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76  ds.  For any giv
1aa0: 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61  en WHERE .** cla
1ab0: 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  use, the cursor 
1ac0: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f  numbers might no
1ad0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61  t begin with 0 a
1ae0: 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a  nd they might.**
1af0: 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e   contain gaps in
1b00: 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73   the numbering s
1b10: 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65  equence.  But we
1b20: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61   want to make ma
1b30: 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20  ximum.** use of 
1b40: 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20  the bits in our 
1b50: 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20  bitmasks.  This 
1b60: 73 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64  structure provid
1b70: 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  es a mapping.** 
1b80: 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20  from the sparse 
1b90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69  cursor numbers i
1ba0: 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20  nto consecutive 
1bb0: 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69  integers beginni
1bc0: 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a  ng.** with 0..**
1bd0: 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61 73 6b  .** If WhereMask
1be0: 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20  Set.ix[A]==B it 
1bf0: 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65 20 41  means that The A
1c00: 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42 69 74  -th bit of a Bit
1c10: 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  mask.** correspo
1c20: 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f 72 20  nds VDBE cursor 
1c30: 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41  number B.  The A
1c40: 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62 69 74  -th bit of a bit
1c50: 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a  mask is 1<<A..**
1c60: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
1c70: 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
1c80: 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ause expression 
1c90: 75 73 65 64 20 74 68 65 73 65 20 56 44 42 45 0a  used these VDBE.
1ca0: 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20  ** cursors:  4, 
1cb0: 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33  5, 8, 29, 57, 73
1cc0: 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57 68 65  .  Then the  Whe
1cd0: 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
1ce0: 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70  ure.** would map
1cf0: 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75   those cursor nu
1d00: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20  mbers into bits 
1d10: 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a  0 through 5..**.
1d20: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
1d30: 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20   mapping is not 
1d40: 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65  necessarily orde
1d50: 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61  red.  In the exa
1d60: 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  mple.** above, t
1d70: 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74  he mapping might
1d80: 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20   go like this:  
1d90: 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32  4->3, 5->1, 8->2
1da0: 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e  , 29->0,.** 57->
1db0: 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e  5, 73->4.  Or on
1dc0: 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63  e of 719 other c
1dd0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68  ombinations migh
1de0: 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a  t be used. It.**
1df0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79   does not really
1e00: 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74 20 69   matter.  What i
1e10: 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74  s important is t
1e20: 68 61 74 20 73 70 61 72 73 65 20 63 75 72 73 6f  hat sparse curso
1e30: 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c  r.** numbers all
1e40: 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f   get mapped into
1e50: 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61   bit numbers tha
1e60: 74 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61  t begin with 0 a
1e70: 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f  nd contain.** no
1e80: 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74   gaps..*/.struct
1e90: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 7b 0a   WhereMaskSet {.
1ea0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73  /* Number of ass
1ed0: 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c  igned cursor val
1ee0: 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b  ues */.  int ix[
1ef0: 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20 20 20  BMS];           
1f00: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
1f10: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
1f20: 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  h bit */.};../*.
1f30: 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74 20 6f  ** A WhereCost o
1f40: 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20 61 20  bject records a 
1f50: 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67 79 20  lookup strategy 
1f60: 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61 74 65  and the estimate
1f70: 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70 75 72  d.** cost of pur
1f80: 73 75 69 6e 67 20 74 68 61 74 20 73 74 72 61 74  suing that strat
1f90: 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  egy..*/.struct W
1fa0: 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57 68 65  hereCost {.  Whe
1fb0: 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20 20 20  rePlan plan;    
1fc0: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 73 74  /* The lookup st
1fd0: 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f 75 62  rategy */.  doub
1fe0: 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20 20 2f  le rCost;      /
1ff0: 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74 20 6f  * Overall cost o
2000: 66 20 70 75 72 73 75 69 6e 67 20 74 68 69 73 20  f pursuing this 
2010: 73 65 61 72 63 68 20 73 74 72 61 74 65 67 79 20  search strategy 
2020: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77  */.  double nRow
2030: 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d  ;       /* Estim
2040: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
2050: 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 7d 3b  utput rows */.};
2060: 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73  ../*.** Bitmasks
2070: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
2080: 72 73 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  rs that indices 
2090: 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78 70 6c  are able to expl
20a0: 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65  oit.  An.** OR-e
20b0: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
20c0: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 63 61   these values ca
20d0: 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 73  n be used when s
20e0: 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20  earching for.** 
20f0: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65  terms in the whe
2100: 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64  re clause..*/.#d
2110: 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20  efine WO_IN     
2120: 30 78 30 30 31 0a 23 64 65 66 69 6e 65 20 57 4f  0x001.#define WO
2130: 5f 45 51 20 20 20 20 20 30 78 30 30 32 0a 23 64  _EQ     0x002.#d
2140: 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20  efine WO_LT     
2150: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54  (WO_EQ<<(TK_LT-T
2160: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2170: 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_LE     (WO_EQ<
2180: 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a  <(TK_LE-TK_EQ)).
2190: 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20 20 20  #define WO_GT   
21a0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54    (WO_EQ<<(TK_GT
21b0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
21c0: 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f 45   WO_GE     (WO_E
21d0: 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29  Q<<(TK_GE-TK_EQ)
21e0: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41 54  ).#define WO_MAT
21f0: 43 48 20 20 30 78 30 34 30 0a 23 64 65 66 69 6e  CH  0x040.#defin
2200: 65 20 57 4f 5f 49 53 4e 55 4c 4c 20 30 78 30 38  e WO_ISNULL 0x08
2210: 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4f 52 20  0.#define WO_OR 
2220: 20 20 20 20 30 78 31 30 30 20 20 20 20 20 20 20      0x100       
2230: 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  /* Two or more O
2240: 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
2250: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  s */.#define WO_
2260: 41 4e 44 20 20 20 20 30 78 32 30 30 20 20 20 20  AND    0x200    
2270: 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72     /* Two or mor
2280: 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  e AND-connected 
2290: 74 65 72 6d 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  terms */..#defin
22a0: 65 20 57 4f 5f 41 4c 4c 20 20 20 20 30 78 66 66  e WO_ALL    0xff
22b0: 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  f       /* Mask 
22c0: 6f 66 20 61 6c 6c 20 70 6f 73 73 69 62 6c 65 20  of all possible 
22d0: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 23  WO_* values */.#
22e0: 64 65 66 69 6e 65 20 57 4f 5f 53 49 4e 47 4c 45  define WO_SINGLE
22f0: 20 30 78 30 66 66 20 20 20 20 20 20 20 2f 2a 20   0x0ff       /* 
2300: 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f 6e 2d  Mask of all non-
2310: 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20 76 61  compound WO_* va
2320: 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56  lues */../*.** V
2330: 61 6c 75 65 20 66 6f 72 20 77 73 46 6c 61 67 73  alue for wsFlags
2340: 20 72 65 74 75 72 6e 65 64 20 62 79 20 62 65 73   returned by bes
2350: 74 49 6e 64 65 78 28 29 20 61 6e 64 20 73 74 6f  tIndex() and sto
2360: 72 65 64 20 69 6e 0a 2a 2a 20 57 68 65 72 65 4c  red in.** WhereL
2370: 65 76 65 6c 2e 77 73 46 6c 61 67 73 2e 20 20 54  evel.wsFlags.  T
2380: 68 65 73 65 20 66 6c 61 67 73 20 64 65 74 65 72  hese flags deter
2390: 6d 69 6e 65 20 77 68 69 63 68 20 73 65 61 72 63  mine which searc
23a0: 68 0a 2a 2a 20 73 74 72 61 74 65 67 69 65 73 20  h.** strategies 
23b0: 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 2e  are appropriate.
23c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 61 73 74  .**.** The least
23d0: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 31 32 20   significant 12 
23e0: 62 69 74 73 20 69 73 20 72 65 73 65 72 76 65 64  bits is reserved
23f0: 20 61 73 20 61 20 6d 61 73 6b 20 66 6f 72 20 57   as a mask for W
2400: 4f 5f 20 76 61 6c 75 65 73 20 61 62 6f 76 65 2e  O_ values above.
2410: 0a 2a 2a 20 54 68 65 20 57 68 65 72 65 4c 65 76  .** The WhereLev
2420: 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65 6c 64  el.wsFlags field
2430: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 65 74 20   is usually set 
2440: 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57  to WO_IN|WO_EQ|W
2450: 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a 20 42 75 74  O_ISNULL..** But
2460: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2470: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
2480: 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 2c   of a left join,
2490: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
24a0: 61 67 73 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ags.** is set to
24b0: 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 2e 20 20 54   WO_IN|WO_EQ.  T
24c0: 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73  he WhereLevel.ws
24d0: 46 6c 61 67 73 20 66 69 65 6c 64 20 63 61 6e 20  Flags field can 
24e0: 74 68 65 6e 20 62 65 20 75 73 65 64 20 61 73 0a  then be used as.
24f0: 2a 2a 20 74 68 65 20 22 6f 70 22 20 70 61 72 61  ** the "op" para
2500: 6d 65 74 65 72 20 74 6f 20 66 69 6e 64 54 65 72  meter to findTer
2510: 6d 20 77 68 65 6e 20 77 65 20 61 72 65 20 72 65  m when we are re
2520: 73 6f 6c 76 69 6e 67 20 65 71 75 61 6c 69 74 79  solving equality
2530: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a   constraints..**
2540: 20 49 53 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69   ISNULL constrai
2550: 6e 74 73 20 77 69 6c 6c 20 74 68 65 6e 20 6e 6f  nts will then no
2560: 74 20 62 65 20 75 73 65 64 20 6f 6e 20 74 68 65  t be used on the
2570: 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
2580: 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f 69 6e 2e 20  a left.** join. 
2590: 20 54 69 63 6b 65 74 73 20 23 32 31 37 37 20 61   Tickets #2177 a
25a0: 6e 64 20 23 32 31 38 39 2e 0a 2a 2f 0a 23 64 65  nd #2189..*/.#de
25b0: 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44  fine WHERE_ROWID
25c0: 5f 45 51 20 20 20 20 20 30 78 30 30 30 30 31 30  _EQ     0x000010
25d0: 30 30 20 20 2f 2a 20 72 6f 77 69 64 3d 45 58 50  00  /* rowid=EXP
25e0: 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28 2e  R or rowid IN (.
25f0: 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ..) */.#define W
2600: 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
2610: 20 20 30 78 30 30 30 30 32 30 30 30 20 20 2f 2a    0x00002000  /*
2620: 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e 64 2f   rowid<EXPR and/
2630: 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20 2a 2f  or rowid>EXPR */
2640: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
2650: 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78 30 30  OLUMN_EQ    0x00
2660: 30 31 30 30 30 30 20 20 2f 2a 20 78 3d 45 58 50  010000  /* x=EXP
2670: 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20  R or x IN (...) 
2680: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
2690: 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78  _COLUMN_RANGE 0x
26a0: 30 30 30 32 30 30 30 30 20 20 2f 2a 20 78 3c 45  00020000  /* x<E
26b0: 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50  XPR and/or x>EXP
26c0: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
26d0: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20  RE_COLUMN_IN    
26e0: 30 78 30 30 30 34 30 30 30 30 20 20 2f 2a 20 78  0x00040000  /* x
26f0: 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65   IN (...) */.#de
2700: 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45 58  fine WHERE_INDEX
2710: 45 44 20 20 20 20 20 20 30 78 30 30 30 37 30 30  ED      0x000700
2720: 30 30 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20  00  /* Anything 
2730: 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64  that uses an ind
2740: 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  ex */.#define WH
2750: 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20 20 20 20  ERE_IN_ABLE     
2760: 20 30 78 30 30 30 37 31 30 30 30 20 20 2f 2a 20   0x00071000  /* 
2770: 41 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20  Able to support 
2780: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  an IN operator *
2790: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
27a0: 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  TOP_LIMIT    0x0
27b0: 30 31 30 30 30 30 30 20 20 2f 2a 20 78 3c 45 58  0100000  /* x<EX
27c0: 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f  PR or x<=EXPR co
27d0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
27e0: 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ine WHERE_BTM_LI
27f0: 4d 49 54 20 20 20 20 30 78 30 30 32 30 30 30 30  MIT    0x0020000
2800: 30 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20  0  /* x>EXPR or 
2810: 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69  x>=EXPR constrai
2820: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  nt */.#define WH
2830: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20 20  ERE_IDX_ONLY    
2840: 20 30 78 30 30 38 30 30 30 30 30 20 20 2f 2a 20   0x00800000  /* 
2850: 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2d  Use index only -
2860: 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a 23   omit table */.#
2870: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 52 44  define WHERE_ORD
2880: 45 52 42 59 20 20 20 20 20 20 30 78 30 31 30 30  ERBY      0x0100
2890: 30 30 30 30 20 20 2f 2a 20 4f 75 74 70 75 74 20  0000  /* Output 
28a0: 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20 63  will appear in c
28b0: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f 0a  orrect order */.
28c0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 45  #define WHERE_RE
28d0: 56 45 52 53 45 20 20 20 20 20 20 30 78 30 32 30  VERSE      0x020
28e0: 30 30 30 30 30 20 20 2f 2a 20 53 63 61 6e 20 69  00000  /* Scan i
28f0: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
2900: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
2910: 5f 55 4e 49 51 55 45 20 20 20 20 20 20 20 30 78  _UNIQUE       0x
2920: 30 34 30 30 30 30 30 30 20 20 2f 2a 20 53 65 6c  04000000  /* Sel
2930: 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  ects no more tha
2940: 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23 64 65  n one row */.#de
2950: 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55  fine WHERE_VIRTU
2960: 41 4c 54 41 42 4c 45 20 30 78 30 38 30 30 30 30  ALTABLE 0x080000
2970: 30 30 20 20 2f 2a 20 55 73 65 20 76 69 72 74 75  00  /* Use virtu
2980: 61 6c 2d 74 61 62 6c 65 20 70 72 6f 63 65 73 73  al-table process
2990: 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ing */.#define W
29a0: 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20 20  HERE_MULTI_OR   
29b0: 20 20 30 78 31 30 30 30 30 30 30 30 20 20 2f 2a    0x10000000  /*
29c0: 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69 70   OR using multip
29d0: 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 0a 2f  le indices */../
29e0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
29f0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
2a00: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
2a10: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
2a20: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
2a30: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
2a40: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
2a50: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
2a60: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
2a70: 6c 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73 65  lized */.  Parse
2a80: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2a90: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
2aa0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
2ab0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
2ac0: 61 73 6b 53 65 74 20 20 20 2f 2a 20 4d 61 70 70  askSet   /* Mapp
2ad0: 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 63  ing from table c
2ae0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f  ursor numbers to
2af0: 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 29 7b 0a   bitmasks */.){.
2b00: 20 20 70 57 43 2d 3e 70 50 61 72 73 65 20 3d 20    pWC->pParse = 
2b10: 70 50 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e 70  pParse;.  pWC->p
2b20: 4d 61 73 6b 53 65 74 20 3d 20 70 4d 61 73 6b 53  MaskSet = pMaskS
2b30: 65 74 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d  et;.  pWC->nTerm
2b40: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c   = 0;.  pWC->nSl
2b50: 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70  ot = ArraySize(p
2b60: 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20  WC->aStatic);.  
2b70: 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53  pWC->a = pWC->aS
2b80: 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  tatic;.}../* For
2b90: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
2ba0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
2bb0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57  ereClauseClear(W
2bc0: 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f  hereClause*);../
2bd0: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2be0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
2bf0: 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65  iated with a Whe
2c00: 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  reOrInfo object.
2c10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2c20: 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74  whereOrInfoDelet
2c30: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
2c40: 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a  hereOrInfo *p){.
2c50: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 77    if( p ){.    w
2c60: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
2c70: 26 70 2d 3e 77 63 29 3b 0a 20 20 20 20 73 71 6c  &p->wc);.    sql
2c80: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2c90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2ca0: 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d  Deallocate all m
2cb0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
2cc0: 20 77 69 74 68 20 61 20 57 68 65 72 65 41 6e 64   with a WhereAnd
2cd0: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
2ce0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
2cf0: 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73  eAndInfoDelete(s
2d00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
2d10: 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  eAndInfo *p){.  
2d20: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 77 68 65  if( p ){.    whe
2d30: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
2d40: 2d 3e 77 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->wc);.    sqlit
2d50: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
2d60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
2d70: 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65  allocate a Where
2d80: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
2d90: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
2da0: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
2db0: 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72  itself is not fr
2dc0: 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eed.  This routi
2dd0: 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72 73  ne is the invers
2de0: 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65  e of whereClause
2df0: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
2e00: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
2e10: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
2e20: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74  use *pWC){.  int
2e30: 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
2e40: 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *a;.  sqlite3 *d
2e50: 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d  b = pWC->pParse-
2e60: 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  >db;.  for(i=pWC
2e70: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43  ->nTerm-1, a=pWC
2e80: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
2e90: 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d  a++){.    if( a-
2ea0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
2eb0: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
2ec0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
2ed0: 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29  te(db, a->pExpr)
2ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ef0: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
2f00: 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20  M_ORINFO ){.    
2f10: 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c    whereOrInfoDel
2f20: 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72  ete(db, a->u.pOr
2f30: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Info);.    }else
2f40: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20   if( a->wtFlags 
2f50: 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29  & TERM_ANDINFO )
2f60: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e 64  {.      whereAnd
2f70: 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61  InfoDelete(db, a
2f80: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20  ->u.pAndInfo);. 
2f90: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2fa0: 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61  WC->a!=pWC->aSta
2fb0: 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tic ){.    sqlit
2fc0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 43  e3DbFree(db, pWC
2fd0: 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ->a);.  }.}../*.
2fe0: 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
2ff0: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e  new WhereTerm en
3000: 74 72 79 20 74 6f 20 74 68 65 20 57 68 65 72 65  try to the Where
3010: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57  Clause object pW
3020: 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68  C..** The new Wh
3030: 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  ereTerm object i
3040: 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72  s constructed fr
3050: 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77 69  om Expr p and wi
3060: 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54  th wtFlags..** T
3070: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d  he index in pWC-
3080: 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20  >a[] of the new 
3090: 57 68 65 72 65 54 65 72 6d 20 69 73 20 72 65 74  WhereTerm is ret
30a0: 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
30b0: 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e  ..** 0 is return
30c0: 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 57 68  ed if the new Wh
30d0: 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f  ereTerm could no
30e0: 74 20 62 65 20 61 64 64 65 64 20 64 75 65 20 74  t be added due t
30f0: 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c  o a memory.** al
3100: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20  location error. 
3110: 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   The memory allo
3120: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77  cation failure w
3130: 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20  ill be recorded 
3140: 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61  in.** the db->ma
3150: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
3160: 73 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c  so that higher-l
3170: 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63  evel functions c
3180: 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a  an detect it..**
3190: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
31a0: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74   will increase t
31b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
31c0: 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73  WC->a[] array as
31d0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
31e0: 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61 67 73  * If the wtFlags
31f0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64   argument includ
3200: 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c  es TERM_DYNAMIC,
3210: 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69   then responsibi
3220: 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65  lity.** for free
3230: 69 6e 67 20 74 68 65 20 65 78 70 72 65 73 73 69  ing the expressi
3240: 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64 20  on p is assumed 
3250: 62 79 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  by the WhereClau
3260: 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a  se object pWC..*
3270: 2a 20 54 68 69 73 20 69 73 20 74 72 75 65 20 65  * This is true e
3280: 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74  ven if this rout
3290: 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c  ine fails to all
32a0: 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
32b0: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52  eTerm..**.** WAR
32c0: 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74  NING:  This rout
32d0: 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f  ine might reallo
32e0: 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20 75  cate the space u
32f0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
3300: 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c  WhereTerms.  All
3310: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65   pointers to Whe
3320: 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62  reTerms should b
3330: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66  e invalidated af
3340: 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  ter.** calling t
3350: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75  his routine.  Su
3360: 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20  ch pointers may 
3370: 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  be reinitialized
3380: 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a   by referencing.
3390: 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20  ** the pWC->a[] 
33a0: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
33b0: 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65   int whereClause
33c0: 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61 75  Insert(WhereClau
33d0: 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
33e0: 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20  , u8 wtFlags){. 
33f0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
3400: 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  m;.  int idx;.  
3410: 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d  if( pWC->nTerm>=
3420: 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20  pWC->nSlot ){.  
3430: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c    WhereTerm *pOl
3440: 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20  d = pWC->a;.    
3450: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
3460: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  C->pParse->db;. 
3470: 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69     pWC->a = sqli
3480: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
3490: 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  b, sizeof(pWC->a
34a0: 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a  [0])*pWC->nSlot*
34b0: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43  2 );.    if( pWC
34c0: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->a==0 ){.      
34d0: 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54 45  if( wtFlags & TE
34e0: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
34f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
3500: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a  rDelete(db, p);.
3510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
3520: 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20  C->a = pOld;.   
3530: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
3540: 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57   }.    memcpy(pW
3550: 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65  C->a, pOld, size
3560: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57  of(pWC->a[0])*pW
3570: 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69  C->nTerm);.    i
3580: 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53  f( pOld!=pWC->aS
3590: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73  tatic ){.      s
35a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
35b0: 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20   pOld);.    }.  
35c0: 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73    pWC->nSlot = s
35d0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
35e0: 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73  ze(db, pWC->a)/s
35f0: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
3600: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
3610: 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57  &pWC->a[idx = pW
3620: 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70  C->nTerm++];.  p
3630: 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 70 3b  Term->pExpr = p;
3640: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
3650: 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20 70  s = wtFlags;.  p
3660: 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Term->pWC = pWC;
3670: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
3680: 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  t = -1;.  return
3690: 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   idx;.}../*.** T
36a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e  his routine iden
36b0: 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73  tifies subexpres
36c0: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
36d0: 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a  RE clause where.
36e0: 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65  ** each subexpre
36f0: 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
3700: 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70  ed by the AND op
3710: 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f  erator or some o
3720: 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  ther.** operator
3730: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
3740: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20  e op parameter. 
3750: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
3760: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73   structure.** is
3770: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69   filled with poi
3780: 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72  nters to subexpr
3790: 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78  essions.  For ex
37a0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
37b0: 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f  WHERE  a=='hello
37c0: 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62  ' AND coalesce(b
37d0: 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31  ,11)<10 AND (c+1
37e0: 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a  2!=d OR c==22).*
37f0: 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f  *           \___
3800: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
3810: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
3820: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
3830: 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
3840: 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20    slot[0]       
3850: 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20       slot[1]    
3860: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
3870: 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  2].**.** The ori
3880: 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ginal WHERE clau
3890: 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75  se in pExpr is u
38a0: 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74  naltered.  All t
38b0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
38c0: 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74  oes is make slot
38d0: 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74  [] entries point
38e0: 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65   to substructure
38f0: 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a   within pExpr..*
3900: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76  *.** In the prev
3910: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e  ious sentence an
3920: 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  d in the diagram
3930: 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72  , "slot[]" refer
3940: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72  s to.** the Wher
3950: 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61  eClause.a[] arra
3960: 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61  y.  The slot[] a
3970: 72 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65  rray grows as ne
3980: 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  eded to contain.
3990: 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ** all terms of 
39a0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
39b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
39c0: 20 77 68 65 72 65 53 70 6c 69 74 28 57 68 65 72   whereSplit(Wher
39d0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
39e0: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f  pr *pExpr, int o
39f0: 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20  p){.  pWC->op = 
3a00: 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20 70 45  (u8)op;.  if( pE
3a10: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
3a20: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
3a30: 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72  !=op ){.    wher
3a40: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
3a50: 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  C, pExpr, 0);.  
3a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65  }else{.    where
3a70: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
3a80: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20  ->pLeft, op);.  
3a90: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
3aa0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
3ab0: 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   op);.  }.}../*.
3ac0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
3ad0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
3ae0: 20 73 65 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   set.*/.#define 
3af0: 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20  initMaskSet(P)  
3b00: 6d 65 6d 73 65 74 28 50 2c 20 30 2c 20 73 69 7a  memset(P, 0, siz
3b10: 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20  eof(*P))../*.** 
3b20: 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61  Return the bitma
3b30: 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  sk for the given
3b40: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20   cursor number. 
3b50: 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20   Return 0 if.** 
3b60: 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69  iCursor is not i
3b70: 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74  n the set..*/.st
3b80: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74  atic Bitmask get
3b90: 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65  Mask(WhereMaskSe
3ba0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
3bb0: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74   iCursor){.  int
3bc0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
3bd0: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
3be0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
3bf0: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
3c00: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
3c10: 74 75 72 6e 20 28 28 42 69 74 6d 61 73 6b 29 31  turn ((Bitmask)1
3c20: 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )<<i;.    }.  }.
3c30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
3c40: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
3c50: 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f  w mask for curso
3c60: 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  r iCursor..**.**
3c70: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75   There is one cu
3c80: 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69  rsor per table i
3c90: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
3ca0: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
3cb0: 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74  f.** tables in t
3cc0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
3cd0: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74  s limited by a t
3ce0: 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65  est early in the
3cf0: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
3d00: 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e  Begin() routine.
3d10: 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61    So we know tha
3d20: 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e  t the pMaskSet->
3d30: 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69  ix[].** array wi
3d40: 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f  ll never overflo
3d50: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
3d60: 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65  d createMask(Whe
3d70: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
3d80: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
3d90: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  ){.  assert( pMa
3da0: 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79  skSet->n < Array
3db0: 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69  Size(pMaskSet->i
3dc0: 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74  x) );.  pMaskSet
3dd0: 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e  ->ix[pMaskSet->n
3de0: 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d  ++] = iCursor;.}
3df0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3e00: 74 69 6e 65 20 77 61 6c 6b 73 20 28 72 65 63 75  tine walks (recu
3e10: 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72  rsively) an expr
3e20: 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20  ession tree and 
3e30: 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61 20 62  generates.** a b
3e40: 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e  itmask indicatin
3e50: 67 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 61  g which tables a
3e60: 72 65 20 75 73 65 64 20 69 6e 20 74 68 61 74 20  re used in that 
3e70: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72  expression.** tr
3e80: 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64  ee..**.** In ord
3e90: 65 72 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  er for this rout
3ea0: 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65  ine to work, the
3eb0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
3ec0: 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20 70  n must have.** p
3ed0: 72 65 76 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65  reviously invoke
3ee0: 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  d sqlite3Resolve
3ef0: 45 78 70 72 4e 61 6d 65 73 28 29 20 6f 6e 20 74  ExprNames() on t
3f00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
3f10: 53 65 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65  See.** the heade
3f20: 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61  r comment on tha
3f30: 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  t routine for ad
3f40: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
3f50: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  tion..** The sql
3f60: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
3f70: 61 6d 65 73 28 29 20 72 6f 75 74 69 6e 65 73 20  ames() routines 
3f80: 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e  looks for column
3f90: 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65   names and.** se
3fa0: 74 73 20 74 68 65 69 72 20 6f 70 63 6f 64 65 73  ts their opcodes
3fb0: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e   to TK_COLUMN an
3fc0: 64 20 74 68 65 69 72 20 45 78 70 72 2e 69 54 61  d their Expr.iTa
3fd0: 62 6c 65 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a  ble fields to.**
3fe0: 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
3ff0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
4000: 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
4010: 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74 6f 0a  ine just has to.
4020: 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65  ** translate the
4030: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
4040: 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20 76 61 6c  into bitmask val
4050: 75 65 73 20 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a  ues and OR all.*
4060: 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 74  * the bitmasks t
4070: 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74  ogether..*/.stat
4080: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c  ic Bitmask exprL
4090: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 57 68  istTableUsage(Wh
40a0: 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70  ereMaskSet*, Exp
40b0: 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
40c0: 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65  Bitmask exprSele
40d0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  ctTableUsage(Whe
40e0: 72 65 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65  reMaskSet*, Sele
40f0: 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  ct*);.static Bit
4100: 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73  mask exprTableUs
4110: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
4120: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
4130: 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20   *p){.  Bitmask 
4140: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20  mask = 0;.  if( 
4150: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
4160: 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
4170: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d  _COLUMN ){.    m
4180: 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  ask = getMask(pM
4190: 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c  askSet, p->iTabl
41a0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  e);.    return m
41b0: 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20  ask;.  }.  mask 
41c0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
41d0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52  (pMaskSet, p->pR
41e0: 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d  ight);.  mask |=
41f0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
4200: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65  pMaskSet, p->pLe
4210: 66 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65  ft);.  mask |= e
4220: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
4230: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
4240: 4c 69 73 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d  List);.  mask |=
4250: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
4260: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4270: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72  p->pSelect);.  r
4280: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74  eturn mask;.}.st
4290: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
42a0: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
42b0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
42c0: 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74  askSet, ExprList
42d0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
42e0: 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  i;.  Bitmask mas
42f0: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69  k = 0;.  if( pLi
4300: 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
4310: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
4320: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d  r; i++){.      m
4330: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4340: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4350: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
4360: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
4370: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
4380: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
4390: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
43a0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ge(WhereMaskSet 
43b0: 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63  *pMaskSet, Selec
43c0: 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73  t *pS){.  Bitmas
43d0: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68  k mask = 0;.  wh
43e0: 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20 20 6d  ile( pS ){.    m
43f0: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
4400: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4410: 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b  et, pS->pEList);
4420: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
4430: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
4440: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47  pMaskSet, pS->pG
4450: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73  roupBy);.    mas
4460: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
4470: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4480: 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b  , pS->pOrderBy);
4490: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
44a0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
44b0: 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65  kSet, pS->pWhere
44c0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
44d0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
44e0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76  askSet, pS->pHav
44f0: 69 6e 67 29 3b 0a 20 20 20 20 70 53 20 3d 20 70  ing);.    pS = p
4500: 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20  S->pPrior;.  }. 
4510: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
4520: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
4530: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
4540: 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20  operator is one 
4550: 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  of the operators
4560: 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f   that is.** allo
4570: 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  wed for an index
4580: 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  able WHERE claus
4590: 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c  e term.  The all
45a0: 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61  owed operators a
45b0: 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20  re.** "=", "<", 
45c0: 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c  ">", "<=", ">=",
45d0: 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a 73 74   and "IN"..*/.st
45e0: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64  atic int allowed
45f0: 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73  Op(int op){.  as
4600: 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45  sert( TK_GT>TK_E
4610: 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45  Q && TK_GT<TK_GE
4620: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b   );.  assert( TK
4630: 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f  _LT>TK_EQ && TK_
4640: 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73  LT<TK_GE );.  as
4650: 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45  sert( TK_LE>TK_E
4660: 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45  Q && TK_LE<TK_GE
4670: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b   );.  assert( TK
4680: 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a  _GE==TK_EQ+4 );.
4690: 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f    return op==TK_
46a0: 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51  IN || (op>=TK_EQ
46b0: 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c   && op<=TK_GE) |
46c0: 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b  | op==TK_ISNULL;
46d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74  .}../*.** Swap t
46e0: 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79  wo objects of ty
46f0: 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66  pe TYPE..*/.#def
4700: 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c  ine SWAP(TYPE,A,
4710: 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d  B) {TYPE t=A; A=
4720: 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20  B; B=t;}../*.** 
4730: 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72  Commute a compar
4740: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
4750: 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
4760: 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22  he form "X op Y"
4770: 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65  .** are converte
4780: 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e  d into "Y op X".
4790: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 6f 6c 6c  .**.** If a coll
47a0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
47b0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
47c0: 68 20 65 69 74 68 65 72 20 74 68 65 20 6c 65 66  h either the lef
47d0: 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a 20 73 69  t or right.** si
47e0: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
47f0: 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e 73  ison, it remains
4800: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4810: 20 74 68 65 20 73 61 6d 65 20 73 69 64 65 20 61   the same side a
4820: 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d  fter.** the comm
4830: 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20 63  utation. So "Y c
4840: 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70  ollate NOCASE op
4850: 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a 20   X" becomes .** 
4860: 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53  "X collate NOCAS
4870: 45 20 6f 70 20 59 22 2e 20 54 68 69 73 20 69 73  E op Y". This is
4880: 20 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f 6c   because any col
4890: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
48a0: 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20 68  on.** the left h
48b0: 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63 6f  and side of a co
48c0: 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69 64  mparison overrid
48d0: 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e  es any collation
48e0: 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74   sequence .** at
48f0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72 69  tached to the ri
4900: 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61 6d  ght. For the sam
4910: 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50 5f  e reason the EP_
4920: 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a  ExpCollate flag.
4930: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74  ** is not commut
4940: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
4950: 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50  id exprCommute(P
4960: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
4970: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31  pr *pExpr){.  u1
4980: 36 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45  6 expRight = (pE
4990: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
49a0: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
49b0: 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65  te);.  u16 expLe
49c0: 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  ft = (pExpr->pLe
49d0: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  ft->flags & EP_E
49e0: 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73  xpCollate);.  as
49f0: 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28  sert( allowedOp(
4a00: 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45  pExpr->op) && pE
4a10: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29  xpr->op!=TK_IN )
4a20: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ;.  pExpr->pRigh
4a30: 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  t->pColl = sqlit
4a40: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
4a50: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
4a60: 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  ght);.  pExpr->p
4a70: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  Left->pColl = sq
4a80: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
4a90: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
4aa0: 70 4c 65 66 74 29 3b 0a 20 20 53 57 41 50 28 43  pLeft);.  SWAP(C
4ab0: 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e 70  ollSeq*,pExpr->p
4ac0: 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78  Right->pColl,pEx
4ad0: 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  pr->pLeft->pColl
4ae0: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
4af0: 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78  ht->flags = (pEx
4b00: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67  pr->pRight->flag
4b10: 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61  s & ~EP_ExpColla
4b20: 74 65 29 20 7c 20 65 78 70 4c 65 66 74 3b 0a 20  te) | expLeft;. 
4b30: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66   pExpr->pLeft->f
4b40: 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70  lags = (pExpr->p
4b50: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45  Left->flags & ~E
4b60: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20  P_ExpCollate) | 
4b70: 65 78 70 52 69 67 68 74 3b 0a 20 20 53 57 41 50  expRight;.  SWAP
4b80: 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52  (Expr*,pExpr->pR
4b90: 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66  ight,pExpr->pLef
4ba0: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
4bb0: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op>=TK_GT ){.  
4bc0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
4bd0: 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20  =TK_GT+2 );.    
4be0: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
4bf0: 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_LE+2 );.    as
4c00: 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45  sert( TK_GT>TK_E
4c10: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
4c20: 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a   TK_GT<TK_LE );.
4c30: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
4c40: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20  r->op>=TK_GT && 
4c50: 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45  pExpr->op<=TK_GE
4c60: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   );.    pExpr->o
4c70: 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d  p = ((pExpr->op-
4c80: 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b  TK_GT)^2)+TK_GT;
4c90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
4ca0: 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f  anslate from TK_
4cb0: 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57  xx operator to W
4cc0: 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f  O_xx bitmask..*/
4cd0: 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70 65 72  .static u16 oper
4ce0: 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29  atorMask(int op)
4cf0: 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61 73 73  {.  u16 c;.  ass
4d00: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f  ert( allowedOp(o
4d10: 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  p) );.  if( op==
4d20: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d  TK_IN ){.    c =
4d30: 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20   WO_IN;.  }else 
4d40: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  if( op==TK_ISNUL
4d50: 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  L ){.    c = WO_
4d60: 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  ISNULL;.  }else{
4d70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 57 4f  .    assert( (WO
4d80: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
4d90: 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20 20   < 0x7fff );.   
4da0: 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45 51   c = (u16)(WO_EQ
4db0: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20  <<(op-TK_EQ));. 
4dc0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21   }.  assert( op!
4dd0: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d  =TK_ISNULL || c=
4de0: 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =WO_ISNULL );.  
4df0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
4e00: 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b  N || c==WO_IN );
4e10: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
4e20: 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51  K_EQ || c==WO_EQ
4e30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
4e40: 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LT || c==WO
4e50: 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LT );.  assert(
4e60: 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d   op!=TK_LE || c=
4e70: 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65  =WO_LE );.  asse
4e80: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  rt( op!=TK_GT ||
4e90: 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61   c==WO_GT );.  a
4ea0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45  ssert( op!=TK_GE
4eb0: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a   || c==WO_GE );.
4ec0: 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f    return c;.}../
4ed0: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
4ee0: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
4ef0: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
4f00: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
4f10: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
4f20: 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72  * where X is a r
4f30: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
4f40: 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65  iColumn of table
4f50: 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69   iCur and <op> i
4f60: 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20  s one of.** the 
4f70: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
4f80: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
4f90: 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  y the op paramet
4fa0: 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  er..** Return a 
4fb0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
4fc0: 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69  erm.  Return 0 i
4fd0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
4fe0: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
4ff0: 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68   *findTerm(.  Wh
5000: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
5010: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
5020: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
5030: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
5040: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
5050: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
5060: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
5070: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
5080: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
5090: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
50a0: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
50b0: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
50c0: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
50d0: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
50e0: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
50f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
5100: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
5110: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
5120: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
5130: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
5140: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
5150: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
5160: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
5170: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
5180: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
5190: 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65 72 74 28  int k;.  assert(
51a0: 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20 20 6f 70   iCur>=0 );.  op
51b0: 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20 20 66 6f   &= WO_ALL;.  fo
51c0: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
51d0: 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b  k=pWC->nTerm; k;
51e0: 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k--, pTerm++){.
51f0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
5200: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a  eftCursor==iCur.
5210: 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d         && (pTerm
5220: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
5230: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20  notReady)==0.   
5240: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
5250: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
5260: 75 6d 6e 0a 20 20 20 20 20 20 20 26 26 20 28 70  umn.       && (p
5270: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
5280: 26 20 6f 70 29 21 3d 30 0a 20 20 20 20 29 7b 0a  & op)!=0.    ){.
5290: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20 26        if( pIdx &
52a0: 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  & pTerm->eOperat
52b0: 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  or!=WO_ISNULL ){
52c0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
52d0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
52e0: 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  ;.        CollSe
52f0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
5300: 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 0a 20    char idxaff;. 
5310: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
5320: 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61        Parse *pPa
5330: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
5340: 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 64 78 61  e;..        idxa
5350: 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ff = pIdx->pTabl
5360: 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
5370: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
5380: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
5390: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
53a0: 58 2c 20 69 64 78 61 66 66 29 20 29 20 63 6f 6e  X, idxaff) ) con
53b0: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20 20  tinue;..        
53c0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
53d0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
53e0: 65 6e 63 65 20 72 65 71 75 69 72 65 64 20 66 72  ence required fr
53f0: 6f 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 0a  om an index for.
5400: 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 74 6f          ** it to
5410: 20 62 65 20 75 73 65 66 75 6c 20 66 6f 72 20 6f   be useful for o
5420: 70 74 69 6d 69 73 69 6e 67 20 65 78 70 72 65 73  ptimising expres
5430: 73 69 6f 6e 20 70 58 2e 20 53 74 6f 72 65 20 74  sion pX. Store t
5440: 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  his.        ** v
5450: 61 6c 75 65 20 69 6e 20 76 61 72 69 61 62 6c 65  alue in variable
5460: 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20 20 20 20   pColl..        
5470: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
5480: 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t(pX->pLeft);.  
5490: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
54a0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
54b0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
54c0: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d  , pX->pLeft, pX-
54d0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
54e0: 20 20 61 73 73 65 72 74 28 70 43 6f 6c 6c 20 7c    assert(pColl |
54f0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 29 3b  | pParse->nErr);
5500: 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ..        for(j=
5510: 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  0; pIdx->aiColum
5520: 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a  n[j]!=iColumn; j
5530: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
5540: 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78  f( NEVER(j>=pIdx
5550: 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74  ->nColumn) ) ret
5560: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
5570: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
5580: 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  ll && sqlite3Str
5590: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
55a0: 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  e, pIdx->azColl[
55b0: 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  j]) ) continue;.
55c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
55d0: 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20  turn pTerm;.    
55e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
55f0: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
5600: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
5610: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
5620: 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57  lyze(SrcList*, W
5630: 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74  hereClause*, int
5640: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65  );../*.** Call e
5650: 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c  xprAnalyze on al
5660: 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45  l terms in a WHE
5670: 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a  RE clause.  .**.
5680: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
5690: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c  d exprAnalyzeAll
56a0: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
56b0: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  bList,       /* 
56c0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
56d0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
56e0: 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a   *pWC         /*
56f0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5700: 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  e to be analyzed
5710: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
5720: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
5730: 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rm-1; i>=0; i--)
5740: 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  {.    exprAnalyz
5750: 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c  e(pTabList, pWC,
5760: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e   i);.  }.}..#ifn
5770: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5780: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
5790: 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  N./*.** Check to
57a0: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
57b0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
57c0: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  a LIKE or GLOB o
57d0: 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20  perator that.** 
57e0: 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  can be optimized
57f0: 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74   using inequalit
5800: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
5810: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
5820: 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66  t is.** so and f
5830: 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  alse if not..**.
5840: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  ** In order for 
5850: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  the operator to 
5860: 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20  be optimizible, 
5870: 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20  the RHS must be 
5880: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65  a string.** lite
5890: 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ral that does no
58a0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77  t begin with a w
58b0: 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74  ildcard.  .*/.st
58c0: 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f  atic int isLikeO
58d0: 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65 20 2a  rGlob(.  Parse *
58e0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
58f0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
5900: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5910: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
5920: 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74  pr,      /* Test
5930: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
5940: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61 74   */.  int *pnPat
5950: 74 65 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d 62 65  tern,   /* Numbe
5960: 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72  r of non-wildcar
5970: 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74  d prefix charact
5980: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ers */.  int *pi
5990: 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72  sComplete, /* Tr
59a0: 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77  ue if the only w
59b0: 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20  ildcard is % in 
59c0: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
59d0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f  er */.  int *pno
59e0: 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75  Case      /* Tru
59f0: 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69  e if uppercase i
5a00: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
5a10: 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a  lowercase */.){.
5a20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
5a30: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
5a40: 20 2a 70 4c 65 66 74 3b 0a 20 20 45 78 70 72 4c   *pLeft;.  ExprL
5a50: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  ist *pList;.  in
5a60: 74 20 63 2c 20 63 6e 74 3b 0a 20 20 63 68 61 72  t c, cnt;.  char
5a70: 20 77 63 5b 33 5d 3b 0a 20 20 43 6f 6c 6c 53 65   wc[3];.  CollSe
5a80: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69  q *pColl;.  sqli
5a90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5aa0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 21 73 71  ->db;..  if( !sq
5ab0: 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74  lite3IsLikeFunct
5ac0: 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70  ion(db, pExpr, p
5ad0: 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20  noCase, wc) ){. 
5ae0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5af0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5b00: 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f  BCDIC.  if( *pno
5b10: 43 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b  Case ) return 0;
5b20: 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20  .#endif.  pList 
5b30: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
5b40: 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74    pRight = pList
5b50: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
5b60: 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d  if( pRight->op!=
5b70: 54 4b 5f 53 54 52 49 4e 47 0a 20 20 20 26 26 20  TK_STRING.   && 
5b80: 28 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f  (pRight->op!=TK_
5b90: 52 45 47 49 53 54 45 52 20 7c 7c 20 70 52 69 67  REGISTER || pRig
5ba0: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 54 4b 5f  ht->iColumn!=TK_
5bb0: 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 72  STRING) ){.    r
5bc0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
5bd0: 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Left = pList->a[
5be0: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  1].pExpr;.  if( 
5bf0: 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pLeft->op!=TK_CO
5c00: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
5c10: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  rn 0;.  }.  pCol
5c20: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
5c30: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
5c40: 4c 65 66 74 29 3b 0a 20 20 61 73 73 65 72 74 28  Left);.  assert(
5c50: 20 70 43 6f 6c 6c 21 3d 30 20 7c 7c 20 70 4c 65   pColl!=0 || pLe
5c60: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20  ft->iColumn==-1 
5c70: 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d  );.  if( pColl==
5c80: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63  0 ){.    /* No c
5c90: 6f 6c 6c 61 74 69 6f 6e 20 69 73 20 64 65 66 69  ollation is defi
5ca0: 6e 65 64 20 66 6f 72 20 74 68 65 20 52 4f 57 49  ned for the ROWI
5cb0: 44 2e 20 20 55 73 65 20 74 68 65 20 64 65 66 61  D.  Use the defa
5cc0: 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  ult. */.    pCol
5cd0: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
5ce0: 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 43  l;.  }.  if( (pC
5cf0: 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54  oll->type!=SQLIT
5d00: 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20 7c 7c  E_COLL_BINARY ||
5d10: 20 2a 70 6e 6f 43 61 73 65 29 20 26 26 0a 20 20   *pnoCase) &&.  
5d20: 20 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65      (pColl->type
5d30: 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f  !=SQLITE_COLL_NO
5d40: 43 41 53 45 20 7c 7c 20 21 2a 70 6e 6f 43 61 73  CASE || !*pnoCas
5d50: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
5d60: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
5d70: 33 44 65 71 75 6f 74 65 45 78 70 72 28 64 62 2c  3DequoteExpr(db,
5d80: 20 70 52 69 67 68 74 29 3b 0a 20 20 7a 20 3d 20   pRight);.  z = 
5d90: 28 63 68 61 72 20 2a 29 70 52 69 67 68 74 2d 3e  (char *)pRight->
5da0: 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 63 6e 74 20 3d  token.z;.  cnt =
5db0: 20 30 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20   0;.  if( z ){. 
5dc0: 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63     while( (c=z[c
5dd0: 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63  nt])!=0 && c!=wc
5de0: 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20  [0] && c!=wc[1] 
5df0: 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 20 63  && c!=wc[2] ){ c
5e00: 6e 74 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66  nt++; }.  }.  if
5e10: 28 20 63 6e 74 3d 3d 30 20 7c 7c 20 32 35 35 3d  ( cnt==0 || 255=
5e20: 3d 28 75 38 29 7a 5b 63 6e 74 5d 20 29 7b 0a 20  =(u8)z[cnt] ){. 
5e30: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5e40: 0a 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20  .  *pisComplete 
5e50: 3d 20 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30 5d 20  = z[cnt]==wc[0] 
5e60: 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a  && z[cnt+1]==0;.
5e70: 20 20 2a 70 6e 50 61 74 74 65 72 6e 20 3d 20 63    *pnPattern = c
5e80: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  nt;.  return 1;.
5e90: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
5ea0: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
5eb0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23  IMIZATION */...#
5ec0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5ed0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
5ee0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
5ef0: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ee if the given 
5f00: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
5f10: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
5f20: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d          column M
5f30: 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20  ATCH expr.**.** 
5f40: 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65  If it is then re
5f50: 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e  turn TRUE.  If n
5f60: 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ot, return FALSE
5f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5f80: 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
5f90: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
5fa0: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
5fb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
5fc0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  {.  ExprList *pL
5fd0: 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  ist;..  if( pExp
5fe0: 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49  r->op!=TK_FUNCTI
5ff0: 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ON ){.    return
6000: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   0;.  }.  if( pE
6010: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 35 20  xpr->token.n!=5 
6020: 7c 7c 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ||.       sqlite
6030: 33 53 74 72 4e 49 43 6d 70 28 28 63 6f 6e 73 74  3StrNICmp((const
6040: 20 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f   char*)pExpr->to
6050: 6b 65 6e 2e 7a 2c 22 6d 61 74 63 68 22 2c 35 29  ken.z,"match",5)
6060: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6070: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
6080: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
6090: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  .  if( pList->nE
60a0: 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65  xpr!=2 ){.    re
60b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
60c0: 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ( pList->a[1].pE
60d0: 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f  xpr->op != TK_CO
60e0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
60f0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
6100: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
6110: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
6120: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
6130: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73  *.** If the pBas
6140: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
6150: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
6160: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
6170: 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20  e of.** a join, 
6180: 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
6190: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61  e appropriate ma
61a0: 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64  rkings over to d
61b0: 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  erived..*/.stati
61c0: 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a  c void transferJ
61d0: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72  oinMarkings(Expr
61e0: 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72   *pDerived, Expr
61f0: 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72   *pBase){.  pDer
6200: 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70  ived->flags |= p
6210: 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50  Base->flags & EP
6220: 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65  _FromJoin;.  pDe
6230: 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69  rived->iRightJoi
6240: 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e  nTable = pBase->
6250: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b  iRightJoinTable;
6260: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
6270: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
6280: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
6290: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
62a0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
62b0: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20  /*.** Analyze a 
62c0: 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73  term that consis
62d0: 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ts of two or mor
62e0: 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a  e OR-connected.*
62f0: 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20  * subterms.  So 
6300: 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  in:.**.**     ..
6310: 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41  . WHERE  (a=5) A
6320: 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f  ND (b=7 OR c=9 O
6330: 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31  R d=13) AND (d=1
6340: 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  3).**           
6350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e                 ^
6360: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6370: 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ^^^.**.** This r
6380: 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20  outine analyzes 
6390: 74 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68  terms such as th
63a0: 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e  e middle term in
63b0: 20 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70   the above examp
63c0: 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72  le..** A WhereOr
63d0: 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63  Term object is c
63e0: 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61  omputed and atta
63f0: 63 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d  ched to the term
6400: 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73   under.** analys
6410: 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  is, regardless o
6420: 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66  f the outcome of
6430: 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20   the analysis.  
6440: 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  Hence:.**.**    
6450: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
6460: 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52  gs   |=  TERM_OR
6470: 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72  INFO.**     Wher
6480: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20  eTerm.u.pOrInfo 
6490: 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   =  a dynamicall
64a0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
64b0: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a  eOrTerm object.*
64c0: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65  *.** The term be
64d0: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73  ing analyzed mus
64e0: 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f  t have two or mo
64f0: 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74  re of OR-connect
6500: 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20  ed subterms..** 
6510: 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d  A single subterm
6520: 20 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20   might be a set 
6530: 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64  of AND-connected
6540: 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a   sub-subterms..*
6550: 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65  * Examples of te
6560: 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73  rms under analys
6570: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41  is:.**.**     (A
6580: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
6590: 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20  OR t1.x=t2.z OR 
65a0: 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d  t1.y=15 OR t1.z=
65b0: 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42  t3.a+5.**     (B
65c0: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
65d0: 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78   expr2=x OR x=ex
65e0: 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20  pr3.**     (C)  
65f0: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
6600: 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74  (t1.x=t2.z AND t
6610: 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28  1.y=15).**     (
6620: 44 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f  D)     x=expr1 O
6630: 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32  R (y>11 AND y<22
6640: 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65   AND z LIKE '*he
6650: 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45  llo*').**     (E
6660: 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44  )     (p.a=1 AND
6670: 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33   q.b=2 AND r.c=3
6680: 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20  ) OR (p.x=4 AND 
6690: 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29  q.y=5 AND r.z=6)
66a0: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a  .**.** CASE 1:.*
66b0: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
66c0: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
66d0: 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f  form T.C=expr fo
66e0: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f  r some single co
66f0: 6c 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73  lumn of C.** a s
6700: 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61  ingle table T (a
6710: 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70  s shown in examp
6720: 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e  le B above) then
6730: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69   create a new vi
6740: 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68  rtual.** term th
6750: 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c  at is an equival
6760: 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f  ent IN expressio
6770: 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  n.  In other wor
6780: 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a  ds, if the term.
6790: 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  ** being analyze
67a0: 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d is:.**.**     
67b0: 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20   x = expr1  OR  
67c0: 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78  expr2 = x  OR  x
67d0: 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74   = expr3.**.** t
67e0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
67f0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69   virtual term li
6800: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
6810: 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c      x IN (expr1,
6820: 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a  expr2,expr3).**.
6830: 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a  ** CASE 2:.**.**
6840: 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73   If all subterms
6850: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62   are indexable b
6860: 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
6870: 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a   T, then set.**.
6880: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
6890: 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20  .eOperator      
68a0: 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52          =  WO_OR
68b0: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
68c0: 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  m.u.pOrInfo->ind
68d0: 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20  exable  |=  the 
68e0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
68f0: 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20  r table T.**.** 
6900: 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e  A subterm is "in
6910: 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69  dexable" if it i
6920: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
6930: 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72   "T.C <op> <expr
6940: 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e  >" where C is an
6950: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  y column of tabl
6960: 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e  e T and .** <op>
6970: 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20   is one of "=", 
6980: 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20  "<", "<=", ">", 
6990: 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c  ">=", "IS NULL",
69a0: 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73   or "IN"..** A s
69b0: 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69  ubterm is also i
69c0: 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69  ndexable if it i
69d0: 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20  s an AND of two 
69e0: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75  or more.** subsu
69f0: 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20  bterms at least 
6a00: 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20  one of which is 
6a10: 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65  indexable.  Inde
6a20: 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75  xable AND .** su
6a30: 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69  bterms have thei
6a40: 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20  r eOperator set 
6a50: 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68  to WO_AND and th
6a60: 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e  ey have.** u.pAn
6a70: 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64  dInfo set to a d
6a80: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
6a90: 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72  ated WhereAndTer
6aa0: 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  m object..**.** 
6ab0: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69  From another poi
6ac0: 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64  nt of view, "ind
6ad0: 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68  exable" means th
6ae0: 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63  at the subterm c
6af0: 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61  ould.** potentia
6b00: 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  lly be used with
6b10: 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20   an index if an 
6b20: 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65  appropriate inde
6b30: 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69  x exists..** Thi
6b40: 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20  s analysis does 
6b50: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65  not consider whe
6b60: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
6b70: 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68  index exists; th
6b80: 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69  at.** is somethi
6b90: 6e 67 20 74 68 65 20 62 65 73 74 49 6e 64 65 78  ng the bestIndex
6ba0: 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
6bb0: 64 65 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73  determine.  This
6bc0: 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c   analysis.** onl
6bd0: 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68  y looks at wheth
6be0: 65 72 20 73 75 62 74 65 72 6d 73 20 61 70 70 72  er subterms appr
6bf0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65  opriate for inde
6c00: 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a  xing exist..**.*
6c10: 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41  * All examples A
6c20: 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65   through E above
6c30: 20 61 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73   all satisfy cas
6c40: 65 20 32 2e 20 20 42 75 74 20 69 66 20 61 20 74  e 2.  But if a t
6c50: 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74  erm.** also stat
6c60: 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73  isfies case 1 (s
6c70: 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f  uch as B) we kno
6c80: 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  w that the optim
6c90: 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77  izer will.** alw
6ca0: 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20  ays prefer case 
6cb0: 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  1, so in that ca
6cc0: 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68  se we pretend th
6cd0: 61 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74  at case 2 is not
6ce0: 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a  .** satisfied..*
6cf0: 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65  *.** It might be
6d00: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d   the case that m
6d10: 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61  ultiple tables a
6d20: 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46  re indexable.  F
6d30: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28  or example,.** (
6d40: 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65  E) above is inde
6d50: 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20  xable on tables 
6d60: 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a  P, Q, and R..**.
6d70: 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61  ** Terms that sa
6d80: 74 69 73 66 79 20 63 61 73 65 20 32 20 61 72 65  tisfy case 2 are
6d90: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
6da0: 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a  lookup by using.
6db0: 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  ** separate indi
6dc0: 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69  ces to find rowi
6dd0: 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74  ds for each subt
6de0: 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e  erm and composin
6df0: 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f  g.** the union o
6e00: 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69  f all rowids usi
6e10: 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65  ng a RowSet obje
6e20: 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ct.  This is sim
6e30: 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d  ilar.** to "bitm
6e40: 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f  ap indices" in o
6e50: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e  ther database en
6e60: 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48  gines..**.** OTH
6e70: 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66  ERWISE:.**.** If
6e80: 20 6e 65 69 74 68 65 72 20 63 61 73 65 20 31 20   neither case 1 
6e90: 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c 79  nor case 2 apply
6ea0: 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65  , then leave the
6eb0: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
6ec0: 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73  o.** zero.  This
6ed0: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65   term is not use
6ee0: 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a  ful for search..
6ef0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
6f00: 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d  xprAnalyzeOrTerm
6f10: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
6f20: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
6f30: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
6f40: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
6f50: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
6f60: 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* the complete 
6f70: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
6f80: 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20    int idxTerm   
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6fa0: 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74  ndex of the OR-t
6fb0: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
6fc0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65  ed */.){.  Parse
6fd0: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
6fe0: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
6ff0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
7000: 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
7010: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7020: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
7030: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
7040: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68  nnection */.  Wh
7050: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  ereTerm *pTerm =
7060: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
7070: 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72  ];    /* The ter
7080: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
7090: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
70a0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
70b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
70c0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
70d0: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
70e0: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
70f0: 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70  MaskSet = pWC->p
7100: 4d 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c  MaskSet; /* Tabl
7110: 65 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20  e use masks */. 
7120: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
7150: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
7160: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
7170: 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61  c;       /* Brea
7180: 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74  kup of pTerm int
7190: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
71a0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
71b0: 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53  rm;       /* A S
71c0: 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74  ub-term within t
71d0: 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68  he pOrWc */.  Wh
71e0: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
71f0: 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74  fo;     /* Addit
7200: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
7210: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
7220: 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74  h pTerm */.  Bit
7230: 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20  mask chngToIN;  
7240: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
7250: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
7260: 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20  sfy case 1 */.  
7270: 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c  Bitmask indexabl
7280: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  e;        /* Tab
7290: 6c 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64  les that are ind
72a0: 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69  exable, satisfyi
72b0: 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20  ng case 2 */..  
72c0: 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68  /*.  ** Break th
72d0: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f  e OR clause into
72e0: 20 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75   its separate su
72f0: 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62  bterms.  The sub
7300: 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73  terms are.  ** s
7310: 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65  tored in a Where
7320: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
7330: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68   containing with
7340: 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e  in the WhereOrIn
7350: 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74  fo.  ** object t
7360: 68 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20  hat is attached 
7370: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
7380: 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  OR clause term..
7390: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
73a0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
73b0: 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54   (TERM_DYNAMIC|T
73c0: 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f  ERM_ORINFO|TERM_
73d0: 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a  ANDINFO))==0 );.
73e0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
73f0: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20  >op==TK_OR );.  
7400: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
7410: 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c   = pOrInfo = sql
7420: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
7430: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72  (db, sizeof(*pOr
7440: 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f  Info));.  if( pO
7450: 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  rInfo==0 ) retur
7460: 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  n;.  pTerm->wtFl
7470: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e  ags |= TERM_ORIN
7480: 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70  FO;.  pOrWc = &p
7490: 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68  OrInfo->wc;.  wh
74a0: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f  ereClauseInit(pO
74b0: 72 57 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65  rWc, pWC->pParse
74c0: 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77  , pMaskSet);.  w
74d0: 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c  hereSplit(pOrWc,
74e0: 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a   pExpr, TK_OR);.
74f0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
7500: 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20  (pSrc, pOrWc);. 
7510: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
7520: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
7530: 20 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d    assert( pOrWc-
7540: 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20  >nTerm>=2 );..  
7550: 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20  /*.  ** Compute 
7560: 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65  the set of table
7570: 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74  s that might sat
7580: 69 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20  isfy cases 1 or 
7590: 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61  2..  */.  indexa
75a0: 62 6c 65 20 3d 20 63 68 6e 67 54 6f 49 4e 20 3d  ble = chngToIN =
75b0: 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
75c0: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
75d0: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f  rm-1, pOrTerm=pO
75e0: 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20  rWc->a; i>=0 && 
75f0: 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20  indexable; i--, 
7600: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
7610: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
7620: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
7630: 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  GLE)==0 ){.     
7640: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
7650: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  AndInfo;.      a
7660: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
7670: 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b 0a  eOperator==0 );.
7680: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
7690: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
76a0: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
76b0: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
76c0: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
76d0: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
76e0: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
76f0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
7700: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
7710: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
7720: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
7730: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
7740: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
7750: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
7760: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
7770: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
7780: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
7790: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
77a0: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
77b0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
77c0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
77d0: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
77e0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
77f0: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
7800: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
7810: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
7820: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
7830: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
7840: 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d   pWC->pParse, pM
7850: 61 73 6b 53 65 74 29 3b 0a 20 20 20 20 20 20 20  askSet);.       
7860: 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64   whereSplit(pAnd
7870: 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  WC, pOrTerm->pEx
7880: 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  pr, TK_AND);.   
7890: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
78a0: 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43  All(pSrc, pAndWC
78b0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  );.        for(j
78c0: 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e  =0, pAndTerm=pAn
78d0: 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43  dWC->a; j<pAndWC
78e0: 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41  ->nTerm; j++, pA
78f0: 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  ndTerm++){.     
7900: 20 20 20 20 20 69 66 28 20 70 41 6e 64 54 65 72       if( pAndTer
7910: 6d 2d 3e 70 45 78 70 72 20 26 26 20 61 6c 6c 6f  m->pExpr && allo
7920: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
7930: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
7940: 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67            b |= g
7950: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
7960: 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43   pAndTerm->leftC
7970: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
7980: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
7990: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
79a0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
79b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
79c0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
79d0: 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20  ERM_COPIED ){.  
79e0: 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73      /* Skip this
79f0: 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20   term for now.  
7a00: 57 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68  We revisit it wh
7a10: 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68  en we process th
7a20: 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65  e.      ** corre
7a30: 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49  sponding TERM_VI
7a40: 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20  RTUAL term */.  
7a50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
7a60: 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20  itmask b;.      
7a70: 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  b = getMask(pMas
7a80: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
7a90: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
7aa0: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77    if( pOrTerm->w
7ab0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
7ac0: 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  RTUAL ){.       
7ad0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
7ae0: 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70  er = &pOrWc->a[p
7af0: 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  OrTerm->iParent]
7b00: 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67  ;.        b |= g
7b10: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
7b20: 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72   pOther->leftCur
7b30: 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
7b40: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
7b50: 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   b;.      if( pO
7b60: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
7b70: 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20  !=WO_EQ ){.     
7b80: 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b     chngToIN = 0;
7b90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7ba0: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26        chngToIN &
7bb0: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
7bc0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
7bd0: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74  * Record the set
7be0: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
7bf0: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
7c00: 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62   The set might b
7c10: 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20  e.  ** empty..  
7c20: 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e  */.  pOrInfo->in
7c30: 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61  dexable = indexa
7c40: 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f  ble;.  pTerm->eO
7c50: 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61  perator = indexa
7c60: 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f  ble==0 ? 0 : WO_
7c70: 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63  OR;..  /*.  ** c
7c80: 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20  hngToIN holds a 
7c90: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
7ca0: 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73  at *might* satis
7cb0: 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a  fy case 1.  But.
7cc0: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20    ** we have to 
7cd0: 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  do some addition
7ce0: 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73  al checking to s
7cf0: 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61  ee if case 1 rea
7d00: 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69  lly.  ** is sati
7d10: 73 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  sfied..  */.  if
7d20: 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ( chngToIN ){.  
7d30: 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f    int okToChngTo
7d40: 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  IN = 0;     /* T
7d50: 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65  rue if the conve
7d60: 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76  rsion to IN is v
7d70: 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alid */.    int 
7d80: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20  iColumn = -1;   
7d90: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
7da0: 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20  index on lhs of 
7db0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
7dc0: 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72 3b 20     int iCursor; 
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7de0: 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d  Table cursor com
7df0: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73  mon to all terms
7e00: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20   */.    int j = 
7e10: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
7e20: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
7e30: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61  r */..    /* Sea
7e40: 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20  rch for a table 
7e50: 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  and column that 
7e60: 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73  appears on one s
7e70: 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ide or the.    *
7e80: 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d  * other of the =
7e90: 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76  = operator in ev
7ea0: 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68  ery subterm.  Th
7eb0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  at table and col
7ec0: 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  umn.    ** will 
7ed0: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69  be recorded in i
7ee0: 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75  Cursor and iColu
7ef0: 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74  mn.  There might
7f00: 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20   not be any.    
7f10: 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e  ** such table an
7f20: 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f  d column.  Set o
7f30: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61  kToChngToIN if a
7f40: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61  n appropriate ta
7f50: 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63  ble.    ** and c
7f60: 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62  olumn is found b
7f70: 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e  ut leave okToChn
7f80: 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e  gToIN false if n
7f90: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f  ot found..    */
7fa0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
7fb0: 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f  2 && !okToChngTo
7fc0: 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  IN; j++){.      
7fd0: 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d  pOrTerm = pOrWc-
7fe0: 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  >a;.      for(i=
7ff0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20  pOrWc->nTerm-1; 
8000: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
8010: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
8020: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
8030: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51  eOperator==WO_EQ
8040: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   );.        pOrT
8050: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20  erm->wtFlags &= 
8060: 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20  ~TERM_OR_OK;.   
8070: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
8080: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
8090: 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
80a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63  ;.        if( (c
80b0: 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73  hngToIN & getMas
80c0: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  k(pMaskSet, pOrT
80d0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
80e0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
80f0: 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  .        iColumn
8100: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65   = pOrTerm->u.le
8110: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
8120: 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54    iCursor = pOrT
8130: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b  erm->leftCursor;
8140: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
8150: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8160: 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( i<0 ){.       
8170: 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b   assert( j==1 );
8180: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8190: 20 28 63 68 6e 67 54 6f 49 4e 26 28 63 68 6e 67   (chngToIN&(chng
81a0: 54 6f 49 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20  ToIN-1))==0 );. 
81b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
81c0: 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b  hngToIN==getMask
81d0: 28 70 4d 61 73 6b 53 65 74 2c 20 69 43 6f 6c 75  (pMaskSet, iColu
81e0: 6d 6e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62  mn) );.        b
81f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8200: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
8210: 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 1;.      for(
8220: 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43 68  ; i>=0 && okToCh
8230: 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72  ngToIN; i--, pOr
8240: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
8250: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
8260: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
8270: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  EQ );.        if
8280: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
8290: 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20 29  ursor!=iCursor )
82a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 54  {.          pOrT
82b0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20  erm->wtFlags &= 
82c0: 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20  ~TERM_OR_OK;.   
82d0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
82e0: 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  OrTerm->u.leftCo
82f0: 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn!=iColumn ){
8300: 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43  .          okToC
8310: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
8320: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8330: 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c 65 66        int affLef
8340: 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20 20  t, affRight;.   
8350: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
8360: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
8370: 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d   is also a colum
8380: 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  n, then the affi
8390: 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20 20 20  nities.         
83a0: 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69 67 68   ** of both righ
83b0: 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65 73  t and left sides
83c0: 20 6d 75 73 74 20 62 65 20 73 75 63 68 20 74 68   must be such th
83d0: 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20 20 20  at no type.     
83e0: 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69       ** conversi
83f0: 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64  ons are required
8400: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 20   on the right.  
8410: 28 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a 20  (Ticket #2249). 
8420: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
8430: 20 20 20 20 20 20 61 66 66 52 69 67 68 74 20 3d        affRight =
8440: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
8450: 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45  nity(pOrTerm->pE
8460: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
8470: 20 20 20 20 20 20 20 20 61 66 66 4c 65 66 74 20          affLeft 
8480: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
8490: 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70  inity(pOrTerm->p
84a0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
84b0: 20 20 20 20 20 20 20 20 69 66 28 20 61 66 66 52          if( affR
84c0: 69 67 68 74 21 3d 30 20 26 26 20 61 66 66 52 69  ight!=0 && affRi
84d0: 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a  ght!=affLeft ){.
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f              okTo
84f0: 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  ChngToIN = 0;.  
8500: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8510: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65             pOrTe
8520: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
8530: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
8540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
8550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8560: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
8570: 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f  oint, okToChngTo
8580: 49 4e 20 69 73 20 74 72 75 65 20 69 66 20 6f 72  IN is true if or
8590: 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73 61 74  iginal pTerm sat
85a0: 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20 63 61  isfies.    ** ca
85b0: 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74 20 63  se 1.  In that c
85c0: 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74 20 61  ase, construct a
85d0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
85e0: 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20 20 2a  m that is .    *
85f0: 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72 74 65  * pTerm converte
8600: 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65  d into an IN ope
8610: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
8620: 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f    if( okToChngTo
8630: 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  IN ){.      Expr
8640: 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20   *pDup;         
8650: 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e     /* A transien
8660: 74 20 64 75 70 6c 69 63 61 74 65 20 65 78 70 72  t duplicate expr
8670: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
8680: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
8690: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 52 48  = 0;   /* The RH
86a0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
86b0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
86c0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20  pr *pLeft = 0;  
86d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20       /* The LHS 
86e0: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
86f0: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  or */.      Expr
8700: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
8710: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65     /* The comple
8720: 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  te IN operator *
8730: 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  /..      for(i=p
8740: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70  OrWc->nTerm-1, p
8750: 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b  OrTerm=pOrWc->a;
8760: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54   i>=0; i--, pOrT
8770: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
8780: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74  if( (pOrTerm->wt
8790: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f  Flags & TERM_OR_
87a0: 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  OK)==0 ) continu
87b0: 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
87c0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
87d0: 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a  rator==WO_EQ );.
87e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
87f0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
8800: 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a  sor==iCursor );.
8810: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8820: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
8830: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
8840: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
8850: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8860: 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  db, pOrTerm->pEx
8870: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
8880: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
8890: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
88a0: 6e 64 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  nd(pWC->pParse, 
88b0: 70 4c 69 73 74 2c 20 70 44 75 70 2c 20 30 29 3b  pList, pDup, 0);
88c0: 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d  .        pLeft =
88d0: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
88e0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a  >pLeft;.      }.
88f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
8900: 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
8910: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
8920: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 29  prDup(db, pLeft)
8930: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
8940: 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
8950: 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30  K_IN, pDup, 0, 0
8960: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
8970: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  w ){.        int
8980: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
8990: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
89a0: 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70  kings(pNew, pExp
89b0: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  r);.        pNew
89c0: 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  ->pList = pList;
89d0: 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20  .        idxNew 
89e0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
89f0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54  ert(pWC, pNew, T
8a00: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
8a10: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
8a20: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
8a30: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
8a40: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
8a50: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
8a60: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
8a70: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
8a80: 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d  m];.        pWC-
8a90: 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65  >a[idxNew].iPare
8aa0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
8ab0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
8ac0: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ild = 1;.      }
8ad0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
8ae0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8af0: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
8b00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
8b10: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
8b20: 20 30 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74   0;  /* case 1 t
8b30: 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a  rumps case 2 */.
8b40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
8b50: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
8b60: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
8b70: 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d  ON && !SQLITE_OM
8b80: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
8b90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
8ba0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
8bb0: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
8bc0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
8bd0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
8be0: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
8bf0: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
8c00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8c10: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
8c20: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
8c30: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
8c40: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
8c50: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
8c60: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
8c70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
8c80: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
8c90: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
8ca0: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
8cb0: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
8cc0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
8cd0: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
8ce0: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
8cf0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
8d00: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
8d10: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
8d20: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
8d30: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
8d40: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
8d50: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
8d60: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
8d70: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
8d80: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
8d90: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
8da0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
8db0: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
8dc0: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
8dd0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
8de0: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
8df0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
8e00: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
8e10: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
8e20: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
8e30: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
8e40: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
8e50: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
8e60: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
8e70: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
8e80: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
8e90: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
8ea0: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
8eb0: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
8ec0: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
8ed0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
8ee0: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
8ef0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
8f00: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
8f10: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
8f20: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
8f30: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
8f40: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
8f50: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
8f60: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
8f70: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
8f80: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
8f90: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
8fa0: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
8fb0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
8fc0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
8fd0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
8fe0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62  /* The term to b
9010: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
9020: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
9030: 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20  askSet;         
9040: 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65   /* Set of table
9050: 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a   index masks */.
9060: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9080: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
9090: 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79  sion to be analy
90a0: 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  zed */.  Bitmask
90b0: 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20   prereqLeft;    
90c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
90d0: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 74 68  requesites of th
90e0: 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a  e pExpr->pLeft *
90f0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
9100: 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  eqAll;          
9110: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
9120: 73 69 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a  sites of pExpr *
9130: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72  /.  Bitmask extr
9140: 61 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 69 6e  aRight = 0;.  in
9150: 74 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 69 6e  t nPattern;.  in
9160: 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20  t isComplete;.  
9170: 69 6e 74 20 6e 6f 43 61 73 65 3b 0a 20 20 69 6e  int noCase;.  in
9180: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
91a0: 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72  * Top-level oper
91b0: 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70  ator.  pExpr->op
91c0: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
91d0: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
91e0: 65 3b 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e;     /* Parsin
91f0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
9200: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9210: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
9220: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
9230: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ection */..  if(
9240: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9250: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
9260: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
9270: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
9280: 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70 57  .  pMaskSet = pW
9290: 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70  C->pMaskSet;.  p
92a0: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
92b0: 78 70 72 3b 0a 20 20 70 72 65 72 65 71 4c 65 66  xpr;.  prereqLef
92c0: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
92d0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
92e0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70  pr->pLeft);.  op
92f0: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
9300: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
9310: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
9320: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
9330: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
9340: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69  eqRight = exprLi
9350: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
9360: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c  skSet, pExpr->pL
9370: 69 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20  ist).           
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
9390: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
93a0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
93b0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 29 3b  pExpr->pSelect);
93c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
93d0: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
93e0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
93f0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
9400: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
9410: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
9420: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9430: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
9440: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
9450: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
9460: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9470: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
9480: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
9490: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
94a0: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
94b0: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
94c0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
94d0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
94e0: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
94f0: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
9500: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
9510: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
9520: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
9530: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
9560: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
9570: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
9580: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
9590: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
95a0: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
95b0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
95c0: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
95d0: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
95e0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
95f0: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
9600: 70 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d  p(op) && (pTerm-
9610: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
9620: 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b  rereqLeft)==0 ){
9630: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
9640: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
9650: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
9660: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
9670: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  t;.    if( pLeft
9680: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
9690: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
96a0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
96b0: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
96c0: 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43    pTerm->u.leftC
96d0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
96e0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54  Column;.      pT
96f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
9700: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70   operatorMask(op
9710: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9720: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
9730: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
9740: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
9750: 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  erm *pNew;.     
9760: 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20   Expr *pDup;.   
9770: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
9780: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
9790: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
97a0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
97b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
97c0: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
97d0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
97e0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
97f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
9800: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75  prDelete(db, pDu
9810: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
9820: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
9830: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
9840: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
9850: 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45  rt(pWC, pDup, TE
9860: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
9870: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
9880: 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20    if( idxNew==0 
9890: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
98a0: 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61    pNew = &pWC->a
98b0: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
98c0: 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20    pNew->iParent 
98d0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
98e0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
98f0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
9900: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
9910: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ld = 1;.        
9920: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
9930: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
9940: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9950: 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72      pDup = pExpr
9960: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
9970: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
9980: 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74        exprCommut
9990: 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b  e(pParse, pDup);
99a0: 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70  .      pLeft = p
99b0: 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  Dup->pLeft;.    
99c0: 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73    pNew->leftCurs
99d0: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
99e0: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  le;.      pNew->
99f0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
9a00: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
9a10: 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
9a20: 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c  qRight = prereqL
9a30: 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  eft;.      pNew-
9a40: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
9a50: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e  reqAll;.      pN
9a60: 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  ew->eOperator = 
9a70: 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75  operatorMask(pDu
9a80: 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  p->op);.    }.  
9a90: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
9aa0: 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f  E_OMIT_BETWEEN_O
9ab0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
9ac0: 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68   If a term is th
9ad0: 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  e BETWEEN operat
9ae0: 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e  or, create two n
9af0: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
9b00: 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e  .  ** that defin
9b10: 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74  e the range that
9b20: 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70   the BETWEEN imp
9b30: 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78  lements.  For ex
9b40: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
9b50: 20 20 20 20 20 20 61 20 42 45 54 57 45 45 4e 20        a BETWEEN 
9b60: 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a  b AND c.  **.  *
9b70: 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69  * is converted i
9b80: 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
9b90: 20 20 20 20 28 61 20 42 45 54 57 45 45 4e 20 62      (a BETWEEN b
9ba0: 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d   AND c) AND (a>=
9bb0: 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20  b) AND (a<=c).  
9bc0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20  **.  ** The two 
9bd0: 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 61 64  new terms are ad
9be0: 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ded onto the end
9bf0: 20 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c 61   of the WhereCla
9c00: 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a  use object..  **
9c10: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61   The new terms a
9c20: 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64  re "dynamic" and
9c30: 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66   are children of
9c40: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45   the original BE
9c50: 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e  TWEEN.  ** term.
9c60: 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61    That means tha
9c70: 74 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  t if the BETWEEN
9c80: 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20   term is coded, 
9c90: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65  the children are
9ca0: 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20  .  ** skipped.  
9cb0: 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64  Or, if the child
9cc0: 72 65 6e 20 61 72 65 20 73 61 74 69 73 66 69 65  ren are satisfie
9cd0: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74  d by an index, t
9ce0: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
9cf0: 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73   BETWEEN term is
9d00: 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
9d10: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
9d20: 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20  >op==TK_BETWEEN 
9d30: 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  && pWC->op==TK_A
9d40: 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  ND ){.    ExprLi
9d50: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
9d60: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e  r->pList;.    in
9d70: 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20  t i;.    static 
9d80: 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d  const u8 ops[] =
9d90: 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b   {TK_GE, TK_LE};
9da0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
9db0: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
9dc0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
9dd0: 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28  r==2 );.    for(
9de0: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
9df0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
9e00: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
9e10: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  idxNew;.      pN
9e20: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
9e30: 45 78 70 72 28 64 62 2c 20 6f 70 73 5b 69 5d 2c  Expr(db, ops[i],
9e40: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9e50: 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
9e60: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
9e90: 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
9ea0: 45 78 70 72 29 2c 20 30 29 3b 0a 20 20 20 20 20  Expr), 0);.     
9eb0: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
9ec0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
9ed0: 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
9ee0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
9ef0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73  AMIC);.      tes
9f00: 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
9f10: 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e   );.      exprAn
9f20: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
9f30: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
9f40: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
9f50: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
9f60: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
9f70: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
9f80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72  ;.    }.    pTer
9f90: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
9fa0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
9fb0: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
9fc0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
9fd0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
9fe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
9ff0: 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21  TIMIZATION) && !
a000: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a010: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20  MIT_SUBQUERY).  
a020: 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  /* Analyze a ter
a030: 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73  m that is compos
a040: 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ed of two or mor
a050: 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65  e subterms conne
a060: 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20  cted by.  ** an 
a070: 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  OR operator..  *
a080: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
a090: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b  pr->op==TK_OR ){
a0a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 43  .    assert( pWC
a0b0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ->op==TK_AND );.
a0c0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f      exprAnalyzeO
a0d0: 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c  rTerm(pSrc, pWC,
a0e0: 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 7d 0a 23   idxTerm);.  }.#
a0f0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a100: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
a110: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
a120: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
a130: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
a140: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
a150: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
a160: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
a170: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
a180: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
a190: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
a1a0: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
a1b0: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62  form "x LIKE 'ab
a1c0: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
a1d0: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
a1e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
a1f0: 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44      x>='abc' AND
a200: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
a210: 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a  IKE 'abc%'.  **.
a220: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
a230: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
a240: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
a250: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
a260: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
a270: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
a280: 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20  n "abd"..  */.  
a290: 69 66 28 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62  if( isLikeOrGlob
a2a0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
a2b0: 26 6e 50 61 74 74 65 72 6e 2c 20 26 69 73 43 6f  &nPattern, &isCo
a2c0: 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29  mplete, &noCase)
a2d0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 57 43  .         && pWC
a2e0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
a2f0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c      Expr *pLeft,
a300: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 45 78   *pRight;.    Ex
a310: 70 72 20 2a 70 53 74 72 31 2c 20 2a 70 53 74 72  pr *pStr1, *pStr
a320: 32 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  2;.    Expr *pNe
a330: 77 45 78 70 72 31 2c 20 2a 70 4e 65 77 45 78 70  wExpr1, *pNewExp
a340: 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  r2;.    int idxN
a350: 65 77 31 2c 20 69 64 78 4e 65 77 32 3b 0a 0a 20  ew1, idxNew2;.. 
a360: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
a370: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
a380: 78 70 72 3b 0a 20 20 20 20 70 52 69 67 68 74 20  xpr;.    pRight 
a390: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
a3a0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
a3b0: 70 53 74 72 31 20 3d 20 73 71 6c 69 74 65 33 50  pStr1 = sqlite3P
a3c0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
a3d0: 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20 30 29  STRING, 0, 0, 0)
a3e0: 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 31 20  ;.    if( pStr1 
a3f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a400: 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
a410: 53 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52  Str1->token, &pR
a420: 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  ight->token);.  
a430: 20 20 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65 6e      pStr1->token
a440: 2e 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20  .n = nPattern;. 
a450: 20 20 20 20 20 70 53 74 72 31 2d 3e 66 6c 61 67       pStr1->flag
a460: 73 20 3d 20 45 50 5f 44 65 71 75 6f 74 65 64 3b  s = EP_Dequoted;
a470: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72 32  .    }.    pStr2
a480: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
a490: 70 28 64 62 2c 20 70 53 74 72 31 29 3b 0a 20 20  p(db, pStr1);.  
a4a0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
a4b0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
a4c0: 20 75 38 20 63 2c 20 2a 70 43 3b 0a 20 20 20 20   u8 c, *pC;.    
a4d0: 20 20 61 73 73 65 72 74 28 20 70 53 74 72 32 2d    assert( pStr2-
a4e0: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 3b 0a 20 20  >token.dyn );.  
a4f0: 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70      pC = (u8*)&p
a500: 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 7a 5b 6e 50  Str2->token.z[nP
a510: 61 74 74 65 72 6e 2d 31 5d 3b 0a 20 20 20 20 20  attern-1];.     
a520: 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20   c = *pC;.      
a530: 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20  if( noCase ){.  
a540: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 40 27        if( c=='@'
a550: 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   ) isComplete = 
a560: 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73  0;.        c = s
a570: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
a580: 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  er[c];.      }. 
a590: 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31       *pC = c + 1
a5a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
a5b0: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50  Expr1 = sqlite3P
a5c0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
a5d0: 47 45 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  GE, sqlite3ExprD
a5e0: 75 70 28 64 62 2c 70 4c 65 66 74 29 2c 20 70 53  up(db,pLeft), pS
a5f0: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78  tr1, 0);.    idx
a600: 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75  New1 = whereClau
a610: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
a620: 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49  ewExpr1, TERM_VI
a630: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
a640: 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  IC);.    testcas
a650: 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b  e( idxNew1==0 );
a660: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
a670: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
a680: 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  ew1);.    pNewEx
a690: 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78  pr2 = sqlite3PEx
a6a0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54  pr(pParse, TK_LT
a6b0: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
a6c0: 28 64 62 2c 70 4c 65 66 74 29 2c 20 70 53 74 72  (db,pLeft), pStr
a6d0: 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65  2, 0);.    idxNe
a6e0: 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w2 = whereClause
a6f0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
a700: 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54  Expr2, TERM_VIRT
a710: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
a720: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
a730: 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20   idxNew2==0 );. 
a740: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
a750: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
a760: 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  2);.    pTerm = 
a770: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
a780: 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70  ;.    if( isComp
a790: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57  lete ){.      pW
a7a0: 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50  C->a[idxNew1].iP
a7b0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
a7c0: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
a7d0: 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d  xNew2].iParent =
a7e0: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
a7f0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
a800: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  2;.    }.  }.#en
a810: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
a820: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
a830: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
a840: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
a850: 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41  TUALTABLE.  /* A
a860: 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75  dd a WO_MATCH au
a870: 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20  xiliary term to 
a880: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73  the constraint s
a890: 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63  et if the.  ** c
a8a0: 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f  urrent expressio
a8b0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
a8c0: 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20  :  column MATCH 
a8d0: 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20  expr..  ** This 
a8e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
a8f0: 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  sed by the xBest
a900: 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66  Index methods of
a910: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
a920: 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76  bles.  The nativ
a930: 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65  e query optimize
a940: 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d  r does not attem
a950: 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e  pt.  ** to do an
a960: 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43  ything with MATC
a970: 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  H functions..  *
a980: 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f  /.  if( isMatchO
a990: 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29  fColumn(pExpr) )
a9a0: 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  {.    int idxNew
a9b0: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  ;.    Expr *pRig
a9c0: 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  ht, *pLeft;.    
a9d0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54  WhereTerm *pNewT
a9e0: 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b  erm;.    Bitmask
a9f0: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70   prereqColumn, p
aa00: 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20  rereqExpr;..    
aa10: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
aa20: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
aa30: 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70  r;.    pLeft = p
aa40: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
aa50: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65  ].pExpr;.    pre
aa60: 72 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61  reqExpr = exprTa
aa70: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
aa80: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
aa90: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65  prereqColumn = e
aaa0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
aab0: 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a  askSet, pLeft);.
aac0: 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45      if( (prereqE
aad0: 78 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75  xpr & prereqColu
aae0: 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mn)==0 ){.      
aaf0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
ab00: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d        pNewExpr =
ab10: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
ab20: 20 54 4b 5f 4d 41 54 43 48 2c 20 30 2c 20 73 71   TK_MATCH, 0, sq
ab30: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
ab40: 20 70 52 69 67 68 74 29 2c 20 30 29 3b 0a 20 20   pRight), 0);.  
ab50: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
ab60: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
ab70: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
ab80: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
ab90: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
aba0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
abb0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
abc0: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
abd0: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
abe0: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
abf0: 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70  ight = prereqExp
ac00: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  r;.      pNewTer
ac10: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
ac20: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
ac30: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75       pNewTerm->u
ac40: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
ac50: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
ac60: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f      pNewTerm->eO
ac70: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54  perator = WO_MAT
ac80: 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  CH;.      pNewTe
ac90: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  rm->iParent = id
aca0: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
acb0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
acc0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
acd0: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
ace0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
acf0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
ad00: 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
ad10: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
ad20: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
ad30: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
ad40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ad50: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
ad60: 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74  */..  /* Prevent
ad70: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
ad80: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
ad90: 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20  from being used 
ada0: 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e  to drive.  ** an
adb0: 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65   index for table
adc0: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
add0: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
ade0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
adf0: 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67  ight |= extraRig
ae00: 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ht;.}../*.** Ret
ae10: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 79 20  urn TRUE if any 
ae20: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
ae30: 6e 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 69  ns in pList->a[i
ae40: 46 69 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74 61 69  First...] contai
ae50: 6e 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  n.** a reference
ae60: 20 74 6f 20 61 6e 79 20 74 61 62 6c 65 20 6f 74   to any table ot
ae70: 68 65 72 20 74 68 61 6e 20 74 68 65 20 69 42 61  her than the iBa
ae80: 73 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  se table..*/.sta
ae90: 74 69 63 20 69 6e 74 20 72 65 66 65 72 65 6e 63  tic int referenc
aea0: 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 0a 20  esOtherTables(. 
aeb0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
aec0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ,          /* Se
aed0: 61 72 63 68 20 65 78 70 72 65 73 73 69 6f 6e 73  arch expressions
aee0: 20 69 6e 20 74 68 73 20 6c 69 73 74 20 2a 2f 0a   in ths list */.
aef0: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
af00: 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20 4d  pMaskSet,   /* M
af10: 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c  apping from tabl
af20: 65 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f  es to bitmaps */
af30: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20  .  int iFirst,  
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af50: 42 65 20 73 65 61 72 63 68 69 6e 67 20 77 69 74  Be searching wit
af60: 68 20 74 68 65 20 69 46 69 72 73 74 2d 74 68 20  h the iFirst-th 
af70: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
af80: 69 6e 74 20 69 42 61 73 65 20 20 20 20 20 20 20  int iBase       
af90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e            /* Ign
afa0: 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ore references t
afb0: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
afc0: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 61 6c 6c  ){.  Bitmask all
afd0: 6f 77 65 64 20 3d 20 7e 67 65 74 4d 61 73 6b 28  owed = ~getMask(
afe0: 70 4d 61 73 6b 53 65 74 2c 20 69 42 61 73 65 29  pMaskSet, iBase)
aff0: 3b 0a 20 20 77 68 69 6c 65 28 20 69 46 69 72 73  ;.  while( iFirs
b000: 74 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  t<pList->nExpr )
b010: 7b 0a 20 20 20 20 69 66 28 20 28 65 78 70 72 54  {.    if( (exprT
b020: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
b030: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69  et, pList->a[iFi
b040: 72 73 74 2b 2b 5d 2e 70 45 78 70 72 29 26 61 6c  rst++].pExpr)&al
b050: 6c 6f 77 65 64 29 21 3d 30 20 29 7b 0a 20 20 20  lowed)!=0 ){.   
b060: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b070: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b080: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0;.}.../*.** Thi
b090: 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65  s routine decide
b0a0: 73 20 69 66 20 70 49 64 78 20 63 61 6e 20 62 65  s if pIdx can be
b0b0: 20 75 73 65 64 20 74 6f 20 73 61 74 69 73 66 79   used to satisfy
b0c0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
b0d0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20   clause.  If it 
b0e0: 63 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20  can, it returns 
b0f0: 31 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e  1.  If pIdx cann
b100: 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a  ot satisfy the.*
b110: 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
b120: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
b130: 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a  returns 0..**.**
b140: 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20   pOrderBy is an 
b150: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
b160: 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74  from a SELECT st
b170: 61 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69  atement.  pTab i
b180: 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  s the.** left-mo
b190: 73 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  st table in the 
b1a0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
b1b0: 68 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20  hat same SELECT 
b1c0: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a  statement and.**
b1d0: 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
b1e0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
b1f0: 66 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20  f "base".  pIdx 
b200: 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70  is an index on p
b210: 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f  Tab..**.** nEqCo
b220: 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  l is the number 
b230: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49  of columns of pI
b240: 64 78 20 74 68 61 74 20 61 72 65 20 75 73 65 64  dx that are used
b250: 20 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   as equality.** 
b260: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e  constraints.  An
b270: 79 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d  y of these colum
b280: 6e 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e  ns may be missin
b290: 67 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52  g from the ORDER
b2a0: 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e   BY.** clause an
b2b0: 64 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20  d the match can 
b2c0: 73 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65  still be a succe
b2d0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65  ss..**.** All te
b2e0: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
b2f0: 20 42 59 20 74 68 61 74 20 6d 61 74 63 68 20 61   BY that match a
b300: 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78  gainst the index
b310: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 0a   must be either.
b320: 2a 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20  ** ASC or DESC. 
b330: 20 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f   (Terms of the O
b340: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 70  RDER BY clause p
b350: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
b360: 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78   UNIQUE.** index
b370: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
b380: 73 61 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e  satisfy this con
b390: 73 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a  straint.)  The *
b3a0: 70 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a  pbRev value is.*
b3b0: 2a 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68  * set to 1 if th
b3c0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
b3d0: 65 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e  e is all DESC an
b3e0: 64 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 30  d it is set to 0
b3f0: 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52   if.** the ORDER
b400: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c   BY clause is al
b410: 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63  l ASC..*/.static
b420: 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e   int isSortingIn
b430: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
b440: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
b450: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
b460: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  t */.  WhereMask
b470: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f  Set *pMaskSet, /
b480: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  * Mapping from t
b490: 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  able cursor numb
b4a0: 65 72 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a  ers to bitmaps *
b4b0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b4d0: 68 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  he index we are 
b4e0: 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  testing */.  int
b4f0: 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20   base,          
b500: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
b510: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
b520: 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ble to be sorted
b530: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
b540: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
b550: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
b560: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ause */.  int nE
b570: 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  qCol,           
b580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
b590: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74  ndex columns wit
b5a0: 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  h == constraints
b5b0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b5d0: 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44   Set to 1 if ORD
b5e0: 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f  ER BY is DESC */
b5f0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
b600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b610: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b620: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
b630: 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20 20  sortOrder = 0;  
b640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
b650: 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64 20  OR of index and 
b660: 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20 64 69  ORDER BY sort di
b670: 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rection */.  int
b680: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b6a0: 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
b6b0: 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74  BY terms */.  st
b6c0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
b6d0: 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a  em *pTerm;    /*
b6e0: 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f   A term of the O
b6f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
b700: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
b710: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
b720: 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
b730: 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d 20  y!=0 );.  nTerm 
b740: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
b750: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  r;.  assert( nTe
b760: 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  rm>0 );..  /* Ma
b770: 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tch terms of the
b780: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
b790: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
b7a0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64   of.  ** the ind
b7b0: 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ex..  **.  ** No
b7c0: 74 65 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  te that indices 
b7d0: 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  have pIdx->nColu
b7e0: 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d  mn regular colum
b7f0: 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65  ns plus.  ** one
b800: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
b810: 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  mn containing th
b820: 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f  e rowid.  The ro
b830: 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  wid column.  ** 
b840: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
b850: 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20  also allowed to 
b860: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68  match against th
b870: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20  e ORDER BY.  ** 
b880: 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66  clause..  */.  f
b890: 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
b8a0: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
b8b0: 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d  Term && i<=pIdx-
b8c0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
b8d0: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
b8e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
b8f0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
b900: 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a  ORDER BY pTerm *
b910: 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  /.    CollSeq *p
b920: 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20  Coll;    /* The 
b930: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
b940: 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  ce of pExpr */. 
b950: 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f     int termSortO
b960: 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72  rder; /* Sort or
b970: 64 65 72 20 66 6f 72 20 74 68 69 73 20 74 65 72  der for this ter
b980: 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  m */.    int iCo
b990: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54  lumn;       /* T
b9a0: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i-th column o
b9b0: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31  f the index.  -1
b9c0: 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20   for rowid */.  
b9d0: 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72    int iSortOrder
b9e0: 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45  ;    /* 1 for DE
b9f0: 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e  SC, 0 for ASC on
ba00: 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   the i-th index 
ba10: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  term */.    cons
ba20: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f  t char *zColl; /
ba30: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
ba40: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
ba50: 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20   for i-th index 
ba60: 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78  term */..    pEx
ba70: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
ba80: 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
ba90: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
baa0: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
bab0: 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  !=base ){.      
bac0: 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61  /* Can not use a
bad0: 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20  n index sort on 
bae0: 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73  anything that is
baf0: 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e   not a column in
bb00: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65   the.      ** le
bb10: 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66  ft-most table of
bb20: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
bb30: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
bb40: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c  .    }.    pColl
bb50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
bb60: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
bb70: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70  xpr);.    if( !p
bb80: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
bb90: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
bba0: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oll;.    }.    i
bbb0: 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  f( i<pIdx->nColu
bbc0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c  mn ){.      iCol
bbd0: 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  umn = pIdx->aiCo
bbe0: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69  lumn[i];.      i
bbf0: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  f( iColumn==pIdx
bc00: 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
bc10: 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75  ){.        iColu
bc20: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  mn = -1;.      }
bc30: 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65  .      iSortOrde
bc40: 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  r = pIdx->aSortO
bc50: 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a  rder[i];.      z
bc60: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
bc70: 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  oll[i];.    }els
bc80: 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  e{.      iColumn
bc90: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f   = -1;.      iSo
bca0: 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20  rtOrder = 0;.   
bcb0: 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c     zColl = pColl
bcc0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20  ->zName;.    }. 
bcd0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
bce0: 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c  olumn!=iColumn |
bcf0: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
bd00: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  (pColl->zName, z
bd10: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f  Coll) ){.      /
bd20: 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20  * Term j of the 
bd30: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
bd40: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63  does not match c
bd50: 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69  olumn i of the i
bd60: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
bd70: 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20  ( i<nEqCol ){.  
bd80: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69        /* If an i
bd90: 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ndex column that
bda0: 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
bdb0: 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d  by == fails to m
bdc0: 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20  atch an.        
bdd0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ** ORDER BY term
bde0: 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a  , that is OK.  J
bdf0: 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20  ust ignore that 
be00: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
be10: 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  dex.        */. 
be20: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
be30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
be40: 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i==pIdx->nColum
be50: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  n ){.        /* 
be60: 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 20 69  Index column i i
be70: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 41 6c  s the rowid.  Al
be80: 6c 20 6f 74 68 65 72 20 74 65 72 6d 73 20 6d 61  l other terms ma
be90: 74 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tch. */.        
bea0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
beb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
bec0: 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  f an index colum
bed0: 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68  n fails to match
bee0: 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73   and is not cons
bef0: 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20  trained by ==.  
bf00: 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
bf10: 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73  e index cannot s
bf20: 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
bf30: 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a   BY constraint..
bf40: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
bf50: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
bf60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
bf70: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f  ssert( pIdx->aSo
bf80: 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
bf90: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
bfa0: 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c  >sortOrder==0 ||
bfb0: 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65   pTerm->sortOrde
bfc0: 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  r==1 );.    asse
bfd0: 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d  rt( iSortOrder==
bfe0: 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d  0 || iSortOrder=
bff0: 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f  =1 );.    termSo
c000: 72 74 4f 72 64 65 72 20 3d 20 69 53 6f 72 74 4f  rtOrder = iSortO
c010: 72 64 65 72 20 5e 20 70 54 65 72 6d 2d 3e 73 6f  rder ^ pTerm->so
c020: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28  rtOrder;.    if(
c030: 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20   i>nEqCol ){.   
c040: 20 20 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f     if( termSortO
c050: 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20  rder!=sortOrder 
c060: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
c070: 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62  dices can only b
c080: 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52  e used if all OR
c090: 44 45 52 20 42 59 20 74 65 72 6d 73 20 70 61 73  DER BY terms pas
c0a0: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
c0b0: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
c0c0: 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69  aints are all ei
c0d0: 74 68 65 72 20 44 45 53 43 20 6f 72 20 41 53 43  ther DESC or ASC
c0e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  . */.        ret
c0f0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
c100: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c110: 73 6f 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d  sortOrder = term
c120: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  SortOrder;.    }
c130: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54  .    j++;.    pT
c140: 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69  erm++;.    if( i
c150: 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 72 65 66  Column<0 && !ref
c160: 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c  erencesOtherTabl
c170: 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61  es(pOrderBy, pMa
c180: 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20  skSet, j, base) 
c190: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
c1a0: 68 65 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  he indexed colum
c1b0: 6e 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  n is the primary
c1c0: 20 6b 65 79 20 61 6e 64 20 65 76 65 72 79 74 68   key and everyth
c1d0: 69 6e 67 20 6d 61 74 63 68 65 73 0a 20 20 20 20  ing matches.    
c1e0: 20 20 2a 2a 20 73 6f 20 66 61 72 20 61 6e 64 20    ** so far and 
c1f0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45  none of the ORDE
c200: 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 74 68  R BY terms to th
c210: 65 20 72 69 67 68 74 20 72 65 66 65 72 65 6e 63  e right referenc
c220: 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  e other.      **
c230: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
c240: 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20 61 72 65  oin, then we are
c250: 20 61 73 73 75 72 65 64 20 74 68 61 74 20 74 68   assured that th
c260: 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  e index can be u
c270: 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  sed .      ** to
c280: 20 73 6f 72 74 20 62 65 63 61 75 73 65 20 74 68   sort because th
c290: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
c2a0: 20 75 6e 69 71 75 65 20 61 6e 64 20 73 6f 20 6e   unique and so n
c2b0: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  one of the other
c2c0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
c2d0: 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20  s will make any 
c2e0: 64 69 66 66 65 72 65 6e 63 65 0a 20 20 20 20 20  difference.     
c2f0: 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 6e 54   */.      j = nT
c300: 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  erm;.    }.  }..
c310: 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f    *pbRev = sortO
c320: 72 64 65 72 21 3d 30 3b 0a 20 20 69 66 28 20 6a  rder!=0;.  if( j
c330: 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 2f  >=nTerm ){.    /
c340: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
c350: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
c360: 73 65 20 61 72 65 20 63 6f 76 65 72 65 64 20 62  se are covered b
c370: 79 20 74 68 69 73 20 69 6e 64 65 78 20 73 6f 0a  y this index so.
c380: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 6e 64 65      ** this inde
c390: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  x can be used fo
c3a0: 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20  r sorting. */.  
c3b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
c3c0: 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
c3d0: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20  ror!=OE_None && 
c3e0: 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i==pIdx->nColumn
c3f0: 0a 20 20 20 20 20 20 26 26 20 21 72 65 66 65 72  .      && !refer
c400: 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73  encesOtherTables
c410: 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b  (pOrderBy, pMask
c420: 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b  Set, j, base) ){
c430: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d  .    /* All term
c440: 73 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 20  s of this index 
c450: 6d 61 74 63 68 20 73 6f 6d 65 20 70 72 65 66 69  match some prefi
c460: 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  x of the ORDER B
c470: 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  Y clause.    ** 
c480: 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 73  and the index is
c490: 20 55 4e 49 51 55 45 20 61 6e 64 20 6e 6f 20 74   UNIQUE and no t
c4a0: 65 72 6d 73 20 6f 6e 20 74 68 65 20 74 61 69 6c  erms on the tail
c4b0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
c4c0: 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 72  .    ** clause r
c4d0: 65 66 65 72 65 6e 63 65 20 6f 74 68 65 72 20 74  eference other t
c4e0: 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 2e  ables in a join.
c4f0: 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6c 6c    If this is all
c500: 20 74 72 75 65 20 74 68 65 6e 0a 20 20 20 20 2a   true then.    *
c510: 2a 20 74 68 65 20 6f 72 64 65 72 20 62 79 20 63  * the order by c
c520: 6c 61 75 73 65 20 69 73 20 73 75 70 65 72 66 6c  lause is superfl
c530: 75 6f 75 73 2e 20 2a 2f 0a 20 20 20 20 72 65 74  uous. */.    ret
c540: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
c550: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c560: 43 68 65 63 6b 20 74 61 62 6c 65 20 74 6f 20 73  Check table to s
c570: 65 65 20 69 66 20 74 68 65 20 4f 52 44 45 52 20  ee if the ORDER 
c580: 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 4f 72  BY clause in pOr
c590: 64 65 72 42 79 20 63 61 6e 20 62 65 20 73 61 74  derBy can be sat
c5a0: 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 73 6f 72  isfied.** by sor
c5b0: 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 6f 66  ting in order of
c5c0: 20 52 4f 57 49 44 2e 20 20 52 65 74 75 72 6e 20   ROWID.  Return 
c5d0: 74 72 75 65 20 69 66 20 73 6f 20 61 6e 64 20 73  true if so and s
c5e0: 65 74 20 2a 70 62 52 65 76 20 74 6f 20 62 65 0a  et *pbRev to be.
c5f0: 2a 2a 20 74 72 75 65 20 66 6f 72 20 72 65 76 65  ** true for reve
c600: 72 73 65 20 52 4f 57 49 44 20 61 6e 64 20 66 61  rse ROWID and fa
c610: 6c 73 65 20 66 6f 72 20 66 6f 72 77 61 72 64 20  lse for forward 
c620: 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a  ROWID order..*/.
c630: 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74 61  static int sorta
c640: 62 6c 65 42 79 52 6f 77 69 64 28 0a 20 20 69 6e  bleByRowid(.  in
c650: 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
c660: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
c670: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
c680: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
c690: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
c6a0: 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68  derBy,     /* Th
c6b0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
c6c0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  e */.  WhereMask
c6d0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f  Set *pMaskSet, /
c6e0: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  * Mapping from t
c6f0: 61 62 6c 65 20 63 75 72 73 6f 72 73 20 74 6f 20  able cursors to 
c700: 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74  bitmaps */.  int
c710: 20 2a 70 62 52 65 76 20 20 20 20 20 20 20 20 20   *pbRev         
c720: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
c730: 20 69 66 20 4f 52 44 45 52 20 42 59 20 69 73 20   if ORDER BY is 
c740: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  DESC */.){.  Exp
c750: 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *p;..  assert(
c760: 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
c770: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
c780: 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  By->nExpr>0 );. 
c790: 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61   p = pOrderBy->a
c7a0: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
c7b0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
c7c0: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
c7d0: 62 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  base && p->iColu
c7e0: 6d 6e 3d 3d 2d 31 0a 20 20 20 20 26 26 20 21 72  mn==-1.    && !r
c7f0: 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61  eferencesOtherTa
c800: 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70  bles(pOrderBy, p
c810: 4d 61 73 6b 53 65 74 2c 20 31 2c 20 62 61 73 65  MaskSet, 1, base
c820: 29 20 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20  ) ){.    *pbRev 
c830: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d  = pOrderBy->a[0]
c840: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
c850: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
c860: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
c870: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63 72 75  ** Prepare a cru
c880: 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  de estimate of t
c890: 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20  he logarithm of 
c8a0: 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e  the input value.
c8b0: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
c8c0: 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63  need not be exac
c8d0: 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  t.  This is only
c8e0: 20 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61   used for estima
c8f0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61  ting.** the tota
c900: 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72  l cost of perfor
c910: 6d 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  ming operations 
c920: 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20  with O(logN) or 
c930: 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70  O(NlogN).** comp
c940: 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75 73 65  lexity.  Because
c950: 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75 65   N is just a gue
c960: 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65  ss, it is no gre
c970: 61 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a  at tragedy if.**
c980: 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c   logN is a littl
c990: 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  e off..*/.static
c9a0: 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64   double estLog(d
c9b0: 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62  ouble N){.  doub
c9c0: 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64  le logN = 1;.  d
c9d0: 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20  ouble x = 10;.  
c9e0: 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20  while( N>x ){.  
c9f0: 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20    logN += 1;.   
ca00: 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20   x *= 10;.  }.  
ca10: 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a  return logN;.}..
ca20: 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e  /*.** Two routin
ca30: 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  es for printing 
ca40: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
ca50: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
ca60: 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  info.** structur
ca70: 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73  e.  Used for tes
ca80: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
ca90: 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69  ng only.  If nei
caa0: 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  ther.** SQLITE_T
cab0: 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  EST or SQLITE_DE
cac0: 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c  BUG are defined,
cad0: 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74   then these rout
cae0: 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f  ines.** are no-o
caf0: 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ps..*/.#if !defi
cb00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
cb10: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
cb20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
cb30: 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f  DEBUG).static vo
cb40: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  id TRACE_IDX_INP
cb50: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
cb60: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
cb70: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
cb80: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
cb90: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
cba0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
cbb0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
cbc0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
cbd0: 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b  f("  constraint[
cbe0: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d  %d]: col=%d term
cbf0: 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62  id=%d op=%d usab
cc00: 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  led=%d\n",.     
cc10: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
cc20: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
cc30: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
cc40: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
cc50: 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20  iTermOffset,.   
cc60: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
cc70: 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20  nt[i].op,.      
cc80: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
cc90: 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a  i].usable);.  }.
cca0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
ccb0: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
ccc0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
ccd0: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62  Printf("  orderb
cce0: 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65  y[%d]: col=%d de
ccf0: 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  sc=%d\n",.      
cd00: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f   i,.       p->aO
cd10: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
cd20: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  n,.       p->aOr
cd30: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a  derBy[i].desc);.
cd40: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
cd50: 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  d TRACE_IDX_OUTP
cd60: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
cd70: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
cd80: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
cd90: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
cda0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
cdb0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
cdc0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
cdd0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
cde0: 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20  f("  usage[%d]: 
cdf0: 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d  argvIdx=%d omit=
ce00: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
ce10: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
ce20: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
ce30: 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20  rgvIndex,.      
ce40: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
ce50: 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20  sage[i].omit);. 
ce60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
ce70: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75  gPrintf("  idxNu
ce80: 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e  m=%d\n", p->idxN
ce90: 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  um);.  sqlite3De
cea0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
ceb0: 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64  Str=%s\n", p->id
cec0: 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
ced0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
cee0: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25  rderByConsumed=%
cef0: 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79  d\n", p->orderBy
cf00: 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c  Consumed);.  sql
cf10: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
cf20: 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74  "  estimatedCost
cf30: 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  =%g\n", p->estim
cf40: 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c  atedCost);.}.#el
cf50: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
cf60: 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23  _IDX_INPUTS(A).#
cf70: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
cf80: 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64  _OUTPUTS(A).#end
cf90: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
cfa0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
cfb0: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ABLE./*.** Compu
cfc0: 74 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  te the best inde
cfd0: 78 20 66 6f 72 20 61 20 76 69 72 74 75 61 6c 20  x for a virtual 
cfe0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
cff0: 20 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 63   best index is c
d000: 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 78  omputed by the x
d010: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
d020: 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 0a   of the virtual.
d030: 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e  ** table module.
d040: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
d050: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
d060: 77 72 61 70 70 65 72 20 74 68 61 74 20 73 65 74  wrapper that set
d070: 73 20 75 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s up.** the sqli
d080: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
d090: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
d0a0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69   used to communi
d0b0: 63 61 74 65 20 77 69 74 68 0a 2a 2a 20 78 42 65  cate with.** xBe
d0c0: 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49  stIndex..**.** I
d0d0: 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72  n a join, this r
d0e0: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 62 65 20  outine might be 
d0f0: 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20  called multiple 
d100: 74 69 6d 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a  times for the.**
d110: 20 73 61 6d 65 20 76 69 72 74 75 61 6c 20 74 61   same virtual ta
d120: 62 6c 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ble.  The sqlite
d130: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
d140: 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
d150: 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  d.** and initial
d160: 69 7a 65 64 20 6f 6e 20 74 68 65 20 66 69 72 73  ized on the firs
d170: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
d180: 20 72 65 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73   reused on all s
d190: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76  ubsequent.** inv
d1a0: 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 65 20 73  ocations.  The s
d1b0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
d1c0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
d1d0: 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a  lso used when.**
d1e0: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
d1f0: 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
d200: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
d210: 20 54 68 65 20 77 68 65 72 65 49 6e 66 6f 44 65   The whereInfoDe
d220: 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69  lete() .** routi
d230: 6e 65 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ne takes care of
d240: 20 66 72 65 65 69 6e 67 20 74 68 65 20 73 71 6c   freeing the sql
d250: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
d260: 73 74 72 75 63 74 75 72 65 20 61 66 74 65 72 0a  structure after.
d270: 2a 2a 20 65 76 65 72 79 62 6f 64 79 20 68 61 73  ** everybody has
d280: 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 69   finished with i
d290: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75  t..*/.static dou
d2a0: 62 6c 65 20 62 65 73 74 56 69 72 74 75 61 6c 49  ble bestVirtualI
d2b0: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
d2c0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
d2d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
d2e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d2f0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
d300: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  pWC,            
d310: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
d320: 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
d330: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
d340: 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65  pSrc,     /* The
d350: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
d360: 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
d370: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
d380: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
d390: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
d3a0: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
d3b0: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45  available */.  E
d3c0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
d3d0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  y,            /*
d3e0: 20 54 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c   The order by cl
d3f0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  ause */.  int or
d400: 64 65 72 42 79 55 73 61 62 6c 65 2c 20 20 20 20  derByUsable,    
d410: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
d420: 20 69 66 20 77 65 20 63 61 6e 20 70 6f 74 65 6e   if we can poten
d430: 74 69 61 6c 20 73 6f 72 74 20 2a 2f 0a 20 20 73  tial sort */.  s
d440: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
d450: 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20 2f 2a  o **ppIdxInfo /*
d460: 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61 74 69   Index informati
d470: 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78 42 65  on passed to xBe
d480: 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  stIndex */.){.  
d490: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53  Table *pTab = pS
d4a0: 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  rc->pTab;.  sqli
d4b0: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
d4c0: 3d 20 70 54 61 62 2d 3e 70 56 74 61 62 3b 0a 20  = pTab->pVtab;. 
d4d0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
d4e0: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
d4f0: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
d500: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
d510: 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
d520: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
d530: 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78  ex_orderby *pIdx
d540: 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63  OrderBy;.  struc
d550: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
d560: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
d570: 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
d580: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
d590: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
d5a0: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  nOrderBy;.  int 
d5b0: 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  rc;..  /* If the
d5c0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
d5d0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 61  nfo structure ha
d5e0: 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69  s not been previ
d5f0: 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  ously.  ** alloc
d600: 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c  ated and initial
d610: 69 7a 65 64 20 66 6f 72 20 74 68 69 73 20 76 69  ized for this vi
d620: 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 74 68 65  rtual table, the
d630: 6e 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  n allocate.  ** 
d640: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
d650: 74 20 6e 6f 77 0a 20 20 2a 2f 0a 20 20 70 49 64  t now.  */.  pId
d660: 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64 78 49 6e  xInfo = *ppIdxIn
d670: 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  fo;.  if( pIdxIn
d680: 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  fo==0 ){.    int
d690: 20 6e 54 65 72 6d 3b 0a 20 20 20 20 57 48 45 52   nTerm;.    WHER
d6a0: 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75  ETRACE(("Recompu
d6b0: 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20  ting index info 
d6c0: 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 54  for %s...\n", pT
d6d0: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  ab->zName));..  
d6e0: 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
d6f0: 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c  umber of possibl
d700: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
d710: 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72  onstraints refer
d720: 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ring.    ** to t
d730: 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
d740: 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6e  e */.    for(i=n
d750: 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
d760: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
d770: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
d780: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
d790: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
d7a0: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
d7b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d7c0: 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
d7d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65  ->eOperator&(pTe
d7e0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29  rm->eOperator-1)
d7f0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  )==0 );.      te
d800: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
d810: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20  Operator==WO_IN 
d820: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
d830: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
d840: 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29  tor==WO_ISNULL )
d850: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
d860: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
d870: 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_IN|WO_ISNULL)
d880: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d890: 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 20 20     nTerm++;.    
d8a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
d8b0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
d8c0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63   contains only c
d8d0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75  olumns in the cu
d8e0: 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20 76 69  rrent .    ** vi
d8f0: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
d900: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
d910: 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
d920: 20 70 61 72 74 20 6f 66 0a 20 20 20 20 2a 2a 20   part of.    ** 
d930: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
d940: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
d950: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4f 72  ..    */.    nOr
d960: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 69  derBy = 0;.    i
d970: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
d980: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
d990: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
d9a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
d9b0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
d9c0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
d9d0: 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  r;.        if( p
d9e0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
d9f0: 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
da00: 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
da10: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
da20: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
da30: 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ==pOrderBy->nExp
da40: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72  r ){.        nOr
da50: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
da60: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  ->nExpr;.      }
da70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
da80: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
da90: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
daa0: 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2f 0a  tructure.    */.
dab0: 20 20 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73      pIdxInfo = s
dac0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
dad0: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
dae0: 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
daf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
db10: 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e  (sizeof(*pIdxCon
db20: 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73  s) + sizeof(*pUs
db30: 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20  age))*nTerm.    
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
db60: 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a  f(*pIdxOrderBy)*
db70: 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20  nOrderBy );.    
db80: 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
db90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
dba0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
dbb0: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
dbc0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
dbd0: 30 2e 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  0.0;.    }.    *
dbe0: 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64 78  ppIdxInfo = pIdx
dbf0: 49 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  Info;..    /* In
dc00: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72  itialize the str
dc10: 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c  ucture.  The sql
dc20: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
dc30: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
dc40: 6e 73 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 66  ns.    ** many f
dc50: 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
dc60: 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
dc70: 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
dc80: 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 20 20 2a  Index from.    *
dc90: 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
dca0: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
dcb0: 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
dcc0: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
dcd0: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
dce0: 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20   those fields.. 
dcf0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 43 6f     */.    pIdxCo
dd00: 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
dd10: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
dd20: 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  raint*)&pIdxInfo
dd30: 5b 31 5d 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  [1];.    pIdxOrd
dd40: 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73  erBy = (struct s
dd50: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
dd60: 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b  erby*)&pIdxCons[
dd70: 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 70 55 73 61  nTerm];.    pUsa
dd80: 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ge = (struct sql
dd90: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
dda0: 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49  raint_usage*)&pI
ddb0: 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72  dxOrderBy[nOrder
ddc0: 42 79 5d 3b 0a 20 20 20 20 2a 28 69 6e 74 2a 29  By];.    *(int*)
ddd0: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  &pIdxInfo->nCons
dde0: 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a  traint = nTerm;.
ddf0: 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78      *(int*)&pIdx
de00: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
de10: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 2a   nOrderBy;.    *
de20: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
de30: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
de40: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
de50: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
de60: 43 6f 6e 73 3b 0a 20 20 20 20 2a 28 73 74 72 75  Cons;.    *(stru
de70: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
de80: 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
de90: 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
dea0: 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
deb0: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
dec0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
ded0: 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64  int_usage**)&pId
dee0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
def0: 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20  ntUsage =.      
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
df40: 55 73 61 67 65 3b 0a 0a 20 20 20 20 66 6f 72 28  Usage;..    for(
df50: 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
df60: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
df70: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
df80: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
df90: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
dfa0: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
dfb0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
dfc0: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
dfd0: 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72  >eOperator&(pTer
dfe0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29  m->eOperator-1))
dff0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
e000: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
e010: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29  perator==WO_IN )
e020: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
e030: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
e040: 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  or==WO_ISNULL );
e050: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
e060: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
e070: 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
e080: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
e090: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43    pIdxCons[j].iC
e0a0: 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75  olumn = pTerm->u
e0b0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
e0c0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
e0d0: 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a  TermOffset = i;.
e0e0: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
e0f0: 5d 2e 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d  ].op = (u8)pTerm
e100: 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20  ->eOperator;.   
e110: 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74     /* The direct
e120: 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74   assignment in t
e130: 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65  he previous line
e140: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c   is possible onl
e150: 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20  y because.      
e160: 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53  ** the WO_ and S
e170: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
e180: 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72  TRAINT_ codes ar
e190: 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68  e identical.  Th
e1a0: 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  e.      ** follo
e1b0: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
e1c0: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
e1d0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
e1e0: 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
e1f0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
e200: 51 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Q );.      asser
e210: 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45  t( WO_LT==SQLITE
e220: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
e230: 54 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 61 73  T_LT );.      as
e240: 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
e250: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
e260: 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 20  AINT_LE );.     
e270: 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d   assert( WO_GT==
e280: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
e290: 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20  STRAINT_GT );.  
e2a0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
e2b0: 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
e2c0: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b  CONSTRAINT_GE );
e2d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
e2e0: 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f  O_MATCH==SQLITE_
e2f0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
e300: 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 20 20  _MATCH );.      
e310: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
e320: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
e330: 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
e340: 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54  _GT|WO_GE|WO_MAT
e350: 43 48 29 20 29 3b 0a 20 20 20 20 20 20 6a 2b 2b  CH) );.      j++
e360: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
e370: 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
e380: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
e390: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
e3a0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
e3b0: 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64 65 72  .      pIdxOrder
e3c0: 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
e3d0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
e3e0: 20 20 20 20 20 20 70 49 64 78 4f 72 64 65 72 42        pIdxOrderB
e3f0: 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64  y[i].desc = pOrd
e400: 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
e410: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
e420: 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
e430: 69 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  int, the sqlite3
e440: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
e450: 63 74 75 72 65 20 74 68 61 74 20 70 49 64 78 49  cture that pIdxI
e460: 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20  nfo points.  ** 
e470: 74 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  to will have bee
e480: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65  n initialized, e
e490: 69 74 68 65 72 20 64 75 72 69 6e 67 20 74 68 65  ither during the
e4a0: 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74   current invocat
e4b0: 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69  ion or.  ** duri
e4c0: 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e  ng some prior in
e4d0: 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77  vocation.  Now w
e4e0: 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63  e just have to c
e4f0: 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a  ustomize the.  *
e500: 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64  * details of pId
e510: 78 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75  xInfo for the cu
e520: 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  rrent invocation
e530: 20 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a   and pass it to.
e540: 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e    ** xBestIndex.
e550: 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  .  */..  /* The 
e560: 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74  module name must
e570: 20 62 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73   be defined. Als
e580: 6f 2c 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74  o, by this point
e590: 20 74 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a   there must.  **
e5a0: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
e5b0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
e5c0: 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65   structure. Othe
e5d0: 72 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74  rwise.  ** sqlit
e5e0: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
e5f0: 61 6d 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76  ames() would hav
e600: 65 20 70 69 63 6b 65 64 20 75 70 20 74 68 65 20  e picked up the 
e610: 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61  error. .  */.  a
e620: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d  ssert( pTab->azM
e630: 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54 61 62  oduleArg && pTab
e640: 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d  ->azModuleArg[0]
e650: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56   );.  assert( pV
e660: 74 61 62 20 29 3b 0a 23 69 66 20 30 0a 20 20 69  tab );.#if 0.  i
e670: 66 28 20 70 54 61 62 2d 3e 70 56 74 61 62 3d 3d  f( pTab->pVtab==
e680: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
e690: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e6a0: 20 22 75 6e 64 65 66 69 6e 65 64 20 6d 6f 64 75   "undefined modu
e6b0: 6c 65 20 25 73 20 66 6f 72 20 74 61 62 6c 65 20  le %s for table 
e6c0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
e6d0: 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30  b->azModuleArg[0
e6e0: 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ], pTab->zName);
e6f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b  .    return 0.0;
e700: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
e710: 2a 20 53 65 74 20 74 68 65 20 61 43 6f 6e 73 74  * Set the aConst
e720: 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66  raint[].usable f
e730: 69 65 6c 64 73 20 61 6e 64 20 69 6e 69 74 69 61  ields and initia
e740: 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f  lize all .  ** o
e750: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
e760: 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  to zero..  **.  
e770: 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  ** aConstraint[]
e780: 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75 65 20  .usable is true 
e790: 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
e7a0: 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
e7b0: 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65 20 63  hand.  ** side c
e7c0: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72 65 66  ontains only ref
e7d0: 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65  erences to table
e7e0: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
e7f0: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
e800: 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68  * table.  In oth
e810: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
e820: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f   constraint is o
e830: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
e840: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
e850: 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a 20 20  column = expr.  
e860: 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61  **.  ** and we a
e870: 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20  re evaluating a 
e880: 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  join, then the c
e890: 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c  onstraint on col
e8a0: 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c  umn is .  ** onl
e8b0: 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 74  y valid if all t
e8c0: 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64  ables referenced
e8d0: 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72 20 74   in expr occur t
e8e0: 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20  o the left.  ** 
e8f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e  of the table con
e900: 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a  taining column..
e910: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 43    **.  ** The aC
e920: 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61 72 72  onstraints[] arr
e930: 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72  ay contains entr
e940: 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73  ies for all cons
e950: 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20  traints.  ** on 
e960: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
e970: 65 2e 20 20 54 68 61 74 20 77 61 79 20 77 65 20  e.  That way we 
e980: 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20 63 6f 6d  only have to com
e990: 70 75 74 65 20 69 74 20 6f 6e 63 65 0a 20 20 2a  pute it once.  *
e9a0: 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 77 65  * even though we
e9b0: 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20 70 69   might try to pi
e9c0: 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  ck the best inde
e9d0: 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  x multiple times
e9e0: 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20  ..  ** For each 
e9f0: 61 74 74 65 6d 70 74 20 61 74 20 70 69 63 6b 69  attempt at picki
ea00: 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  ng an index, the
ea10: 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73   order of tables
ea20: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 69   in the.  ** joi
ea30: 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65  n might be diffe
ea40: 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76 65 20  rent so we have 
ea50: 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
ea60: 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20 20 2a   usable flag.  *
ea70: 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 2a  * each time..  *
ea80: 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a  /.  pIdxCons = *
ea90: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
eaa0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
eab0: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
eac0: 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70 55 73  onstraint;.  pUs
ead0: 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  age = pIdxInfo->
eae0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
eaf0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
eb00: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
eb10: 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
eb20: 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d 20  ons++){.    j = 
eb30: 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
eb40: 66 66 73 65 74 3b 0a 20 20 20 20 70 54 65 72 6d  ffset;.    pTerm
eb50: 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
eb60: 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
eb70: 62 6c 65 20 3d 20 20 28 70 54 65 72 6d 2d 3e 70  ble =  (pTerm->p
eb80: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
eb90: 52 65 61 64 79 29 3d 3d 30 20 3f 31 3a 30 3b 0a  Ready)==0 ?1:0;.
eba0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73    }.  memset(pUs
ebb0: 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
ebc0: 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e  Usage[0])*pIdxIn
ebd0: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29  fo->nConstraint)
ebe0: 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
ebf0: 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
ec00: 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
ec10: 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
ec20: 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20  >idxStr);.  }.  
ec30: 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
ec40: 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
ec50: 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
ec60: 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
ec70: 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
ec80: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
ec90: 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
eca0: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
ecb0: 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
ecc0: 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 32 2e  ITE_BIG_DBL / 2.
ecd0: 30 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  0;.  nOrderBy = 
ece0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
ecf0: 42 79 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  By;.  if( pIdxIn
ed00: 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 26 26 20  fo->nOrderBy && 
ed10: 21 6f 72 64 65 72 42 79 55 73 61 62 6c 65 20 29  !orderByUsable )
ed20: 7b 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49  {.    *(int*)&pI
ed30: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
ed40: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 28 76 6f   = 0;.  }..  (vo
ed50: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
ed60: 4f 66 66 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  Off(pParse->db);
ed70: 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
ed80: 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25  xBestIndex for %
ed90: 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  s\n", pTab->zNam
eda0: 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58  e));.  TRACE_IDX
edb0: 5f 49 4e 50 55 54 53 28 70 49 64 78 49 6e 66 6f  _INPUTS(pIdxInfo
edc0: 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d  );.  rc = pVtab-
edd0: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49  >pModule->xBestI
ede0: 6e 64 65 78 28 70 56 74 61 62 2c 20 70 49 64 78  ndex(pVtab, pIdx
edf0: 49 6e 66 6f 29 3b 0a 20 20 54 52 41 43 45 5f 49  Info);.  TRACE_I
ee00: 44 58 5f 4f 55 54 50 55 54 53 28 70 49 64 78 49  DX_OUTPUTS(pIdxI
ee10: 6e 66 6f 29 3b 0a 20 20 28 76 6f 69 64 29 73 71  nfo);.  (void)sq
ee20: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 50  lite3SafetyOn(pP
ee30: 61 72 73 65 2d 3e 64 62 29 3b 0a 0a 20 20 69 66  arse->db);..  if
ee40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ee50: 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
ee60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
ee70: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
ee80: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
ee90: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
eea0: 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67   !pVtab->zErrMsg
eeb0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
eec0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
eed0: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
eee0: 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20  rrStr(rc));.    
eef0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
ef00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ef10: 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62  rse, "%s", pVtab
ef20: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
ef30: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
ef40: 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
ef50: 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
ef60: 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
ef70: 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  Msg = 0;..  for(
ef80: 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
ef90: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
efa0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 49 64  +){.    if( !pId
efb0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
efc0: 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20  nt[i].usable && 
efd0: 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  pUsage[i].argvIn
efe0: 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  dex>0 ){.      s
eff0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f000: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
f010: 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65    "table %s: xBe
f020: 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64  stIndex returned
f030: 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e   an invalid plan
f040: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
f050: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e  .      return 0.
f060: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
f070: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
f080: 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
f090: 64 65 72 42 79 3b 0a 20 20 72 65 74 75 72 6e 20  derBy;.  return 
f0a0: 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
f0b0: 74 65 64 43 6f 73 74 3b 0a 7d 0a 23 65 6e 64 69  tedCost;.}.#endi
f0c0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
f0d0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
f0e0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
f0f0: 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20   query plan for 
f100: 61 63 63 65 73 73 69 6e 67 20 61 20 70 61 72 74  accessing a part
f110: 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 57  icular table.  W
f120: 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74  rite the.** best
f130: 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20   query plan and 
f140: 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68  its cost into th
f150: 65 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65  e WhereCost obje
f160: 63 74 20 73 75 70 70 6c 69 65 64 20 61 73 20 74  ct supplied as t
f170: 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 72 61 6d  he.** last param
f180: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
f190: 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 6c 61 6e  lowest cost plan
f1a0: 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74   wins.  The cost
f1b0: 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
f1c0: 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  of the amount of
f1d0: 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b  .** CPU and disk
f1e0: 20 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f   I/O need to pro
f1f0: 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74  cess the request
f200: 20 75 73 69 6e 67 20 74 68 65 20 73 65 6c 65 63   using the selec
f210: 74 65 64 20 70 6c 61 6e 2e 0a 2a 2a 20 46 61 63  ted plan..** Fac
f220: 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65  tors that influe
f230: 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65  nce cost include
f240: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68  :.**.**    *  Th
f250: 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
f260: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
f270: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65  will be retrieve
f280: 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20  d.  (The.**     
f290: 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74 74    fewer the bett
f2a0: 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  er.).**.**    * 
f2b0: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
f2c0: 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63  sorting must occ
f2d0: 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  ur..**.**    *  
f2e0: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
f2f0: 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65 70  here must be sep
f300: 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e  arate lookups in
f310: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e   the.**       in
f320: 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d  dex and in the m
f330: 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ain table..**.**
f340: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   If there was an
f350: 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
f360: 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  se attached to t
f370: 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  he table in the 
f380: 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
f390: 65 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ent, then this f
f3a0: 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e  unction only con
f3b0: 73 69 64 65 72 73 20 70 6c 61 6e 73 20 75 73 69  siders plans usi
f3c0: 6e 67 20 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64  ng the .** named
f3d0: 20 69 6e 64 65 78 2e 20 49 66 20 6f 6e 65 20 63   index. If one c
f3e0: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20  annot be found, 
f3f0: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65  then the returne
f400: 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51 4c  d cost is.** SQL
f410: 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66 20  ITE_BIG_DBL. If 
f420: 61 20 70 6c 61 6e 20 63 61 6e 20 62 65 20 66 6f  a plan can be fo
f430: 75 6e 64 20 74 68 61 74 20 75 73 65 73 20 74 68  und that uses th
f440: 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 2c 20 0a  e named index, .
f450: 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 6f 73 74  ** then the cost
f460: 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 69   is calculated i
f470: 6e 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 2e  n the usual way.
f480: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4e 4f 54 20  .**.** If a NOT 
f490: 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 77  INDEXED clause w
f4a0: 61 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  as attached to t
f4b0: 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  he table in the 
f4c0: 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65  SELECT .** state
f4d0: 6d 65 6e 74 2c 20 74 68 65 6e 20 6e 6f 20 69 6e  ment, then no in
f4e0: 64 65 78 65 73 20 61 72 65 20 63 6f 6e 73 69 64  dexes are consid
f4f0: 65 72 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 74  ered. However, t
f500: 68 65 20 73 65 6c 65 63 74 65 64 20 0a 2a 2a 20  he selected .** 
f510: 70 6c 61 6e 20 6d 61 79 20 73 74 69 6c 6c 20 74  plan may still t
f520: 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
f530: 20 74 68 65 20 74 61 62 6c 65 73 20 62 75 69 6c   the tables buil
f540: 74 2d 69 6e 20 72 6f 77 69 64 0a 2a 2a 20 69 6e  t-in rowid.** in
f550: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
f560: 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20  oid bestIndex(. 
f570: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f590: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
f5a0: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
f5b0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
f5c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
f5d0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
f5e0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
f5f0: 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65  m *pSrc,  /* The
f600: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
f610: 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
f620: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
f630: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
f640: 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
f650: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61  that are not ava
f660: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72  ilable */.  Expr
f670: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
f680: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
f690: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
f6a0: 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70  /.  WhereCost *p
f6b0: 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20 20  Cost            
f6c0: 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71  /* Lowest cost q
f6d0: 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a  uery plan */.){.
f6e0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
f6f0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
f700: 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
f710: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
f720: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  se */.  int iCur
f730: 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72   = pSrc->iCursor
f740: 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ;   /* The curso
f750: 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  r of the table t
f760: 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f  o be accessed */
f770: 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
f780: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
f790: 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72  * An index we ar
f7a0: 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a  e evaluating */.
f7b0: 20 20 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20    int rev;      
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f7d0: 20 54 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e   True to scan in
f7e0: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
f7f0: 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b  /.  int wsFlags;
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61  /* Flags associa
f820: 74 65 64 20 77 69 74 68 20 70 50 72 6f 62 65 20  ted with pProbe 
f830: 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20  */.  int nEq;   
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
f860: 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
f870: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65  ts */.  int eqTe
f880: 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rmMask;         
f890: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76      /* Mask of v
f8a0: 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70  alid equality op
f8b0: 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 64 6f 75  erators */.  dou
f8c0: 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20  ble cost;       
f8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
f8e0: 20 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65   of using pProbe
f8f0: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f   */.  double nRo
f900: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
f910: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
f920: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
f930: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
f940: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f960: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
f970: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 72    Bitmask maskSr
f980: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
f990: 20 42 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   Bitmask for the
f9a0: 20 70 53 72 63 20 74 61 62 6c 65 20 2a 2f 0a 0a   pSrc table */..
f9b0: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 62    WHERETRACE(("b
f9c0: 65 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73  estIndex: tbl=%s
f9d0: 20 6e 6f 74 52 65 61 64 79 3d 25 6c 6c 78 5c 6e   notReady=%llx\n
f9e0: 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a  ", pSrc->pTab->z
f9f0: 4e 61 6d 65 2c 6e 6f 74 52 65 61 64 79 29 29 3b  Name,notReady));
fa00: 0a 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63  .  pProbe = pSrc
fa10: 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
fa20: 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49    if( pSrc->notI
fa30: 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20 70 50  ndexed ){.    pP
fa40: 72 6f 62 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  robe = 0;.  }.. 
fa50: 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
fa60: 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 20   has no indices 
fa70: 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
fa80: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68   terms in the wh
fa90: 65 72 65 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20  ere.  ** clause 
faa0: 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
fab0: 65 20 52 4f 57 49 44 2c 20 74 68 65 6e 20 77 65  e ROWID, then we
fac0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61   will never be a
fad0: 62 6c 65 20 74 6f 20 64 6f 0a 20 20 2a 2a 20 61  ble to do.  ** a
fae0: 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
faf0: 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  an a full table 
fb00: 73 63 61 6e 20 6f 6e 20 74 68 69 73 20 74 61 62  scan on this tab
fb10: 6c 65 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73  le.  We might as
fb20: 0a 20 20 2a 2a 20 77 65 6c 6c 20 70 75 74 20 69  .  ** well put i
fb30: 74 20 66 69 72 73 74 20 69 6e 20 74 68 65 20 6a  t first in the j
fb40: 6f 69 6e 20 6f 72 64 65 72 2e 20 20 54 68 61 74  oin order.  That
fb50: 20 77 61 79 2c 20 70 65 72 68 61 70 73 20 69 74   way, perhaps it
fb60: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 72 65 66   can be.  ** ref
fb70: 65 72 65 6e 63 65 64 20 62 79 20 6f 74 68 65 72  erenced by other
fb80: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
fb90: 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  oin..  */.  mems
fba0: 65 74 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a  et(pCost, 0, siz
fbb0: 65 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20  eof(*pCost));.  
fbc0: 69 66 28 20 70 50 72 6f 62 65 3d 3d 30 20 26 26  if( pProbe==0 &&
fbd0: 0a 20 20 20 20 20 66 69 6e 64 54 65 72 6d 28 70  .     findTerm(p
fbe0: 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c  WC, iCur, -1, 0,
fbf0: 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
fc00: 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
fc10: 4f 5f 47 45 2c 30 29 3d 3d 30 20 26 26 0a 20 20  O_GE,0)==0 &&.  
fc20: 20 20 20 28 70 4f 72 64 65 72 42 79 3d 3d 30 20     (pOrderBy==0 
fc30: 7c 7c 20 21 73 6f 72 74 61 62 6c 65 42 79 52 6f  || !sortableByRo
fc40: 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72  wid(iCur, pOrder
fc50: 42 79 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65  By, pWC->pMaskSe
fc60: 74 2c 20 26 72 65 76 29 29 20 29 7b 0a 20 20 20  t, &rev)) ){.   
fc70: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
fc80: 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 53 51  Cost->rCost = SQ
fc90: 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20  LITE_BIG_DBL;.. 
fca0: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20   /* Check for a 
fcb0: 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f  rowid=EXPR or ro
fcc0: 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e  wid IN (...) con
fcd0: 73 74 72 61 69 6e 74 73 2e 20 49 66 20 74 68 65  straints. If the
fce0: 72 65 20 77 61 73 0a 20 20 2a 2a 20 61 6e 20 49  re was.  ** an I
fcf0: 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
fd00: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
fd10: 73 20 74 61 62 6c 65 2c 20 73 6b 69 70 20 74 68  s table, skip th
fd20: 69 73 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  is step..  */.  
fd30: 69 66 28 20 21 70 53 72 63 2d 3e 70 49 6e 64 65  if( !pSrc->pInde
fd40: 78 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 20 3d  x ){.    pTerm =
fd50: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
fd60: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
fd70: 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
fd80: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  0);.    if( pTer
fd90: 6d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  m ){.      Expr 
fda0: 2a 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 43  *pExpr;.      pC
fdb0: 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
fdc0: 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s = WHERE_ROWID_
fdd0: 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  EQ;.      if( pT
fde0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fdf0: 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20   WO_EQ ){.      
fe00: 20 20 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20    /* Rowid== is 
fe10: 61 6c 77 61 79 73 20 74 68 65 20 62 65 73 74 20  always the best 
fe20: 70 69 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66  pick.  Look no f
fe30: 75 72 74 68 65 72 2e 20 20 42 65 63 61 75 73 65  urther.  Because
fe40: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a   only.        **
fe50: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 73   a single row is
fe60: 20 67 65 6e 65 72 61 74 65 64 2c 20 6f 75 74 70   generated, outp
fe70: 75 74 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20  ut is always in 
fe80: 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a  sorted order */.
fe90: 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70          pCost->p
fea0: 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48  lan.wsFlags = WH
feb0: 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57  ERE_ROWID_EQ | W
fec0: 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20  HERE_UNIQUE;.   
fed0: 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
fee0: 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  .nEq = 1;.      
fef0: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
ff00: 2e 2e 20 62 65 73 74 20 69 73 20 72 6f 77 69 64  .. best is rowid
ff10: 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70  \n"));.        p
ff20: 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 30 3b  Cost->rCost = 0;
ff30: 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
ff40: 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRow = 1;.      
ff50: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
ff60: 7d 65 6c 73 65 20 69 66 28 20 28 70 45 78 70 72  }else if( (pExpr
ff70: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29   = pTerm->pExpr)
ff80: 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20  ->pList!=0 ){.  
ff90: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49        /* Rowid I
ffa0: 4e 20 28 4c 49 53 54 29 3a 20 63 6f 73 74 20 69  N (LIST): cost i
ffb0: 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20  s NlogN where N 
ffc0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
ffd0: 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20 2a 2a   list.        **
ffe0: 20 65 6c 65 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20   elements.  */. 
fff0: 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43         pCost->rC
10000 6f 73 74 20 3d 20 70 43 6f 73 74 2d 3e 6e 52 6f  ost = pCost->nRo
10010 77 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  w = pExpr->pList
10020 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
10030 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 2a 3d   pCost->rCost *=
10040 20 65 73 74 4c 6f 67 28 70 43 6f 73 74 2d 3e 72   estLog(pCost->r
10050 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Cost);.      }el
10060 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  se{.        /* R
10070 6f 77 69 64 20 49 4e 20 28 53 45 4c 45 43 54 29  owid IN (SELECT)
10080 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20  : cost is NlogN 
10090 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
100a0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20  umber of rows.  
100b0 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
100c0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 69 6e  result of the in
100d0 6e 65 72 20 73 65 6c 65 63 74 2e 20 20 57 65 20  ner select.  We 
100e0 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 65  have no way to e
100f0 73 74 69 6d 61 74 65 0a 20 20 20 20 20 20 20 20  stimate.        
10100 2a 2a 20 74 68 61 74 20 76 61 6c 75 65 20 73 6f  ** that value so
10110 20 6d 61 6b 65 20 61 20 77 69 6c 64 20 67 75 65   make a wild gue
10120 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ss. */.        p
10130 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 31 30 30  Cost->nRow = 100
10140 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  ;.        pCost-
10150 3e 72 43 6f 73 74 20 3d 20 32 30 30 3b 0a 20 20  >rCost = 200;.  
10160 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52      }.      WHER
10170 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77  ETRACE(("... row
10180 69 64 20 49 4e 20 63 6f 73 74 3a 20 25 2e 39 67  id IN cost: %.9g
10190 5c 6e 22 2c 20 70 43 6f 73 74 2d 3e 72 43 6f 73  \n", pCost->rCos
101a0 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  t));.    }.  .  
101b0 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68    /* Estimate th
101c0 65 20 63 6f 73 74 20 6f 66 20 61 20 74 61 62 6c  e cost of a tabl
101d0 65 20 73 63 61 6e 2e 20 20 49 66 20 77 65 20 64  e scan.  If we d
101e0 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 6d  o not know how m
101f0 61 6e 79 0a 20 20 20 20 2a 2a 20 65 6e 74 72 69  any.    ** entri
10200 65 73 20 61 72 65 20 69 6e 20 74 68 65 20 74 61  es are in the ta
10210 62 6c 65 2c 20 75 73 65 20 31 20 6d 69 6c 6c 69  ble, use 1 milli
10220 6f 6e 20 61 73 20 61 20 67 75 65 73 73 2e 0a 20  on as a guess.. 
10230 20 20 20 2a 2f 0a 20 20 20 20 63 6f 73 74 20 3d     */.    cost =
10240 20 70 50 72 6f 62 65 20 3f 20 70 50 72 6f 62 65   pProbe ? pProbe
10250 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20  ->aiRowEst[0] : 
10260 31 30 30 30 30 30 30 3b 0a 20 20 20 20 57 48 45  1000000;.    WHE
10270 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 74 61  RETRACE(("... ta
10280 62 6c 65 20 73 63 61 6e 20 62 61 73 65 20 63 6f  ble scan base co
10290 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73  st: %.9g\n", cos
102a0 74 29 29 3b 0a 20 20 20 20 77 73 46 6c 61 67 73  t));.    wsFlags
102b0 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52   = WHERE_ROWID_R
102c0 41 4e 47 45 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ANGE;.  .    /* 
102d0 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 73 74 72  Check for constr
102e0 61 69 6e 74 73 20 6f 6e 20 61 20 72 61 6e 67 65  aints on a range
102f0 20 6f 66 20 72 6f 77 69 64 73 20 69 6e 20 61 20   of rowids in a 
10300 74 61 62 6c 65 20 73 63 61 6e 2e 0a 20 20 20 20  table scan..    
10310 2a 2f 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66  */.    pTerm = f
10320 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
10330 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
10340 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f   WO_LT|WO_LE|WO_
10350 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20  GT|WO_GE, 0);.  
10360 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
10370 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72       if( findTer
10380 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
10390 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
103a0 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20  |WO_LE, 0) ){.  
103b0 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
103c0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
103d0 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f  ;.        cost /
103e0 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74  = 3;  /* Guess t
103f0 68 61 74 20 72 6f 77 69 64 3c 45 58 50 52 20 65  hat rowid<EXPR e
10400 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68  liminates two-th
10410 69 72 64 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a  irds of rows */.
10420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10430 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
10440 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
10450 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
10460 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 77   0) ){.        w
10470 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
10480 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
10490 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f     cost /= 3;  /
104a0 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77  * Guess that row
104b0 69 64 3e 45 58 50 52 20 65 6c 69 6d 69 6e 61 74  id>EXPR eliminat
104c0 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 66  es two-thirds of
104d0 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 7d   rows */.      }
104e0 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
104f0 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20 72 61  E(("... rowid ra
10500 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f 73 74  nge reduces cost
10510 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73   to %.9g\n", cos
10520 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t));.    }else{.
10530 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20        wsFlags = 
10540 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 6f  0;.    }.    nRo
10550 77 20 3d 20 63 6f 73 74 3b 0a 20 20 0a 20 20 20  w = cost;.  .   
10560 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
10570 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73   scan does not s
10580 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
10590 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72   BY clause, incr
105a0 65 61 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ease.    ** the 
105b0 63 6f 73 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f  cost by NlogN to
105c0 20 63 6f 76 65 72 20 74 68 65 20 65 78 70 65 6e   cover the expen
105d0 73 65 20 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a  se of sorting. *
105e0 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  /.    if( pOrder
105f0 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  By ){.      if( 
10600 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28  sortableByRowid(
10610 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  iCur, pOrderBy, 
10620 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 26  pWC->pMaskSet, &
10630 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rev) ){.        
10640 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
10650 5f 4f 52 44 45 52 42 59 7c 57 48 45 52 45 5f 52  _ORDERBY|WHERE_R
10660 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 20 20 20 20  OWID_RANGE;.    
10670 20 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20      if( rev ){. 
10680 20 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73           wsFlags
10690 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53   |= WHERE_REVERS
106a0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
106b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
106c0 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65    cost += cost*e
106d0 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20  stLog(cost);.   
106e0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
106f0 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e  ("... sorting in
10700 63 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20  creases cost to 
10710 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
10720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10730 20 20 20 69 66 28 20 63 6f 73 74 3c 70 43 6f 73     if( cost<pCos
10740 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20  t->rCost ){.    
10750 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
10760 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70 43 6f   cost;.      pCo
10770 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b  st->nRow = nRow;
10780 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  .      pCost->pl
10790 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 77 73 46  an.wsFlags = wsF
107a0 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lags;.    }.  }.
107b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
107c0 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
107d0 54 49 4f 4e 0a 20 20 2f 2a 20 53 65 61 72 63 68  TION.  /* Search
107e0 20 66 6f 72 20 61 6e 20 4f 52 2d 63 6c 61 75 73   for an OR-claus
107f0 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  e that can be us
10800 65 64 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 74 68  ed to look up th
10810 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e table..  */.  
10820 6d 61 73 6b 53 72 63 20 3d 20 67 65 74 4d 61 73  maskSrc = getMas
10830 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  k(pWC->pMaskSet,
10840 20 69 43 75 72 29 3b 0a 20 20 66 6f 72 28 69 3d   iCur);.  for(i=
10850 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
10860 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
10870 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
10880 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65    WhereClause te
10890 6d 70 57 43 3b 0a 20 20 20 20 74 65 6d 70 57 43  mpWC;.    tempWC
108a0 20 3d 20 2a 70 57 43 3b 0a 20 20 20 20 69 66 28   = *pWC;.    if(
108b0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
108c0 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20 20 20 20  r==WO_OR .      
108d0 20 20 26 26 20 28 28 70 54 65 72 6d 2d 3e 70 72    && ((pTerm->pr
108e0 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53  ereqAll & ~maskS
108f0 72 63 29 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  rc) & notReady)=
10900 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 28 70  =0.        && (p
10910 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
10920 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 6d 61 73  >indexable & mas
10930 6b 53 72 63 29 21 3d 30 20 29 7b 0a 20 20 20 20  kSrc)!=0 ){.    
10940 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
10950 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75  OrWC = &pTerm->u
10960 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  .pOrInfo->wc;.  
10970 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
10980 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
10990 74 20 6a 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  t j;.      doubl
109a0 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  e rTotal = 0;.  
109b0 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 20      double nRow 
109c0 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  = 0;.      for(j
109d0 3d 30 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  =0, pOrTerm=pOrW
109e0 43 2d 3e 61 3b 20 6a 3c 70 4f 72 57 43 2d 3e 6e  C->a; j<pOrWC->n
109f0 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 4f 72 54 65  Term; j++, pOrTe
10a00 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 57  rm++){.        W
10a10 68 65 72 65 43 6f 73 74 20 73 54 65 72 6d 43 6f  hereCost sTermCo
10a20 73 74 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52  st;.        WHER
10a30 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 4d 75 6c  ETRACE(("... Mul
10a40 74 69 2d 69 6e 64 65 78 20 4f 52 20 74 65 73 74  ti-index OR test
10a50 69 6e 67 20 66 6f 72 20 74 65 72 6d 20 25 64 20  ing for term %d 
10a60 6f 66 20 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 6a 2c  of %d....\n", j,
10a70 69 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  i));.        if(
10a80 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
10a90 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20  tor==WO_AND ){. 
10aa0 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c           WhereCl
10ab0 61 75 73 65 20 2a 70 41 6e 64 57 43 20 3d 20 26  ause *pAndWC = &
10ac0 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
10ad0 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20  nfo->wc;.       
10ae0 20 20 20 62 65 73 74 49 6e 64 65 78 28 70 50 61     bestIndex(pPa
10af0 72 73 65 2c 20 70 41 6e 64 57 43 2c 20 70 53 72  rse, pAndWC, pSr
10b00 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 30 2c 20  c, notReady, 0, 
10b10 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20  &sTermCost);.   
10b20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
10b30 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
10b40 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20  or==iCur ){.    
10b50 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d        tempWC.a =
10b60 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20   pOrTerm;.      
10b70 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d      tempWC.nTerm
10b80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
10b90 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  bestIndex(pParse
10ba0 2c 20 26 74 65 6d 70 57 43 2c 20 70 53 72 63 2c  , &tempWC, pSrc,
10bb0 20 6e 6f 74 52 65 61 64 79 2c 20 30 2c 20 26 73   notReady, 0, &s
10bc0 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20  TermCost);.     
10bd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10be0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
10bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10c00 69 66 28 20 73 54 65 72 6d 43 6f 73 74 2e 70 6c  if( sTermCost.pl
10c10 61 6e 2e 77 73 46 6c 61 67 73 3d 3d 30 20 29 7b  an.wsFlags==0 ){
10c20 0a 20 20 20 20 20 20 20 20 20 20 72 54 6f 74 61  .          rTota
10c30 6c 20 3d 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74  l = pCost->rCost
10c40 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
10c50 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
10c60 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73       rTotal += s
10c70 54 65 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b 0a  TermCost.rCost;.
10c80 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20          nRow += 
10c90 73 54 65 72 6d 43 6f 73 74 2e 6e 52 6f 77 3b 0a  sTermCost.nRow;.
10ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48        }.      WH
10cb0 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d  ERETRACE(("... m
10cc0 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f  ulti-index OR co
10cd0 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39  st=%.9g nrow=%.9
10ce0 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  g\n",.          
10cf0 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 2c 20          rTotal, 
10d00 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 69 66  nRow));.      if
10d10 28 20 72 54 6f 74 61 6c 3c 70 43 6f 73 74 2d 3e  ( rTotal<pCost->
10d20 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rCost ){.       
10d30 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20   pCost->rCost = 
10d40 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20  rTotal;.        
10d50 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52  pCost->nRow = nR
10d60 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73  ow;.        pCos
10d70 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
10d80 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
10d90 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  ;.        pCost-
10da0 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 20 3d 20  >plan.u.pTerm = 
10db0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
10dc0 66 28 20 70 4f 72 64 65 72 42 79 21 3d 30 0a 20  f( pOrderBy!=0. 
10dd0 20 20 20 20 20 20 20 20 26 26 20 73 6f 72 74 61          && sorta
10de0 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c  bleByRowid(iCur,
10df0 20 70 4f 72 64 65 72 42 79 2c 20 70 57 43 2d 3e   pOrderBy, pWC->
10e00 70 4d 61 73 6b 53 65 74 2c 20 26 72 65 76 29 0a  pMaskSet, &rev).
10e10 20 20 20 20 20 20 20 20 20 26 26 20 21 72 65 76           && !rev
10e20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
10e30 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
10e40 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  n.wsFlags = WHER
10e50 45 5f 4f 52 44 45 52 42 59 7c 57 48 45 52 45 5f  E_ORDERBY|WHERE_
10e60 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20  MULTI_OR;.      
10e70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10e80 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
10e90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
10ea0 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
10eb0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 53 72 63    /* If the pSrc
10ec0 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 69   table is the ri
10ed0 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
10ee0 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65  EFT JOIN then we
10ef0 20 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73   may not.  ** us
10f00 65 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 73 61  e an index to sa
10f10 74 69 73 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f  tisfy IS NULL co
10f20 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 61  nstraints on tha
10f30 74 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69  t table.  This i
10f40 73 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 63  s.  ** because c
10f50 6f 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64  olumns might end
10f60 20 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69   up being NULL i
10f70 66 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73  f the table does
10f80 20 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a   not match -.  *
10f90 2a 20 61 20 63 69 72 63 75 6d 73 74 61 6e 63 65  * a circumstance
10fa0 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78   which the index
10fb0 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20   cannot help us 
10fc0 64 69 73 63 6f 76 65 72 2e 20 20 54 69 63 6b 65  discover.  Ticke
10fd0 74 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20  t #2177..  */.  
10fe0 69 66 28 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74  if( (pSrc->joint
10ff0 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
11000 30 20 29 7b 0a 20 20 20 20 65 71 54 65 72 6d 4d  0 ){.    eqTermM
11010 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
11020 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  N;.  }else{.    
11030 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  eqTermMask = WO_
11040 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
11050 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  LL;.  }..  /* Lo
11060 6f 6b 20 61 74 20 65 61 63 68 20 69 6e 64 65 78  ok at each index
11070 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  ..  */.  if( pSr
11080 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  c->pIndex ){.   
11090 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
110a0 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 66 6f  pIndex;.  }.  fo
110b0 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 50 72 6f  r(; pProbe; pPro
110c0 62 65 3d 28 70 53 72 63 2d 3e 70 49 6e 64 65 78  be=(pSrc->pIndex
110d0 20 3f 20 30 20 3a 20 70 50 72 6f 62 65 2d 3e 70   ? 0 : pProbe->p
110e0 4e 65 78 74 29 29 7b 0a 20 20 20 20 69 6e 74 20  Next)){.    int 
110f0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11100 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
11110 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
11120 64 6f 75 62 6c 65 20 69 6e 4d 75 6c 74 69 70 6c  double inMultipl
11130 69 65 72 20 3d 20 31 3b 0a 0a 20 20 20 20 57 48  ier = 1;..    WH
11140 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 69  ERETRACE(("... i
11150 6e 64 65 78 20 25 73 3a 5c 6e 22 2c 20 70 50 72  ndex %s:\n", pPr
11160 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  obe->zName));.. 
11170 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20     /* Count the 
11180 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
11190 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74  s in the index t
111a0 68 61 74 20 61 72 65 20 73 61 74 69 73 66 69 65  hat are satisfie
111b0 64 0a 20 20 20 20 2a 2a 20 62 79 20 78 3d 45 58  d.    ** by x=EX
111c0 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  PR constraints o
111d0 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e  r x IN (...) con
111e0 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f  straints..    */
111f0 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20 30  .    wsFlags = 0
11200 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
11210 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
11220 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
11230 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t j = pProbe->ai
11240 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
11250 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
11260 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
11270 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65 72 6d  notReady, eqTerm
11280 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20  Mask, pProbe);. 
11290 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
112a0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
112b0 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
112c0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20  E_COLUMN_EQ;.   
112d0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
112e0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
112f0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
11300 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
11310 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 77  pExpr;.        w
11320 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
11330 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20  COLUMN_IN;.     
11340 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
11350 65 6c 65 63 74 21 3d 30 20 29 7b 0a 20 20 20 20  elect!=0 ){.    
11360 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69        inMultipli
11370 65 72 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20  er *= 25;.      
11380 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
11390 59 53 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  YS(pExpr->pList)
113a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
113b0 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70 45  Multiplier *= pE
113c0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
113d0 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  r + 1;.        }
113e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
113f0 20 20 20 6e 52 6f 77 20 3d 20 70 50 72 6f 62 65     nRow = pProbe
11400 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20  ->aiRowEst[i] * 
11410 69 6e 4d 75 6c 74 69 70 6c 69 65 72 3b 0a 20 20  inMultiplier;.  
11420 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
11430 65 73 74 4c 6f 67 28 69 6e 4d 75 6c 74 69 70 6c  estLog(inMultipl
11440 69 65 72 29 3b 0a 20 20 20 20 6e 45 71 20 3d 20  ier);.    nEq = 
11450 69 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  i;.    if( pProb
11460 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  e->onError!=OE_N
11470 6f 6e 65 20 26 26 20 28 77 73 46 6c 61 67 73 20  one && (wsFlags 
11480 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
11490 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  N)==0.         &
114a0 26 20 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e  & nEq==pProbe->n
114b0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
114c0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
114d0 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20  _UNIQUE;.    }. 
114e0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
114f0 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64 20 69 6e  ...... nEq=%d in
11500 4d 75 6c 74 3d 25 2e 39 67 20 63 6f 73 74 3d 25  Mult=%.9g cost=%
11510 2e 39 67 5c 6e 22 2c 6e 45 71 2c 69 6e 4d 75 6c  .9g\n",nEq,inMul
11520 74 69 70 6c 69 65 72 2c 63 6f 73 74 29 29 3b 0a  tiplier,cost));.
11530 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  .    /* Look for
11540 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
11550 74 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ts.    */.    if
11560 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43  ( nEq<pProbe->nC
11570 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69  olumn ){.      i
11580 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt j = pProbe->a
11590 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20  iColumn[nEq];.  
115a0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
115b0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
115c0 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
115d0 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
115e0 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 3b 0a 20  O_GE, pProbe);. 
115f0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 20 29       if( pTerm )
11600 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67  {.        wsFlag
11610 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
11620 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20  N_RANGE;.       
11630 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
11640 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
11650 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
11660 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20  E, pProbe) ){.  
11670 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
11680 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  |= WHERE_TOP_LIM
11690 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  IT;.          co
116a0 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20  st /= 3;.       
116b0 20 20 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20     nRow /= 3;.  
116c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
116d0 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
116e0 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
116f0 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
11700 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20  , pProbe) ){.   
11710 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
11720 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  = WHERE_BTM_LIMI
11730 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73  T;.          cos
11740 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  t /= 3;.        
11750 20 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20    nRow /= 3;.   
11760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57       }.        W
11770 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e  HERETRACE(("....
11780 2e 2e 20 72 61 6e 67 65 20 72 65 64 75 63 65 73  .. range reduces
11790 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22   cost to %.9g\n"
117a0 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20  , cost));.      
117b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
117c0 41 64 64 20 74 68 65 20 61 64 64 69 74 69 6f 6e  Add the addition
117d0 61 6c 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  al cost of sorti
117e0 6e 67 20 69 66 20 74 68 61 74 20 69 73 20 61 20  ng if that is a 
117f0 66 61 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  factor..    */. 
11800 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
11810 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 77 73  ){.      if( (ws
11820 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
11830 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26 0a 20  LUMN_IN)==0 &&. 
11840 20 20 20 20 20 20 20 20 20 20 69 73 53 6f 72 74            isSort
11850 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ingIndex(pParse,
11860 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 70 50  pWC->pMaskSet,pP
11870 72 6f 62 65 2c 69 43 75 72 2c 70 4f 72 64 65 72  robe,iCur,pOrder
11880 42 79 2c 6e 45 71 2c 26 72 65 76 29 20 29 7b 0a  By,nEq,&rev) ){.
11890 20 20 20 20 20 20 20 20 69 66 28 20 77 73 46 6c          if( wsFl
118a0 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ags==0 ){.      
118b0 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20 57 48      wsFlags = WH
118c0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
118d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
118e0 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
118f0 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20  HERE_ORDERBY;.  
11900 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b        if( rev ){
11910 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c 61  .          wsFla
11920 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
11930 52 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  RSE;.        }. 
11940 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11950 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74      cost += cost
11960 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20  *estLog(cost);. 
11970 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
11980 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72  E(("...... order
11990 62 79 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73  by increases cos
119a0 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
119b0 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st));.      }.  
119c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
119d0 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 63  k to see if we c
119e0 61 6e 20 67 65 74 20 61 77 61 79 20 77 69 74 68  an get away with
119f0 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20   using just the 
11a00 69 6e 64 65 78 20 77 69 74 68 6f 75 74 0a 20 20  index without.  
11a10 20 20 2a 2a 20 65 76 65 72 20 72 65 61 64 69 6e    ** ever readin
11a20 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66  g the table.  If
11a30 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
11a40 65 2c 20 74 68 65 6e 20 68 61 6c 76 65 20 74 68  e, then halve th
11a50 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66  e.    ** cost of
11a60 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 20   this index..   
11a70 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 73 46 6c   */.    if( wsFl
11a80 61 67 73 20 26 26 20 70 53 72 63 2d 3e 63 6f 6c  ags && pSrc->col
11a90 55 73 65 64 20 3c 20 28 28 28 42 69 74 6d 61 73  Used < (((Bitmas
11aa0 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29  k)1)<<(BMS-1)) )
11ab0 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
11ac0 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
11ad0 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  d;.      int j;.
11ae0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
11af0 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
11b00 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
11b10 69 6e 74 20 78 20 3d 20 70 50 72 6f 62 65 2d 3e  int x = pProbe->
11b20 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
11b30 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31       if( x<BMS-1
11b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20   ){.          m 
11b50 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31  &= ~(((Bitmask)1
11b60 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  )<<x);.        }
11b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11b80 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( m==0 ){.     
11b90 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
11ba0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
11bb0 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 32 3b        cost /= 2;
11bc0 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
11bd0 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78  ACE(("...... idx
11be0 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73 20 63 6f  -only reduces co
11bf0 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
11c00 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
11c10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
11c20 74 68 69 73 20 69 6e 64 65 78 20 68 61 73 20 61  this index has a
11c30 63 68 69 65 76 65 64 20 74 68 65 20 6c 6f 77 65  chieved the lowe
11c40 73 74 20 63 6f 73 74 20 73 6f 20 66 61 72 2c 20  st cost so far, 
11c50 74 68 65 6e 20 75 73 65 20 69 74 2e 0a 20 20 20  then use it..   
11c60 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 73 46 6c   */.    if( wsFl
11c70 61 67 73 21 3d 30 20 26 26 20 63 6f 73 74 20 3c  ags!=0 && cost <
11c80 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b   pCost->rCost ){
11c90 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43  .      pCost->rC
11ca0 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20  ost = cost;.    
11cb0 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20    pCost->nRow = 
11cc0 6e 52 6f 77 3b 0a 20 20 20 20 20 20 70 43 6f 73  nRow;.      pCos
11cd0 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
11ce0 3d 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20  = wsFlags;.     
11cf0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71   pCost->plan.nEq
11d00 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 61 73   = nEq;.      as
11d10 73 65 72 74 28 20 70 43 6f 73 74 2d 3e 70 6c 61  sert( pCost->pla
11d20 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
11d30 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 20  E_INDEXED );.   
11d40 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75     pCost->plan.u
11d50 2e 70 49 64 78 20 3d 20 70 50 72 6f 62 65 3b 0a  .pIdx = pProbe;.
11d60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11d70 52 65 70 6f 72 74 20 74 68 65 20 62 65 73 74 20  Report the best 
11d80 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20 70 43  result.  */.  pC
11d90 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
11da0 73 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b  s |= eqTermMask;
11db0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
11dc0 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 25 73  best index is %s
11dd0 2c 20 63 6f 73 74 3d 25 2e 39 67 2c 20 6e 72 6f  , cost=%.9g, nro
11de0 77 3d 25 2e 39 67 2c 20 77 73 46 6c 61 67 73 3d  w=%.9g, wsFlags=
11df0 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20  %x, nEq=%d\n",. 
11e00 20 20 20 20 20 20 20 28 70 43 6f 73 74 2d 3e 70         (pCost->p
11e10 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
11e20 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
11e30 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ?.             p
11e40 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  Cost->plan.u.pId
11e50 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e  x->zName : "(non
11e60 65 29 22 2c 20 70 43 6f 73 74 2d 3e 6e 52 6f 77  e)", pCost->nRow
11e70 2c 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  ,.        pCost-
11e80 3e 72 43 6f 73 74 2c 20 70 43 6f 73 74 2d 3e 70  >rCost, pCost->p
11e90 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70 43 6f  lan.wsFlags, pCo
11ea0 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 29 29 3b 0a  st->plan.nEq));.
11eb0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  }.../*.** Disabl
11ec0 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  e a term in the 
11ed0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45  WHERE clause.  E
11ee0 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69  xcept, do not di
11ef0 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a  sable the term.*
11f00 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73  * if it controls
11f10 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
11f20 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f  IN and it did no
11f30 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
11f40 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e  he ON.** or USIN
11f50 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  G clause of that
11f60 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   join..**.** Con
11f70 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74  sider the term t
11f80 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20  2.z='ok' in the 
11f90 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65  following querie
11fa0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  s:.**.**   (1)  
11fb0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
11fc0 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
11fd0 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45   t1.a=t2.x WHERE
11fe0 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
11ff0 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (2)  SELECT * FR
12000 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
12010 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
12020 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
12030 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a     (3)  SELECT *
12040 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
12050 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  RE t1.a=t2.x AND
12060 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a   t2.z='ok'.**.**
12070 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69   The t2.z='ok' i
12080 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
12090 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65  e in (2) because
120a0 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a   it originates.*
120b0 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  * in the ON clau
120c0 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73  se.  The term is
120d0 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29   disabled in (3)
120e0 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
120f0 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20  ot part.** of a 
12100 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e  LEFT OUTER JOIN.
12110 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65    In (1), the te
12120 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c  rm is not disabl
12130 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c  ed..**.** Disabl
12140 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65  ing a term cause
12150 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e  s that term to n
12160 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20  ot be tested in 
12170 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
12180 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
12190 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20  Disabling is an 
121a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57  optimization.  W
121b0 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61  hen terms are sa
121c0 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e  tisfied.** by in
121d0 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c  dices, we disabl
121e0 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e  e them to preven
121f0 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74  t redundant test
12200 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a  s in the inner.*
12210 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c  * loop.  We woul
12220 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63  d get the correc
12230 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74  t results if not
12240 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64  hing were ever d
12250 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20  isabled,.** but 
12260 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20  joins might run 
12270 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
12280 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74    The trick is t
12290 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63  o disable as muc
122a0 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77  h.** as we can w
122b0 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67  ithout disabling
122c0 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77   too much.  If w
122d0 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31  e disabled in (1
122e0 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74  ), we'd get.** t
122f0 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e  he wrong answer.
12300 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31    See ticket #81
12310 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  3..*/.static voi
12320 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68  d disableTerm(Wh
12330 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
12340 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  , WhereTerm *pTe
12350 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d  rm){.  if( pTerm
12360 0a 20 20 20 20 20 20 26 26 20 41 4c 57 41 59 53  .      && ALWAYS
12370 28 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ((pTerm->wtFlags
12380 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
12390 30 29 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65  0).      && (pLe
123a0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d  vel->iLeftJoin==
123b0 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  0 || ExprHasProp
123c0 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
123d0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
123e0 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  .  ){.    pTerm-
123f0 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
12400 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20  _CODED;.    if( 
12410 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d  pTerm->iParent>=
12420 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  0 ){.      Where
12430 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26  Term *pOther = &
12440 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54  pTerm->pWC->a[pT
12450 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20  erm->iParent];. 
12460 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68       if( (--pOth
12470 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29  er->nChild)==0 )
12480 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  {.        disabl
12490 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f  eTerm(pLevel, pO
124a0 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ther);.      }. 
124b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
124c0 2a 20 41 70 70 6c 79 20 74 68 65 20 61 66 66 69  * Apply the affi
124d0 6e 69 74 69 65 73 20 61 73 73 6f 63 69 61 74 65  nities associate
124e0 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
124f0 20 6e 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e   n columns of in
12500 64 65 78 0a 2a 2a 20 70 49 64 78 20 74 6f 20 74  dex.** pIdx to t
12510 68 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  he values in the
12520 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   n registers sta
12530 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 0a 2a  rting at base..*
12540 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
12550 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
12560 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
12570 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20  nt base, int n, 
12580 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
12590 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 56  if( n>0 ){.    V
125a0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
125b0 3e 70 56 64 62 65 3b 0a 20 20 20 20 61 73 73 65  >pVdbe;.    asse
125c0 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20  rt( v!=0 );.    
125d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
125e0 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  2(v, OP_Affinity
125f0 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20  , base, n);.    
12600 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
12610 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29  nityStr(v, pIdx)
12620 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
12630 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
12640 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61 73  ange(pParse, bas
12650 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  e, n);.  }.}.../
12660 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12670 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
12680 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66  equality term of
12690 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
126a0 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a  e.  An equality.
126b0 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65  ** term can be e
126c0 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20  ither X=expr or 
126d0 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54  X IN (...).   pT
126e0 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20  erm is the term 
126f0 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e  to be .** coded.
12700 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65  .**.** The curre
12710 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  nt value for the
12720 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c   constraint is l
12730 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
12740 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iReg..**.** For 
12750 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  a constraint of 
12760 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c  the form X=expr,
12770 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
12780 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  is evaluated and
12790 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69   its.** result i
127a0 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74  s left on the st
127b0 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72  ack.  For constr
127c0 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  aints of the for
127d0 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20  m X IN (...).** 
127e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
127f0 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74  s up a loop that
12800 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76   will iterate ov
12810 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
12820 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   X..*/.static in
12830 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  t codeEqualityTe
12840 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
12850 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
12860 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
12870 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
12880 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65  *pTerm,   /* The
12890 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
128a0 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
128b0 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
128c0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f  Level *pLevel, /
128d0 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20  * When level of 
128e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
128f0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
12900 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67  n */.  int iTarg
12910 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  et         /* At
12920 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72  tempt to leave r
12930 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72  esults in this r
12940 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
12950 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
12960 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
12970 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
12980 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20  be;.  int iReg; 
12990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129a0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
129b0 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ding results */.
129c0 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67  .  assert( iTarg
129d0 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58  et>0 );.  if( pX
129e0 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20  ->op==TK_EQ ){. 
129f0 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
12a00 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
12a10 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
12a20 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ht, iTarget);.  
12a30 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70  }else if( pX->op
12a40 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
12a50 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
12a60 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
12a70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
12a80 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23  ull, 0, iReg);.#
12a90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12aa0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
12ab0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79  lse{.    int eTy
12ac0 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  pe;.    int iTab
12ad0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c  ;.    struct InL
12ae0 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61  oop *pIn;..    a
12af0 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
12b00 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67  K_IN );.    iReg
12b10 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
12b20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
12b30 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
12b40 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69  e, pX, 0);.    i
12b50 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  Tab = pX->iTable
12b60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12b70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
12b80 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  wind, iTab, 0);.
12b90 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
12ba0 28 76 2c 20 22 25 2e 2a 73 22 2c 20 70 58 2d 3e  (v, "%.*s", pX->
12bb0 73 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e  span.n, pX->span
12bc0 2e 7a 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  .z));.    assert
12bd0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
12be0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
12bf0 4e 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20 69 66  N_ABLE );.    if
12c00 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  ( pLevel->u.in.n
12c10 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  In==0 ){.      p
12c20 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
12c30 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
12c40 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a  Label(v);.    }.
12c50 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
12c60 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76  .nIn++;.    pLev
12c70 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
12c80 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65   =.       sqlite
12c90 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
12ca0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65  (pParse->db, pLe
12cb0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
12cc0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e   sizeof(pLevel->
12cf0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29  u.in.aInLoop[0])
12d00 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  *pLevel->u.in.nI
12d10 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c  n);.    pIn = pL
12d20 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
12d30 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20  op;.    if( pIn 
12d40 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20  ){.      pIn += 
12d50 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
12d60 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d   - 1;.      pIn-
12d70 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20  >iCur = iTab;.  
12d80 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49      if( eType==I
12d90 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
12da0 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64  .        pIn->ad
12db0 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65  drInTop = sqlite
12dc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12dd0 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69  P_Rowid, iTab, i
12de0 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
12df0 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  e{.        pIn->
12e00 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
12e10 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12e20 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
12e30 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  , 0, iReg);.    
12e40 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
12e50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12e60 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b  P_IsNull, iReg);
12e70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12e80 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e    pLevel->u.in.n
12e90 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65  In = 0;.    }.#e
12ea0 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62  ndif.  }.  disab
12eb0 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
12ec0 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  Term);.  return 
12ed0 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iReg;.}../*.** G
12ee0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
12ef0 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
12f00 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f  all == and IN co
12f10 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e  nstraints for an
12f20 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68 65 20  .** index.  The 
12f30 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63  values for all c
12f40 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 6c  onstraints are l
12f50 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  eft on the stack
12f60 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
12f70 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61  ple, consider ta
12f80 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65  ble t1(a,b,c,d,e
12f90 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69  ,f) with index i
12fa0 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70  1(a,b,c)..** Sup
12fb0 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63  pose the WHERE c
12fc0 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20  lause is this:  
12fd0 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31  a==5 AND b IN (1
12fe0 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e  ,2,3) AND c>5 AN
12ff0 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e  D c<10.** The in
13000 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20  dex has as many 
13010 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74  as three equalit
13020 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62  y constraints, b
13030 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78  ut in this.** ex
13040 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64  ample, the third
13050 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e   "c" value is an
13060 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f   inequality.  So
13070 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f   only two .** co
13080 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
13090 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ded.  This routi
130a0 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ne will generate
130b0 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
130c0 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20  e.** a==5 and b 
130d0 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65  IN (1,2,3).  The
130e0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
130f0 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c  for a and b will
13100 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   be stored.** in
13110 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
13120 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69  isters and the i
13130 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
13140 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  t register is re
13150 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  turned..**.** In
13160 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
13170 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20  ve nEq==2.  But 
13180 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
13190 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61  works for any va
131a0 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e  lue.** of nEq in
131b0 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e  cluding 0.  If n
131c0 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74  Eq==0, this rout
131d0 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20  ine is nearly a 
131e0 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e  no-op..** The on
131f0 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73  ly thing it does
13200 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   is allocate the
13210 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65   pLevel->iMem me
13220 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a  mory cell..**.**
13230 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
13240 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61  ways allocates a
13250 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f  t least one memo
13260 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75  ry cell and retu
13270 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rns.** the index
13280 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20   of that memory 
13290 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74  cell. The code t
132a0 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
132b0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75  s routine will u
132c0 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  se that memory c
132d0 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ell to store the
132e0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20   termination.** 
132f0 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  key value of the
13300 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f   loop.  If one o
13310 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74  r more IN operat
13320 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e  ors appear, then
13330 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
13340 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64   allocates an ad
13350 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d  ditional nEq mem
13360 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e  ory cells for in
13370 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a  ternal.** use..*
13380 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
13390 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
133a0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
133b0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
133c0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
133d0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
133e0 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63  Level,   /* Whic
133f0 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  h nested loop of
13400 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65   the FROM we are
13410 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65   coding */.  Whe
13420 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
13430 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
13440 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d  clause */.  Bitm
13450 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
13460 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73    /* Which parts
13470 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f   of FROM have no
13480 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64  t yet been coded
13490 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
134a0 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  Reg         /* N
134b0 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
134c0 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
134d0 63 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  cate */.){.  int
134e0 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70   nEq = pLevel->p
134f0 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68  lan.nEq;   /* Th
13500 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  e number of == o
13510 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
13520 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64   to code */.  Vd
13530 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
13540 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
13550 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73  he vm under cons
13560 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  truction */.  In
13570 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
13580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13590 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75  he index being u
135a0 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f  sed for this loo
135b0 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20  p */.  int iCur 
135c0 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  = pLevel->iTabCu
135d0 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
135e0 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
135f0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
13600 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
13610 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
13620 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a  onstraint term *
13630 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13650 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
13660 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  r */.  int regBa
13670 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
13680 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
13690 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ister */.  int n
136a0 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
136b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
136c0 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  er of registers 
136d0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a  to allocate */..
136e0 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65    /* This module
136f0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
13700 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74  on query plans t
13710 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  hat use an index
13720 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
13730 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
13740 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
13750 58 45 44 20 29 3b 0a 20 20 70 49 64 78 20 3d 20  XED );.  pIdx = 
13760 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
13770 49 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  Idx;..  /* Figur
13780 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
13790 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
137a0 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
137b0 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
137c0 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
137d0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
137e0 20 20 6e 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d    nReg = pLevel-
137f0 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74  >plan.nEq + nExt
13800 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d  raReg;.  pParse-
13810 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a  >nMem += nReg;..
13820 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
13830 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
13840 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  raints.  */.  as
13850 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
13860 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f  umn>=nEq );.  fo
13870 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  r(j=0; j<nEq; j+
13880 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a  +){.    int r1;.
13890 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78      int k = pIdx
138a0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
138b0 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
138c0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b  erm(pWC, iCur, k
138d0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
138e0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
138f0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , pIdx);.    if(
13900 20 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d 30 29   NEVER(pTerm==0)
13910 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
13920 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
13930 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
13940 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 31  ED)==0 );.    r1
13950 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
13960 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
13970 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61  m, pLevel, regBa
13980 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72  se+j);.    if( r
13990 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a  1!=regBase+j ){.
139a0 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d        if( nReg==
139b0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
139c0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
139d0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  eg(pParse, regBa
139e0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67  se);.        reg
139f0 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20  Base = r1;.     
13a00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13a20 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
13a30 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  1, regBase+j);. 
13a40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13a50 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
13a60 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
13a70 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
13a80 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
13a90 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
13aa0 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  N );.    if( (pT
13ab0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
13ac0 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
13ad0 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  N))==0 ){.      
13ae0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13af0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
13b00 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65  regBase+j, pLeve
13b10 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
13b20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
13b30 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  regBase;.}../*.*
13b40 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
13b50 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
13b60 20 70 57 43 20 63 6f 6e 74 61 69 6e 73 20 6e 6f   pWC contains no
13b70 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 61   terms that.** a
13b80 72 65 20 6e 6f 74 20 76 69 72 74 75 61 6c 20 61  re not virtual a
13b90 6e 64 20 77 68 69 63 68 20 68 61 76 65 20 6e 6f  nd which have no
13ba0 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 0a 2a 2a  t been coded..**
13bb0 0a 2a 2a 20 54 6f 20 70 75 74 20 69 74 20 61 6e  .** To put it an
13bc0 6f 74 68 65 72 20 77 61 79 2c 20 72 65 74 75 72  other way, retur
13bd0 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 61 64 64  n TRUE if no add
13be0 69 74 69 6f 6e 61 6c 20 57 48 45 52 45 20 63 6c  itional WHERE cl
13bf0 61 75 73 65 73 0a 2a 2a 20 74 65 73 74 73 20 61  auses.** tests a
13c00 72 65 20 72 65 71 75 69 72 65 64 20 69 6e 20 6f  re required in o
13c10 72 64 65 72 20 74 6f 20 65 73 74 61 62 6c 69 73  rder to establis
13c20 68 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65  h that the curre
13c30 6e 74 20 72 6f 77 0a 2a 2a 20 73 68 6f 75 6c 64  nt row.** should
13c40 20 67 6f 20 74 6f 20 6f 75 74 70 75 74 20 61 6e   go to output an
13c50 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69  d return FALSE i
13c60 66 20 74 68 65 72 65 20 61 72 65 20 73 6f 6d 65  f there are some
13c70 20 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65   terms of.** the
13c80 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
13c90 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 76 61  at need to be va
13ca0 6c 69 64 61 74 65 64 20 62 65 66 6f 72 65 20 6f  lidated before o
13cb0 75 74 70 75 74 69 6e 67 20 74 68 65 20 72 6f 77  utputing the row
13cc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13cd0 77 68 65 72 65 52 6f 77 52 65 61 64 79 46 6f 72  whereRowReadyFor
13ce0 4f 75 74 70 75 74 28 57 68 65 72 65 43 6c 61 75  Output(WhereClau
13cf0 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72  se *pWC){.  Wher
13d00 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
13d10 69 6e 74 20 6a 3b 0a 20 0a 20 20 66 6f 72 28 70  int j;. .  for(p
13d20 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70  Term=pWC->a, j=p
13d30 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20  WC->nTerm; j>0; 
13d40 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j--, pTerm++){. 
13d50 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77     if( (pTerm->w
13d60 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
13d70 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
13d80 44 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D))==0 ) return 
13d90 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
13da0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  1;.}../*.** Gene
13db0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
13dc0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69  e start of the i
13dd0 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e  Level-th loop in
13de0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
13df0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
13e00 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79  ion described by
13e10 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74   pWInfo..*/.stat
13e20 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f  ic Bitmask codeO
13e30 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57  neLoopStart(.  W
13e40 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
13e50 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20  ,   /* Complete 
13e60 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
13e70 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
13e80 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  se */.  int iLev
13e90 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  el,          /* 
13ea0 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70  Which level of p
13eb0 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c  WInfo->a[] shoul
13ec0 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  d be coded */.  
13ed0 75 38 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20  u8 wctrlFlags,  
13ee0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
13ef0 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
13f00 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
13f10 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74  teInt.h */.  Bit
13f20 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
13f30 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65    /* Which table
13f40 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  s are currently 
13f50 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a  available */.){.
13f60 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20    int j, k;     
13f70 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
13f80 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
13f90 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
13fa0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
13fb0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62  rsor for the tab
13fc0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
13fd0 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Nxt;         /* 
13fe0 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f  Where to jump to
13ff0 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
14000 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20  he next IN case 
14010 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62  */.  int omitTab
14020 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le;       /* Tru
14030 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20  e if we use the 
14040 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20  index only */.  
14050 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20  int bRev;       
14060 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
14070 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20  we need to scan 
14080 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
14090 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
140a0 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68   *pLevel;  /* Th
140b0 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f  e where level to
140c0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57   be coded */.  W
140d0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
140e0 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
140f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  tion of the enti
14100 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
14110 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
14120 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
14130 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20       /* A WHERE 
14140 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
14150 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14170 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
14180 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ext */.  Vdbe *v
14190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
141a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
141b0 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e  prepared stmt un
141c0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
141d0 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
141e0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
141f0 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63  Item;  /* FROM c
14200 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
14210 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
14220 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20  addrBrk;        
14230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
14240 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
14250 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  k out of the loo
14260 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
14270 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ont;            
14280 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
14290 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
142a0 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20  with next cycle 
142b0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 53  */.  int regRowS
142c0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 57 72 69  et;       /* Wri
142d0 74 65 20 72 6f 77 69 64 73 20 74 6f 20 74 68 69  te rowids to thi
142e0 73 20 52 6f 77 53 65 74 20 69 66 20 6e 6f 6e 2d  s RowSet if non-
142f0 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 69 6e  negative */.  in
14300 74 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c  t codeRowSetEarl
14310 79 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e  y; /* True if in
14320 64 65 78 20 66 75 6c 6c 79 20 63 6f 6e 73 74 72  dex fully constr
14330 61 69 6e 73 20 74 68 65 20 73 65 61 72 63 68 20  ains the search 
14340 2a 2f 0a 20 20 0a 0a 20 20 70 50 61 72 73 65 20  */.  ..  pParse 
14350 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
14360 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
14370 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 70  pVdbe;.  pWC = p
14380 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c  WInfo->pWC;.  pL
14390 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
143a0 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 54 61  a[iLevel];.  pTa
143b0 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  bItem = &pWInfo-
143c0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
143d0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
143e0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
143f0 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20  iCursor;.  bRev 
14400 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  = (pLevel->plan.
14410 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14420 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 6f  REVERSE)!=0;.  o
14430 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76  mitTable = (pLev
14440 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
14450 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
14460 59 29 21 3d 30 3b 0a 20 20 72 65 67 52 6f 77 53  Y)!=0;.  regRowS
14470 65 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 72 65 67  et = pWInfo->reg
14480 52 6f 77 53 65 74 3b 0a 20 20 63 6f 64 65 52 6f  RowSet;.  codeRo
14490 77 53 65 74 45 61 72 6c 79 20 3d 20 30 3b 0a 0a  wSetEarly = 0;..
144a0 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
144b0 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61  ls for the "brea
144c0 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65  k" and "continue
144d0 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20  " instructions. 
144e0 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72   ** for the curr
144f0 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20  ent loop.  Jump 
14500 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72  to addrBrk to br
14510 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  eak out of a loo
14520 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20  p..  ** Jump to 
14530 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64  cont to go immed
14540 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65  iately to the ne
14550 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
14560 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20  the.  ** loop.. 
14570 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68   **.  ** When th
14580 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ere is an IN ope
14590 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68  rator, we also h
145a0 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20  ave a "addrNxt" 
145b0 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20  label that.  ** 
145c0 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75  means to continu
145d0 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
145e0 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61  IN value combina
145f0 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a  tion.  When.  **
14600 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e   there are no IN
14610 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68   operators in th
14620 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  e constraints, t
14630 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62  he "addrNxt" lab
14640 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73  el.  ** is the s
14650 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22  ame as "addrBrk"
14660 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b  ..  */.  addrBrk
14670 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
14680 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
14690 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
146a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
146b0 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65    addrCont = pLe
146c0 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20  vel->addrCont = 
146d0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
146e0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  abel(v);..  /* I
146f0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69  f this is the ri
14700 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
14710 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
14720 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a  allocate and.  *
14730 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
14740 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
14750 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
14760 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
14770 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68  y.  ** row of th
14780 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
14790 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
147a0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72   if( pLevel->iFr
147b0 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  om>0 && (pTabIte
147c0 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m[0].jointype & 
147d0 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
147e0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74     pLevel->iLeft
147f0 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Join = ++pParse-
14800 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
14810 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14820 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
14830 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
14840 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
14850 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46  nt((v, "init LEF
14860 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20  T JOIN no-match 
14870 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 23 69  flag"));.  }..#i
14880 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14890 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
148a0 20 69 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70   if(  (pLevel->p
148b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
148c0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
148d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  )!=0 ){.    /* C
148e0 61 73 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c  ase 0:  The tabl
148f0 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
14900 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
14910 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
14920 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
14930 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
14940 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
14950 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
14960 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
14970 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 73 71  Filter */.    sq
14980 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
14990 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65   *pVtabIdx = pLe
149a0 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61  vel->plan.u.pVta
149b0 62 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43  bIdx;.    int nC
149c0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61  onstraint = pVta
149d0 62 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  bIdx->nConstrain
149e0 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71  t;.    struct sq
149f0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
14a00 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55  traint_usage *aU
14a10 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d         pVtabIdx-
14a50 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
14a60 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72  e;.    const str
14a70 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
14a80 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43  x_constraint *aC
14a90 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20  onstraint =.    
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61              pVta
14ad0 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  bIdx->aConstrain
14ae0 74 3b 0a 0a 20 20 20 20 69 52 65 67 20 3d 20 73  t;..    iReg = s
14af0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
14b00 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73  ge(pParse, nCons
14b10 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 70  traint+2);.    p
14b20 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
14b30 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 66 6f  lCache++;.    fo
14b40 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74  r(j=1; j<=nConst
14b50 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
14b60 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43     for(k=0; k<nC
14b70 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b  onstraint; k++){
14b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 55 73  .        if( aUs
14b90 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78  age[k].argvIndex
14ba0 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==j ){.         
14bb0 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
14bc0 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72  nstraint[k].iTer
14bd0 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
14be0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
14bf0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
14c00 68 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  he );.          
14c10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
14c20 70 50 61 72 73 65 2c 20 70 57 43 2d 3e 61 5b 69  pParse, pWC->a[i
14c30 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69  Term].pExpr->pRi
14c40 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a  ght, iReg+j+1);.
14c50 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
14c60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14c70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
14c80 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72  nConstraint ) br
14c90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  eak;.    }.    a
14ca0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
14cb0 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 20 29  isableColCache )
14cc0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69  ;.    pParse->di
14cd0 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b  sableColCache--;
14ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14cf0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
14d00 65 67 65 72 2c 20 70 56 74 61 62 49 64 78 2d 3e  eger, pVtabIdx->
14d10 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
14d20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14d30 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
14d40 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29  er, j-1, iReg+1)
14d50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14d60 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46  eAddOp4(v, OP_VF
14d70 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64  ilter, iCur, add
14d80 72 42 72 6b 2c 20 69 52 65 67 2c 20 70 56 74 61  rBrk, iReg, pVta
14d90 62 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20  bIdx->idxStr,.  
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14db0 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65      pVtabIdx->ne
14dc0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f  edToFreeIdxStr ?
14dd0 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34   P4_MPRINTF : P4
14de0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70 56  _STATIC);.    pV
14df0 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72  tabIdx->needToFr
14e00 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
14e10 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
14e20 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
14e30 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65        if( aUsage
14e40 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20  [j].omit ){.    
14e50 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20      int iTerm = 
14e60 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69  aConstraint[j].i
14e70 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
14e80 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
14e90 70 4c 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b  pLevel, &pWC->a[
14ea0 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d  iTerm]);.      }
14eb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
14ec0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74  l->op = OP_VNext
14ed0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
14ee0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
14ef0 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
14f00 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
14f10 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 52 6f 77  (v);.    codeRow
14f20 53 65 74 45 61 72 6c 79 20 3d 20 72 65 67 52 6f  SetEarly = regRo
14f30 77 53 65 74 3e 3d 30 20 3f 20 77 68 65 72 65 52  wSet>=0 ? whereR
14f40 6f 77 52 65 61 64 79 46 6f 72 4f 75 74 70 75 74  owReadyForOutput
14f50 28 70 57 43 29 20 3a 20 30 3b 0a 20 20 20 20 69  (pWC) : 0;.    i
14f60 66 28 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72  f( codeRowSetEar
14f70 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ly ){.      sqli
14f80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14f90 20 4f 50 5f 56 52 6f 77 69 64 2c 20 69 43 75 72   OP_VRowid, iCur
14fa0 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 73  , iReg);.      s
14fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14fc0 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 41 64 64  (v, OP_RowSetAdd
14fd0 2c 20 72 65 67 52 6f 77 53 65 74 2c 20 69 52 65  , regRowSet, iRe
14fe0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
14ff0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
15000 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  Range(pParse, iR
15010 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  eg, nConstraint+
15020 32 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  2);.  }else.#end
15030 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
15040 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
15050 2f 0a 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  /..  if( pLevel-
15060 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
15070 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
15080 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a  {.    /* Case 1:
15090 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c    We can directl
150a0 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
150b0 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61  ngle row using a
150c0 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
150d0 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
150e0 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
150f0 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
15100 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  Or.    **       
15110 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20     we reference 
15120 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73  multiple rows us
15130 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20  ing a "rowid IN 
15140 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20  (...)".    **   
15150 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74         construct
15160 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
15170 20 72 31 3b 0a 20 20 20 20 69 6e 74 20 72 74 6d   r1;.    int rtm
15180 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  p = sqlite3GetTe
15190 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
151a0 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
151b0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
151c0 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
151d0 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
151e0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
151f0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
15200 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d  ( pTerm->pExpr!=
15210 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
15220 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
15230 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20  or==iCur );.    
15240 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
15250 65 3d 3d 30 20 29 3b 0a 20 20 20 20 72 31 20 3d  e==0 );.    r1 =
15260 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
15270 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
15280 20 70 4c 65 76 65 6c 2c 20 72 74 6d 70 29 3b 0a   pLevel, rtmp);.
15290 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
152a0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
152b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
152c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
152d0 65 49 6e 74 2c 20 72 31 2c 20 61 64 64 72 4e 78  eInt, r1, addrNx
152e0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
152f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15300 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c  NotExists, iCur,
15310 20 61 64 64 72 4e 78 74 2c 20 72 31 29 3b 0a 20   addrNxt, r1);. 
15320 20 20 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72     codeRowSetEar
15330 6c 79 20 3d 20 28 70 57 43 2d 3e 6e 54 65 72 6d  ly = (pWC->nTerm
15340 3d 3d 31 20 26 26 20 72 65 67 52 6f 77 53 65 74  ==1 && regRowSet
15350 3e 3d 30 29 20 3f 31 3a 30 3b 0a 20 20 20 20 69  >=0) ?1:0;.    i
15360 66 28 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72  f( codeRowSetEar
15370 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ly ){.      sqli
15380 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15390 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 2c 20 72   OP_RowSetAdd, r
153a0 65 67 52 6f 77 53 65 74 2c 20 72 31 29 3b 0a 20  egRowSet, r1);. 
153b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
153c0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
153d0 50 61 72 73 65 2c 20 72 74 6d 70 29 3b 0a 20 20  Parse, rtmp);.  
153e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
153f0 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c  , "pk"));.    pL
15400 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
15410 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  op;.  }else if( 
15420 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
15430 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
15440 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  ID_RANGE ){.    
15450 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68  /* Case 2:  We h
15460 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74  ave an inequalit
15470 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
15480 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
15490 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ield..    */.   
154a0 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50   int testOp = OP
154b0 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73  _Noop;.    int s
154c0 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65  tart;.    int me
154d0 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20  mEndValue = 0;. 
154e0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
154f0 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
15500 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
15510 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53  ble==0 );.    pS
15520 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  tart = findTerm(
15530 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
15540 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
15550 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 70 45  O_GE, 0);.    pE
15560 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  nd = findTerm(pW
15570 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
15580 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
15590 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  LE, 0);.    if( 
155a0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
155b0 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
155c0 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
155d0 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
155e0 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
155f0 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
15600 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
15610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15620 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
15630 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74  t defines the st
15640 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  art bound */.   
15650 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70     int r1, rTemp
15660 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  ;        /* Regi
15670 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e  sters for holdin
15680 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  g the start boun
15690 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  dary */..      /
156a0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
156b0 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b  constant maps TK
156c0 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63  _xx codes into c
156d0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20  orresponding .  
156e0 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f      ** seek opco
156f0 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73  des.  It depends
15700 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
15710 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f   ordering of TK_
15720 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xx.      */.    
15730 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65    const u8 aMove
15740 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
15750 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20      /* TK_GT */ 
15760 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20   OP_SeekGt,.    
15770 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20         /* TK_LE 
15780 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20  */  OP_SeekLe,. 
15790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
157a0 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74  LT */  OP_SeekLt
157b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
157c0 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GE */  OP_See
157d0 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  kGe.      };.   
157e0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
157f0 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20  ==TK_GT+1 );    
15800 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
15810 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f  he ordering.. */
15820 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
15830 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
15840 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66        /*  ... of
15850 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65   the TK_xx value
15860 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  s... */.      as
15870 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
15880 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+3 );      /* 
15890 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74   ... is correcct
158a0 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 70 58 20 3d  . */..      pX =
158b0 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
158c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
158d0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
158e0 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66  ert( pStart->lef
158f0 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
15900 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
15910 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15920 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
15930 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20  ht, &rTemp);.   
15940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15950 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b  dOp3(v, aMoveOp[
15960 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69  pX->op-TK_GT], i
15970 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31  Cur, addrBrk, r1
15980 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
15990 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
159a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
159b0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
159c0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  hange(pParse, r1
159d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
159e0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
159f0 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29  g(pParse, rTemp)
15a00 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  ;.      disableT
15a10 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61  erm(pLevel, pSta
15a20 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rt);.    }else{.
15a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15a40 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20  eAddOp2(v, bRev 
15a50 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52  ? OP_Last : OP_R
15a60 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  ewind, iCur, add
15a70 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rBrk);.    }.   
15a80 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20   if( pEnd ){.   
15a90 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20     Expr *pX;.   
15aa0 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45     pX = pEnd->pE
15ab0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
15ac0 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
15ad0 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e    assert( pEnd->
15ae0 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
15af0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64   );.      memEnd
15b00 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65  Value = ++pParse
15b10 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
15b20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
15b30 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
15b40 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a  , memEndValue);.
15b50 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70        if( pX->op
15b60 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f  ==TK_LT || pX->o
15b70 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20  p==TK_GT ){.    
15b80 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
15b90 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47  v ? OP_Le : OP_G
15ba0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
15bb0 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
15bc0 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20   bRev ? OP_Lt : 
15bd0 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20  OP_Gt;.      }. 
15be0 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
15bf0 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a  (pLevel, pEnd);.
15c00 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20      }.    start 
15c10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
15c20 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
15c30 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52   pLevel->op = bR
15c40 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f  ev ? OP_Prev : O
15c50 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76  P_Next;.    pLev
15c60 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
15c70 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
15c80 73 74 61 72 74 3b 0a 20 20 20 20 70 4c 65 76 65  start;.    pLeve
15c90 6c 2d 3e 70 35 20 3d 20 28 70 53 74 61 72 74 3d  l->p5 = (pStart=
15ca0 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 29 20 3f  =0 && pEnd==0) ?
15cb0 31 3a 30 3b 0a 20 20 20 20 63 6f 64 65 52 6f 77  1:0;.    codeRow
15cc0 53 65 74 45 61 72 6c 79 20 3d 20 72 65 67 52 6f  SetEarly = regRo
15cd0 77 53 65 74 3e 3d 30 20 3f 20 77 68 65 72 65 52  wSet>=0 ? whereR
15ce0 6f 77 52 65 61 64 79 46 6f 72 4f 75 74 70 75 74  owReadyForOutput
15cf0 28 70 57 43 29 20 3a 20 30 3b 0a 20 20 20 20 69  (pWC) : 0;.    i
15d00 66 28 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72  f( codeRowSetEar
15d10 6c 79 20 7c 7c 20 74 65 73 74 4f 70 21 3d 4f 50  ly || testOp!=OP
15d20 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69  _Noop ){.      i
15d30 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
15d40 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
15d50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15d60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15d70 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 72 31  _Rowid, iCur, r1
15d80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 73  );.      if( tes
15d90 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
15da0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15db0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73  dbeAddOp3(v, tes
15dc0 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  tOp, memEndValue
15dd0 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a  , addrBrk, r1);.
15de0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15df0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
15e00 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
15e10 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  C | SQLITE_JUMPI
15e20 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
15e30 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 52 6f        if( codeRo
15e40 77 53 65 74 45 61 72 6c 79 20 29 7b 0a 20 20 20  wSetEarly ){.   
15e50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15e60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
15e70 53 65 74 41 64 64 2c 20 72 65 67 52 6f 77 53 65  SetAdd, regRowSe
15e80 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  t, r1);.      }.
15e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15ea0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15eb0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 7d 0a 20  se, r1);.    }. 
15ec0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
15ed0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
15ee0 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
15ef0 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55  RANGE|WHERE_COLU
15f00 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a  MN_EQ) ){.    /*
15f10 20 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20   Case 3: A scan 
15f20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a  using an index..
15f30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
15f40 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20        The WHERE 
15f50 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61  clause may conta
15f60 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  in zero or more 
15f70 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a  equality .    **
15f80 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28           terms (
15f90 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65  "==" or "IN" ope
15fa0 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66  rators) that ref
15fb0 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20  er to the N.    
15fc0 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d  **         left-
15fd0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  most columns of 
15fe0 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61  the index. It ma
15ff0 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20  y also contain. 
16000 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
16010 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
16020 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f  ints (>, <, >= o
16030 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64  r <=) on the ind
16040 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  exed.    **     
16050 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20      column that 
16060 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
16070 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69  ows the N equali
16080 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20  ties. Only .    
16090 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72  **         the r
160a0 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
160b0 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75   can be an inequ
160c0 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74  ality - the rest
160d0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20   must.    **    
160e0 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d       use the "==
160f0 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61  " and "IN" opera
16100 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tors. For exampl
16110 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
16120 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20  *         index 
16130 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74  is on (x,y,z), t
16140 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
16150 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c  g clauses are al
16160 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  l .    **       
16170 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20    optimized:.   
16180 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
16190 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a        x=5.    **
161a0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
161b0 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20  AND y=10.    ** 
161c0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
161d0 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
161e0 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
161f0 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20  D y>5 AND y<10. 
16200 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
16210 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44   x=5 AND y=5 AND
16220 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20   z<=10.    **.  
16230 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
16240 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68   z<10 term of th
16250 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e  e following cann
16260 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79  ot be used, only
16270 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
16280 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20  the x=5 term:.  
16290 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
162a0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a         x=5 AND z
162b0 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <10.    **.    *
162c0 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20  *         N may 
162d0 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  be zero if there
162e0 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
162f0 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
16300 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74   **         If t
16310 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71  here are no ineq
16320 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
16330 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74  ts, then N is at
16340 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
16350 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a  least one..    *
16360 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
16370 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c   This case is al
16380 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  so used when the
16390 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
163a0 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20  clause.    **   
163b0 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
163c0 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69  s but an index i
163d0 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61  s selected anywa
163e0 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20  y, in order.    
163f0 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f  **         to fo
16400 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  rce the output o
16410 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20  rder to conform 
16420 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a  to an ORDER BY..
16430 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 69 6e 74      */  .    int
16440 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a   aStartOp[] = {.
16450 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30        0,.      0
16460 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e  ,.      OP_Rewin
16470 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
16480 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  2: (!start_const
16490 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
164a0 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a  q &&  !bRev) */.
164b0 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20        OP_Last,  
164c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a             /* 3:
164d0 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
164e0 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
164f0 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20  &&   bRev) */.  
16500 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20      OP_SeekGt,  
16510 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28           /* 4: (
16520 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
16530 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
16540 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
16550 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20    OP_SeekLt,    
16560 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74         /* 5: (st
16570 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
16580 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
16590 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
165a0 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20  OP_SeekGe,      
165b0 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72       /* 6: (star
165c0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
165d0 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62  &  startEq && !b
165e0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
165f0 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20  _SeekLe         
16600 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f     /* 7: (start_
16610 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
16620 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65   startEq &&  bRe
16630 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  v) */.    };.   
16640 20 69 6e 74 20 61 45 6e 64 4f 70 5b 5d 20 3d 20   int aEndOp[] = 
16650 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c  {.      OP_Noop,
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16670 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61  0: (!end_constra
16680 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f  ints) */.      O
16690 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20  P_IdxGE,        
166a0 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63      /* 1: (end_c
166b0 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62  onstraints && !b
166c0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
166d0 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20 20 20  _IdxLT          
166e0 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f     /* 2: (end_co
166f0 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62 52 65  nstraints && bRe
16700 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  v) */.    };.   
16710 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
16720 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 0a 20 20 20  l->plan.nEq;.   
16730 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20   int isMinQuery 
16740 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
16750 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f   If this is an o
16760 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20  ptimized SELECT 
16770 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20  min(x).. */.    
16780 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
167a0 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f  Base register ho
167b0 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74  lding constraint
167c0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69   values */.    i
167d0 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20  nt r1;          
167e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
167f0 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  emp register */.
16800 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
16810 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20  RangeStart = 0; 
16820 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
16830 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
16840 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20  ge start */.    
16850 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
16860 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  eEnd = 0;    /* 
16870 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
16880 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65  raint at range e
16890 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  nd */.    int st
168a0 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20  artEq;          
168b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
168c0 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73  f range start us
168d0 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
168e0 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71  */.    int endEq
168f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16900 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
16910 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d  ange end uses ==
16920 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
16930 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73    int start_cons
16940 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f  traints;       /
16950 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65  * Start of range
16960 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
16970 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  */.    int nCons
16980 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20  traint;         
16990 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
169a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
169b0 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  s */.    Index *
169c0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a  pIdx;         /*
169d0 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69   The index we wi
169e0 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20  ll be using */. 
169f0 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
16a00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
16a10 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
16a20 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
16a30 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20  int nExtraReg = 
16a40 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
16a50 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
16a60 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20  s needed */.    
16a70 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
16a80 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74       /* Instruct
16a90 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 0a 20  ion opcode */.. 
16aa0 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c     pIdx = pLevel
16ab0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ->plan.u.pIdx;. 
16ac0 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
16ad0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
16ae0 20 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f    k = pIdx->aiCo
16af0 6c 75 6d 6e 5b 6e 45 71 5d 3b 20 20 20 20 20 2f  lumn[nEq];     /
16b00 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e 65  * Column for ine
16b10 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
16b20 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  nts */..    /* I
16b30 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69  f this loop sati
16b40 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64  sfies a sort ord
16b50 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65  er (pOrderBy) re
16b60 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20  quest that .    
16b70 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  ** was passed to
16b80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
16b90 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53  o implement a "S
16ba0 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e  ELECT min(x) ...
16bb0 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c  " .    ** query,
16bc0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
16bd0 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77   will only allow
16be0 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e   the loop to run
16bf0 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69   for.    ** a si
16c00 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20  ngle iteration. 
16c10 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
16c20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65  the first row re
16c30 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68  turned.    ** sh
16c40 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20  ould not have a 
16c50 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65  NULL value store
16c60 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c  d in 'x'. If col
16c70 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a  umn 'x' is.    *
16c80 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20  * the first one 
16c90 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71  after the nEq eq
16ca0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
16cb0 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  ts in the index,
16cc0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71  .    ** this req
16cd0 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69  uires some speci
16ce0 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
16cf0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74   */.    if( (wct
16d00 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
16d10 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
16d20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70     && (pLevel->p
16d30 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52  lan.wsFlags&WHER
16d40 45 5f 4f 52 44 45 52 42 59 29 0a 20 20 20 20 20  E_ORDERBY).     
16d50 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  && (pIdx->nColum
16d60 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  n>nEq).    ){.  
16d70 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
16d80 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
16d90 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  1 ); */.      /*
16da0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
16db0 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69  y->a[0].pExpr->i
16dc0 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
16dd0 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a  Column[nEq] ); *
16de0 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65  /.      isMinQue
16df0 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45  ry = 1;.      nE
16e00 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
16e10 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
16e20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
16e30 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
16e40 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
16e50 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  d end .    ** of
16e60 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
16e70 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
16e80 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
16e90 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
16ea0 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
16eb0 67 65 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d  geEnd = findTerm
16ec0 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
16ed0 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c  otReady, (WO_LT|
16ee0 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20  WO_LE), pIdx);. 
16ef0 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
16f00 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
16f10 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
16f20 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
16f30 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
16f40 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20    pRangeStart = 
16f50 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
16f60 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
16f70 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20   (WO_GT|WO_GE), 
16f80 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78  pIdx);.      nEx
16f90 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
16fa0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  }..    /* Genera
16fb0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
16fc0 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ate all constrai
16fd0 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d  nt terms using =
16fe0 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61  = or IN.    ** a
16ff0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  nd store the val
17000 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
17010 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ms in an array o
17020 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
17030 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  ** starting at r
17040 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  egBase..    */. 
17050 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64     regBase = cod
17060 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
17070 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c  s(pParse, pLevel
17080 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61 64 79 2c  , pWC, notReady,
17090 20 6e 45 78 74 72 61 52 65 67 29 3b 0a 20 20 20   nExtraReg);.   
170a0 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
170b0 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 0a 20 20  l->addrNxt;...  
170c0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
170d0 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f  oing a reverse o
170e0 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20  rder scan on an 
170f0 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  ascending index,
17100 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72   or.    ** a for
17110 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20  ward order scan 
17120 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
17130 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e  index, interchan
17140 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  ge the .    ** s
17150 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72  tart and end ter
17160 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20  ms (pRangeStart 
17170 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a  and pRangeEnd)..
17180 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62      */.    if( b
17190 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72  Rev==(pIdx->aSor
171a0 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c  tOrder[nEq]==SQL
171b0 49 54 45 5f 53 4f 5f 41 53 43 29 20 29 7b 0a 20  ITE_SO_ASC) ){. 
171c0 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54       SWAP(WhereT
171d0 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64  erm *, pRangeEnd
171e0 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
171f0 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63      }..    testc
17200 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
17210 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d   && pRangeStart-
17220 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
17230 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LE );.    testca
17240 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
17250 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  && pRangeStart->
17260 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
17270 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
17280 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
17290 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
172a0 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a  ator & WO_LE );.
172b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
172c0 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67  angeEnd && pRang
172d0 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
172e0 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73  & WO_GE );.    s
172f0 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65  tartEq = !pRange
17300 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53  Start || pRangeS
17310 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
17320 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
17330 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21  .    endEq =   !
17340 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61  pRangeEnd || pRa
17350 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
17360 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
17370 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  );.    start_con
17380 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67  straints = pRang
17390 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b  eStart || nEq>0;
173a0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
173b0 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74  e index cursor t
173c0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
173d0 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
173e0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
173f0 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
17400 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  geStart ){.     
17410 20 69 6e 74 20 64 63 63 20 3d 20 70 50 61 72 73   int dcc = pPars
17420 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
17430 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  he;.      if( pR
17440 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20  angeEnd ){.     
17450 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
17460 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20  leColCache++;.  
17470 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
17480 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
17490 73 65 2c 20 70 52 61 6e 67 65 53 74 61 72 74 2d  se, pRangeStart-
174a0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
174b0 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
174c0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
174d0 62 6c 65 43 6f 6c 43 61 63 68 65 20 3d 20 64 63  bleColCache = dc
174e0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
174f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17500 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65  _IsNull, regBase
17510 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
17520 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
17530 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t++;.    }else i
17540 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b  f( isMinQuery ){
17550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17560 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
17570 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b  ull, 0, regBase+
17580 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e  nEq);.      nCon
17590 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
175a0 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20   startEq = 0;.  
175b0 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
175c0 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d  aints = 1;.    }
175d0 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66  .    codeApplyAf
175e0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
175f0 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
17600 69 6e 74 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  int, pIdx);.    
17610 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73  op = aStartOp[(s
17620 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
17630 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c  <<2) + (startEq<
17640 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20  <1) + bRev];.   
17650 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29   assert( op!=0 )
17660 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
17670 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b  op==OP_Rewind );
17680 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
17690 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20  p==OP_Last );.  
176a0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
176b0 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20  OP_SeekGt );.   
176c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
176d0 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20  P_SeekGe );.    
176e0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
176f0 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74  _SeekLe );.    t
17700 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
17710 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71  SeekLt );.    sq
17720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17730 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
17740 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
17750 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17760 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
17770 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 43 6f 6e 73  INT_TO_PTR(nCons
17780 74 72 61 69 6e 74 29 2c 20 50 34 5f 49 4e 54 33  traint), P4_INT3
17790 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64  2);..    /* Load
177a0 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
177b0 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
177c0 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20  nstraint at the 
177d0 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
177e0 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29  * range (if any)
177f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f  ..    */.    nCo
17800 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
17810 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e      if( pRangeEn
17820 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
17830 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
17840 65 2c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45  e, pRangeEnd->pE
17850 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 72 65 67  xpr->pRight, reg
17860 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
17870 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17880 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
17890 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
178a0 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 63 6f  drNxt);.      co
178b0 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
178c0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
178d0 20 6e 45 71 2b 31 2c 20 70 49 64 78 29 3b 0a 20   nEq+1, pIdx);. 
178e0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
178f0 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ++;.    }..    /
17900 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
17910 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c  p body */.    pL
17920 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74  evel->p2 = sqlit
17930 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17940 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(v);..    /* Ch
17950 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78  eck if the index
17960 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20   cursor is past 
17970 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
17980 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20  ange. */.    op 
17990 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65  = aEndOp[(pRange
179a0 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31  End || nEq) * (1
179b0 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74   + bRev)];.    t
179c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
179d0 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74  Noop );.    test
179e0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
179f0 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  GE );.    testca
17a00 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54  se( op==OP_IdxLT
17a10 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   );.    if( op!=
17a20 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
17a30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17a40 70 34 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  p4(v, op, iIdxCu
17a50 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
17a60 61 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ase,.           
17a70 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17a80 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
17a90 43 6f 6e 73 74 72 61 69 6e 74 29 2c 20 50 34 5f  Constraint), P4_
17aa0 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 73 71  INT32);.      sq
17ab0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
17ac0 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76  5(v, endEq!=bRev
17ad0 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20   ?1:0);.    }.. 
17ae0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
17af0 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  re inequality co
17b00 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b  nstraints, check
17b10 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a   that the value.
17b20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61      ** of the ta
17b30 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ble column that 
17b40 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
17b50 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20  ontrains is not 
17b60 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20  NULL..    ** If 
17b70 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74  it is, jump to t
17b80 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
17b90 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  n of the loop.. 
17ba0 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73     */.    r1 = s
17bb0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17bc0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74 65  (pParse);.    te
17bd0 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
17be0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
17bf0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
17c00 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
17c10 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
17c20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
17c30 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66  _LIMIT );.    if
17c40 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
17c50 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
17c60 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
17c70 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20  TOP_LIMIT) ){.  
17c80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17c90 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
17ca0 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71  mn, iIdxCur, nEq
17cb0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
17cc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17cd0 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c  , OP_IsNull, r1,
17ce0 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20   addrCont);.    
17cf0 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74  }..    /* Seek t
17d00 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c  he table cursor,
17d10 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
17d20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
17d30 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74  pLevel, pRangeSt
17d40 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c  art);.    disabl
17d50 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
17d60 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 63 6f  angeEnd);.    co
17d70 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20 3d 20  deRowSetEarly = 
17d80 72 65 67 52 6f 77 53 65 74 3e 3d 30 20 3f 20 77  regRowSet>=0 ? w
17d90 68 65 72 65 52 6f 77 52 65 61 64 79 46 6f 72 4f  hereRowReadyForO
17da0 75 74 70 75 74 28 70 57 43 29 20 3a 20 30 3b 0a  utput(pWC) : 0;.
17db0 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62      if( !omitTab
17dc0 6c 65 20 7c 7c 20 63 6f 64 65 52 6f 77 53 65 74  le || codeRowSet
17dd0 45 61 72 6c 79 20 29 7b 0a 20 20 20 20 20 20 73  Early ){.      s
17de0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17df0 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
17e00 20 69 49 64 78 43 75 72 2c 20 72 31 29 3b 0a 20   iIdxCur, r1);. 
17e10 20 20 20 20 20 69 66 28 20 63 6f 64 65 52 6f 77       if( codeRow
17e20 53 65 74 45 61 72 6c 79 20 29 7b 0a 20 20 20 20  SetEarly ){.    
17e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17e40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53  ddOp2(v, OP_RowS
17e50 65 74 41 64 64 2c 20 72 65 67 52 6f 77 53 65 74  etAdd, regRowSet
17e60 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , r1);.      }el
17e70 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
17e80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17e90 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20   OP_Seek, iCur, 
17ea0 72 31 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65  r1);  /* Deferre
17eb0 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 20 20  d seek */.      
17ec0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
17ed0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17ee0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a  g(pParse, r1);..
17ef0 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68      /* Record th
17f00 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73  e instruction us
17f10 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
17f20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c  the loop. Disabl
17f30 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20  e .    ** WHERE 
17f40 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64  clause terms mad
17f50 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74  e redundant by t
17f60 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73  he index range s
17f70 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  can..    */.    
17f80 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
17f90 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
17fa0 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  _Next;.    pLeve
17fb0 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
17fc0 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
17fd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  f SQLITE_OMIT_OR
17fe0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
17ff0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
18000 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
18010 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20  _MULTI_OR ){.   
18020 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 77 6f   /* Case 4:  Two
18030 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
18040 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ely indexed term
18050 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
18060 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  R.    **.    ** 
18070 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
18080 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
18090 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64  TABLE t1(a,b,c,d
180a0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
180b0 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
180c0 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(a);.    **   C
180d0 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f  REATE INDEX i2 O
180e0 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20  N t1(b);.    ** 
180f0 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
18100 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20  3 ON t1(c);.    
18110 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
18120 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
18130 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52  RE a=5 OR b=7 OR
18140 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29   (c=11 AND d=13)
18150 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
18160 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74  n the example, t
18170 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 69  here are three i
18180 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e  ndexed terms con
18190 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20  nected by OR..  
181a0 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20    ** The top of 
181b0 74 68 65 20 6c 6f 6f 70 20 69 73 20 63 6f 6e 73  the loop is cons
181c0 74 72 75 63 74 65 64 20 62 79 20 63 72 65 61 74  tructed by creat
181d0 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a  ing a RowSet obj
181e0 65 63 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70  ect.    ** and p
181f0 6f 70 75 6c 61 74 69 6e 67 20 69 74 2e 20 20 54  opulating it.  T
18200 68 65 6e 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  hen looping over
18210 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
18220 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a   rowset..    **.
18230 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 4e 75      **        Nu
18240 6c 6c 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  ll 1.    **     
18250 20 20 20 23 20 66 69 6c 6c 20 52 6f 77 53 65 74     # fill RowSet
18260 20 31 20 77 69 74 68 20 65 6e 74 72 69 65 73 20   1 with entries 
18270 77 68 65 72 65 20 61 3d 35 20 75 73 69 6e 67 20  where a=5 using 
18280 69 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  i1.    **       
18290 20 23 20 66 69 6c 6c 20 52 6f 77 73 65 74 20 31   # fill Rowset 1
182a0 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 77 68   with entries wh
182b0 65 72 65 20 62 3d 37 20 75 73 69 6e 67 20 69 32  ere b=7 using i2
182c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 23  .    **        #
182d0 20 66 69 6c 6c 20 52 6f 77 73 65 74 20 31 20 77   fill Rowset 1 w
182e0 69 74 68 20 65 6e 74 72 69 65 73 20 77 68 65 72  ith entries wher
182f0 65 20 63 3d 31 31 20 61 6e 64 20 64 3d 31 33 20  e c=11 and d=13 
18300 69 33 20 61 6e 64 20 74 31 0a 20 20 20 20 2a 2a  i3 and t1.    **
18310 20 20 20 20 20 41 3a 20 52 6f 77 53 65 74 52 65       A: RowSetRe
18320 61 64 20 31 2c 20 42 2c 20 32 0a 20 20 20 20 2a  ad 1, B, 2.    *
18330 2a 20 20 20 20 20 20 20 20 53 65 65 6b 20 20 20  *        Seek   
18340 20 20 20 20 69 2c 20 32 0a 20 20 20 20 2a 2a 0a      i, 2.    **.
18350 20 20 20 20 2a 2a 20 54 68 65 20 62 6f 74 74 6f      ** The botto
18360 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f  m of the loop lo
18370 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  oks like this:. 
18380 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
18390 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 30      Goto       0
183a0 2c 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 42  , A.    **     B
183b0 3a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  :.    */.    int
183c0 20 72 65 67 4f 72 52 6f 77 73 65 74 3b 20 20 20   regOrRowset;   
183d0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
183e0 68 6f 6c 64 69 6e 67 20 74 68 65 20 52 6f 77 53  holding the RowS
183f0 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  et object */.   
18400 20 69 6e 74 20 72 65 67 4e 65 78 74 52 6f 77 69   int regNextRowi
18410 64 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  d;      /* Regis
18420 74 65 72 20 68 6f 6c 64 69 6e 67 20 6e 65 78 74  ter holding next
18430 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 57 68   rowid */.    Wh
18440 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
18450 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
18460 6c 65 74 65 20 4f 52 2d 63 6c 61 75 73 65 20 2a  lete OR-clause *
18470 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  /.    WhereClaus
18480 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20  e *pOrWc;    /* 
18490 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72  The OR-clause br
184a0 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75  oken out into su
184b0 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 57 68  bterms */.    Wh
184c0 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
184d0 3b 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65  ;    /* A single
184e0 20 73 75 62 74 65 72 6d 20 77 69 74 68 69 6e 20   subterm within 
184f0 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 2a 2f  the OR-clause */
18500 0a 20 20 20 20 53 72 63 4c 69 73 74 20 6f 6e 65  .    SrcList one
18510 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Tab;        /* S
18520 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20 6c  hortened table l
18530 69 73 74 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70  ist */.   .    p
18540 54 65 72 6d 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Term = pLevel->p
18550 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a 20 20 20  lan.u.pTerm;.   
18560 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
18570 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18580 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
18590 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20  r==WO_OR );.    
185a0 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
185b0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
185c0 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20  RINFO)!=0 );.   
185d0 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d   pOrWc = &pTerm-
185e0 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
185f0 20 20 20 20 63 6f 64 65 52 6f 77 53 65 74 45 61      codeRowSetEa
18600 72 6c 79 20 3d 20 28 72 65 67 52 6f 77 53 65 74  rly = (regRowSet
18610 3e 3d 30 20 26 26 20 70 57 43 2d 3e 6e 54 65 72  >=0 && pWC->nTer
18620 6d 3d 3d 31 29 20 3f 31 3a 30 3b 0a 0a 20 20 20  m==1) ?1:0;..   
18630 20 69 66 28 20 63 6f 64 65 52 6f 77 53 65 74 45   if( codeRowSetE
18640 61 72 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65  arly ){.      re
18650 67 4f 72 52 6f 77 73 65 74 20 3d 20 72 65 67 52  gOrRowset = regR
18660 6f 77 53 65 74 3b 0a 20 20 20 20 7d 65 6c 73 65  owSet;.    }else
18670 7b 0a 20 20 20 20 20 20 72 65 67 4f 72 52 6f 77  {.      regOrRow
18680 73 65 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  set = sqlite3Get
18690 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
186a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
186b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
186c0 75 6c 6c 2c 20 30 2c 20 72 65 67 4f 72 52 6f 77  ull, 0, regOrRow
186d0 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  set);.    }.    
186e0 6f 6e 65 54 61 62 2e 6e 53 72 63 20 3d 20 31 3b  oneTab.nSrc = 1;
186f0 0a 20 20 20 20 6f 6e 65 54 61 62 2e 6e 41 6c 6c  .    oneTab.nAll
18700 6f 63 20 3d 20 31 3b 0a 20 20 20 20 6f 6e 65 54  oc = 1;.    oneT
18710 61 62 2e 61 5b 30 5d 20 3d 20 2a 70 54 61 62 49  ab.a[0] = *pTabI
18720 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  tem;.    for(j=0
18730 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
18740 3e 61 3b 20 6a 3c 70 4f 72 57 63 2d 3e 6e 54 65  >a; j<pOrWc->nTe
18750 72 6d 3b 20 6a 2b 2b 2c 20 70 4f 72 54 65 72 6d  rm; j++, pOrTerm
18760 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  ++){.      Where
18770 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b  Info *pSubWInfo;
18780 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
18790 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
187a0 69 43 75 72 20 26 26 20 70 4f 72 54 65 72 6d 2d  iCur && pOrTerm-
187b0 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 41  >eOperator!=WO_A
187c0 4e 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ND ) continue;. 
187d0 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d       pSubWInfo =
187e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
187f0 69 6e 28 70 50 61 72 73 65 2c 20 26 6f 6e 65 54  in(pParse, &oneT
18800 61 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  ab, pOrTerm->pEx
18810 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  pr, 0,.         
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
18830 48 45 52 45 5f 46 49 4c 4c 5f 52 4f 57 53 45 54  HERE_FILL_ROWSET
18840 20 7c 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   | WHERE_OMIT_OP
18850 45 4e 20 7c 20 57 48 45 52 45 5f 4f 4d 49 54 5f  EN | WHERE_OMIT_
18860 43 4c 4f 53 45 2c 0a 20 20 20 20 20 20 20 20 20  CLOSE,.         
18870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
18880 65 67 4f 72 52 6f 77 73 65 74 29 3b 0a 20 20 20  egOrRowset);.   
18890 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
188a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
188b0 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62  te3WhereEnd(pSub
188c0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  WInfo);.      }.
188d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
188e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
188f0 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  l(v, addrCont);.
18900 20 20 20 20 69 66 28 20 21 63 6f 64 65 52 6f 77      if( !codeRow
18910 53 65 74 45 61 72 6c 79 20 29 7b 0a 20 20 20 20  SetEarly ){.    
18920 20 20 72 65 67 4e 65 78 74 52 6f 77 69 64 20 3d    regNextRowid =
18930 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
18940 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
18950 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 0a 20 20    addrCont = .  
18960 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18970 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
18980 6f 77 53 65 74 52 65 61 64 2c 20 72 65 67 4f 72  owSetRead, regOr
18990 52 6f 77 73 65 74 2c 61 64 64 72 42 72 6b 2c 72  Rowset,addrBrk,r
189a0 65 67 4e 65 78 74 52 6f 77 69 64 29 3b 0a 20 20  egNextRowid);.  
189b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
189c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp2(v, OP_Seek
189d0 2c 20 69 43 75 72 2c 20 72 65 67 4e 65 78 74 52  , iCur, regNextR
189e0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
189f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
18a00 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 4e 65  eg(pParse, regNe
18a10 78 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  xtRowid);.      
18a20 2f 2a 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  /* sqlite3Releas
18a30 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
18a40 20 72 65 67 4f 72 52 6f 77 73 65 74 29 3b 20 2f   regOrRowset); /
18a50 2f 20 50 72 65 73 65 72 76 65 20 74 68 65 20 52  / Preserve the R
18a60 6f 77 53 65 74 20 2a 2f 0a 20 20 20 20 20 20 70  owSet */.      p
18a70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47  Level->op = OP_G
18a80 6f 74 6f 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  oto;.      pLeve
18a90 6c 2d 3e 70 32 20 3d 20 61 64 64 72 43 6f 6e 74  l->p2 = addrCont
18aa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 69 73 61  ;.    }.    disa
18ab0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
18ac0 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a  pTerm);.  }else.
18ad0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
18ae0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
18af0 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20  ATION */..  {.  
18b00 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68    /* Case 5:  Th
18b10 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
18b20 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
18b30 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
18b40 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
18b50 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
18b60 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
18b70 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
18b80 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
18b90 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20  assert( bRev==0 
18ba0 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
18bb0 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  p = OP_Next;.   
18bc0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
18bd0 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
18be0 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  p2 = 1 + sqlite3
18bf0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18c00 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61  _Rewind, iCur, a
18c10 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65  ddrBrk);.    pLe
18c20 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
18c30 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
18c40 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 63  SCAN_STEP;.    c
18c50 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20 3d  odeRowSetEarly =
18c60 20 30 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61   0;.  }.  notRea
18c70 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70  dy &= ~getMask(p
18c80 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43  WC->pMaskSet, iC
18c90 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  ur);..  /* Inser
18ca0 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
18cb0 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
18cc0 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
18cd0 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
18ce0 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
18cf0 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
18d00 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
18d10 6b 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  k = 0;.  for(pTe
18d20 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
18d30 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
18d40 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
18d50 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74   Expr *pE;.    t
18d60 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
18d70 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
18d80 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65  IRTUAL );.    te
18d90 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
18da0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
18db0 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  DED );.    if( p
18dc0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
18dd0 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
18de0 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
18df0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
18e00 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
18e10 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
18e20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
18e30 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
18e40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
18e50 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
18e60 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
18e70 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
18e80 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
18e90 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63  Join) ){.      c
18ea0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
18eb0 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
18ec0 6c 65 43 6f 6c 43 61 63 68 65 20 2b 3d 20 6b 3b  leColCache += k;
18ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
18ee0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
18ef0 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pE, addrCont, SQ
18f00 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
18f10 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69  ;.    pParse->di
18f20 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 20 2d 3d  sableColCache -=
18f30 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 31 3b 0a 20   k;.    k = 1;. 
18f40 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
18f50 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
18f60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  .  }..  /* For a
18f70 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
18f80 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
18f90 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64  that will record
18fa0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20   the fact that. 
18fb0 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
18fc0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68   row of the righ
18fd0 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63  t table has matc
18fe0 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62  hed the left tab
18ff0 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  le.  .  */.  if(
19000 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
19010 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  in ){.    pLevel
19020 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71  ->addrFirst = sq
19030 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
19040 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
19050 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19060 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
19070 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
19080 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
19090 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64  ment((v, "record
190a0 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29   LEFT JOIN hit")
190b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
190c0 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63  prClearColumnCac
190d0 68 65 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65  he(pParse, pLeve
190e0 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 20  l->iTabCur);.   
190f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61   sqlite3ExprClea
19100 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  rColumnCache(pPa
19110 72 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  rse, pLevel->iId
19120 78 43 75 72 29 3b 0a 20 20 20 20 66 6f 72 28 70  xCur);.    for(p
19130 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30  Term=pWC->a, j=0
19140 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; j<pWC->nTerm; 
19150 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
19160 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19170 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
19180 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
19190 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
191a0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
191b0 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
191c0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
191d0 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
191e0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
191f0 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
19200 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
19210 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
19220 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e  tReady)!=0 ) con
19230 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
19240 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
19250 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r );.      sqlit
19260 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
19270 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
19280 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pr, addrCont, SQ
19290 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
192a0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
192b0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
192c0 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
192d0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 69 74  .  /*.  ** If it
192e0 20 77 61 73 20 72 65 71 75 65 73 74 65 64 20 74   was requested t
192f0 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
19300 6c 74 73 20 69 6e 20 61 20 72 6f 77 73 65 74 20  lts in a rowset 
19310 61 6e 64 20 74 68 61 74 20 68 61 73 0a 20 20 2a  and that has.  *
19320 2a 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  * not already be
19330 65 6e 20 64 6f 2c 20 74 68 65 6e 20 64 6f 20 73  en do, then do s
19340 6f 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  o now..  */.  if
19350 28 20 72 65 67 52 6f 77 53 65 74 3e 3d 30 20 26  ( regRowSet>=0 &
19360 26 20 21 63 6f 64 65 52 6f 77 53 65 74 45 61 72  & !codeRowSetEar
19370 6c 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  ly ){.    int r1
19380 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19390 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 23 69  pReg(pParse);.#i
193a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
193b0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
193c0 20 20 20 69 66 28 20 20 28 70 4c 65 76 65 6c 2d     if(  (pLevel-
193d0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
193e0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
193f0 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
19400 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19410 32 28 76 2c 20 4f 50 5f 56 52 6f 77 69 64 2c 20  2(v, OP_VRowid, 
19420 69 43 75 72 2c 20 72 31 29 3b 0a 20 20 20 20 7d  iCur, r1);.    }
19430 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
19440 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
19450 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19460 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 72 31 29  Rowid, iCur, r1)
19470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
19480 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19490 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 2c 20 72   OP_RowSetAdd, r
194a0 65 67 52 6f 77 53 65 74 2c 20 72 31 29 3b 0a 20  egRowSet, r1);. 
194b0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
194c0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
194d0 20 72 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   r1);.  }..  ret
194e0 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a  urn notReady;.}.
194f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
19500 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
19510 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
19520 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74  riable holds a t
19530 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ext description 
19540 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65  of query plan ge
19550 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  nerated.** by th
19560 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61  e most recent ca
19570 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
19580 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68  reBegin().  Each
19590 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65   call to WhereBe
195a0 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65  gin.** overwrite
195b0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20  s the previous. 
195c0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
195d0 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  n is used for te
195e0 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61  sting and.** ana
195f0 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63  lysis only..*/.c
19600 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72  har sqlite3_quer
19610 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d  y_plan[BMS*2*40]
19620 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68  ;  /* Text of th
19630 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63  e join */.static
19640 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b   int nQPlan = 0;
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19660 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20   Next free slow 
19670 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d  in _query_plan[]
19680 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
19690 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a  QLITE_TEST */...
196a0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
196b0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
196c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
196d0 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71  whereInfoFree(sq
196e0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
196f0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
19700 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
19710 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
19720 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
19730 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
19740 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
19750 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  ex_info *pInfo =
19760 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49   pWInfo->a[i].pI
19770 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  dxInfo;.      if
19780 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ( pInfo ){.     
19790 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f     assert( pInfo
197a0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
197b0 74 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  tr==0 || db->mal
197c0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
197d0 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e       if( pInfo->
197e0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
197f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
19800 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f  lite3_free(pInfo
19810 2d 3e 69 64 78 53 74 72 29 3b 0a 09 7d 0a 20 20  ->idxStr);..}.  
19820 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
19830 72 65 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a  ree(db, pInfo);.
19840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19850 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
19860 61 72 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b  ar(pWInfo->pWC);
19870 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
19880 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
19890 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
198a0 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
198b0 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
198c0 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
198d0 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
198e0 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
198f0 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
19900 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
19910 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
19920 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
19930 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
19940 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
19950 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
19960 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
19970 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
19980 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
19990 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
199a0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
199b0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
199c0 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
199d0 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
199e0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
199f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
19a00 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
19a10 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
19a20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
19a30 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
19a40 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
19a50 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
19a60 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
19a70 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19a80 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
19a90 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
19aa0 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
19ab0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
19ac0 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
19ad0 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
19ae0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
19af0 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
19b00 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
19b10 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
19b20 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
19b30 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
19b40 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
19b50 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
19b60 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
19b70 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
19b80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
19b90 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
19ba0 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
19bb0 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
19bc0 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
19bd0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
19be0 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
19bf0 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
19c00 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
19c10 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
19c20 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
19c30 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
19c40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
19c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c60 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
19c70 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
19c80 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
19ca0 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
19cb0 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
19cc0 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
19cd0 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
19ce0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
19cf0 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
19d00 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
19d10 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
19d20 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
19d30 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
19d40 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
19d50 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
19d60 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
19d70 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
19d80 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
19d90 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
19da0 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
19db0 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
19dc0 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
19dd0 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
19de0 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
19df0 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
19e00 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
19e10 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
19e20 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
19e30 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
19e40 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
19e50 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
19e60 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
19e70 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
19e80 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
19e90 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
19ea0 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
19eb0 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
19ec0 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
19ed0 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
19ee0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
19ef0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
19f00 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
19f10 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
19f20 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
19f30 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
19f40 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
19f50 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
19f60 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
19f70 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
19f80 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
19f90 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
19fa0 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
19fb0 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
19fc0 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
19fd0 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
19fe0 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
19ff0 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
1a000 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
1a010 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
1a020 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
1a030 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
1a040 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
1a050 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
1a060 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1a070 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
1a080 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
1a090 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
1a0a0 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
1a0b0 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
1a0c0 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
1a0d0 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
1a0e0 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
1a0f0 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
1a100 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
1a110 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
1a120 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
1a130 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
1a140 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
1a150 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
1a160 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
1a170 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
1a180 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
1a190 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
1a1a0 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
1a1b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
1a1c0 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
1a1d0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
1a1e0 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
1a1f0 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
1a200 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
1a210 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
1a220 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
1a230 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
1a240 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
1a250 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
1a260 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
1a270 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
1a280 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
1a290 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
1a2a0 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
1a2b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
1a2c0 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
1a2d0 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
1a2e0 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
1a2f0 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
1a300 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
1a310 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
1a320 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
1a330 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
1a340 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
1a350 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
1a360 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
1a370 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
1a380 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
1a390 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
1a3a0 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
1a3b0 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
1a3c0 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
1a3d0 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
1a3e0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
1a3f0 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
1a400 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
1a410 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
1a420 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
1a430 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
1a440 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
1a450 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
1a460 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
1a470 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
1a480 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
1a490 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
1a4a0 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
1a4b0 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
1a4c0 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
1a4d0 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
1a4e0 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
1a4f0 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
1a500 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72  SING.**.** *ppOr
1a510 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74  derBy is a point
1a520 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  er to the ORDER 
1a530 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  BY clause of a S
1a540 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1a550 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
1a560 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
1a570 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
1a580 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
1a590 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
1a5a0 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
1a5b0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
1a5c0 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70  atement, then pp
1a5d0 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e  OrderBy is NULL.
1a5e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64  .**.** If an ind
1a5f0 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 73  ex can be used s
1a600 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74 75 72  o that the natur
1a610 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  al output order 
1a620 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  of the table.** 
1a630 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20  scan is correct 
1a640 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
1a650 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
1a660 61 74 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  at index is used
1a670 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72   and.** *ppOrder
1a680 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  By is set to NUL
1a690 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  L.  This is an o
1a6a0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74  ptimization that
1a6b0 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20   prevents an.** 
1a6c0 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74  unnecessary sort
1a6d0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
1a6e0 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61  et if an index a
1a6f0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
1a700 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  he.** ORDER BY c
1a710 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65 78  lause already ex
1a720 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ists..**.** If t
1a730 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
1a740 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20  loops cannot be 
1a750 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76  arranged to prov
1a760 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  ide the correct.
1a770 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c  ** output order,
1a780 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64   then the *ppOrd
1a790 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65  erBy is unchange
1a7a0 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  d..*/.WhereInfo 
1a7b0 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
1a7c0 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
1a7d0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
1a7e0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
1a7f0 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1a800 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
1a810 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61  A list of all ta
1a820 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e  bles to be scann
1a830 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
1a840 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  here,         /*
1a850 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1a860 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
1a870 2a 2a 70 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20  **ppOrderBy, /* 
1a880 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  An ORDER BY clau
1a890 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
1a8a0 20 75 38 20 77 63 74 72 6c 46 6c 61 67 73 2c 20   u8 wctrlFlags, 
1a8b0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
1a8c0 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
1a8d0 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
1a8e0 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69  liteInt.h */.  i
1a8f0 6e 74 20 72 65 67 52 6f 77 53 65 74 20 20 20 20  nt regRowSet    
1a900 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1a910 20 68 6f 6c 64 20 52 6f 77 53 65 74 20 69 66 20   hold RowSet if 
1a920 57 48 45 52 45 5f 46 49 4c 4c 5f 52 4f 57 53 45  WHERE_FILL_ROWSE
1a930 54 20 69 73 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  T is set */.){. 
1a940 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1a950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1a960 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1a970 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1a980 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
1a990 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
1a9a0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
1a9b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
1a9c0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1a9d0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
1a9e0 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
1a9f0 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
1aa00 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
1aa10 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  y;          /* C
1aa20 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
1aa30 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e  not yet position
1aa40 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  ed */.  WhereMas
1aa50 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
1aa60 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
1aa70 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f  sion mask set */
1aa80 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1aa90 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
1aaa0 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
1aab0 69 6f 6e 20 6f 66 20 74 68 65 20 57 48 45 52 45  ion of the WHERE
1aac0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
1aad0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1aae0 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20   *pTabItem;  /* 
1aaf0 41 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66  A single entry f
1ab00 72 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a  rom pTabList */.
1ab10 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1ab20 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  evel;           
1ab30 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65    /* A single le
1ab40 76 65 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66  vel in the pWInf
1ab50 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o list */.  int 
1ab60 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20  iFrom;          
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ab80 69 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d  irst unused FROM
1ab90 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
1aba0 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67  */.  int andFlag
1abb0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1abc0 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e  /* AND-ed combin
1abd0 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43  ation of all pWC
1abe0 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f  ->a[].wtFlags */
1abf0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ac10 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1ac20 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  tion */.  ExprLi
1ac30 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 30  st *pOrderBy = 0
1ac40 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  ;..  /* The numb
1ac50 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
1ac60 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ac70 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
1ac80 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
1ac90 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
1aca0 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  sk .  */.  if( p
1acb0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d  TabList->nSrc>BM
1acc0 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S ){.    sqlite3
1acd0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ace0 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62   "at most %d tab
1acf0 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20  les in a join", 
1ad00 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  BMS);.    return
1ad10 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   0;.  }..  if( p
1ad20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1ad30 70 4f 72 64 65 72 42 79 20 3d 20 2a 70 70 4f 72  pOrderBy = *ppOr
1ad40 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  derBy;.  }..  /*
1ad50 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
1ad60 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65  itialize the Whe
1ad70 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
1ad80 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
1ad90 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72  e the.  ** retur
1ada0 6e 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  n value..  */.  
1adb0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1adc0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
1add0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1ade0 64 62 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20  db,  .          
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
1ae00 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 0a 20 20  of(WhereInfo).  
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae20 20 20 20 20 2b 20 28 70 54 61 62 4c 69 73 74 2d      + (pTabList-
1ae30 3e 6e 53 72 63 2d 31 29 2a 73 69 7a 65 6f 66 28  >nSrc-1)*sizeof(
1ae40 57 68 65 72 65 4c 65 76 65 6c 29 0a 20 20 20 20  WhereLevel).    
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae60 20 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65    + sizeof(Where
1ae70 43 6c 61 75 73 65 29 0a 20 20 20 20 20 20 20 20  Clause).        
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
1ae90 73 69 7a 65 6f 66 28 57 68 65 72 65 4d 61 73 6b  sizeof(WhereMask
1aea0 53 65 74 29 0a 20 20 20 20 20 20 20 20 20 20 20  Set).           
1aeb0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
1aec0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1aed0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
1aee0 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
1aef0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54  nfo->nLevel = pT
1af00 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20  abList->nSrc;.  
1af10 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
1af20 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
1af30 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
1af40 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
1af50 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ->iBreak = sqlit
1af60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1af70 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 72 65  v);.  pWInfo->re
1af80 67 52 6f 77 53 65 74 20 3d 20 28 77 63 74 72 6c  gRowSet = (wctrl
1af90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 49  Flags & WHERE_FI
1afa0 4c 4c 5f 52 4f 57 53 45 54 29 20 3f 20 72 65 67  LL_ROWSET) ? reg
1afb0 52 6f 77 53 65 74 20 3a 20 2d 31 3b 0a 20 20 70  RowSet : -1;.  p
1afc0 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 70 57 43  WInfo->pWC = pWC
1afd0 20 3d 20 28 57 68 65 72 65 43 6c 61 75 73 65 2a   = (WhereClause*
1afe0 29 26 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e  )&pWInfo->a[pWIn
1aff0 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 70  fo->nLevel];.  p
1b000 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1b010 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a  s = wctrlFlags;.
1b020 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 28 57 68    pMaskSet = (Wh
1b030 65 72 65 4d 61 73 6b 53 65 74 2a 29 26 70 57 43  ereMaskSet*)&pWC
1b040 5b 31 5d 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69 74  [1];..  /* Split
1b050 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1b060 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20  e into separate 
1b070 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
1b080 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73  here each.  ** s
1b090 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
1b0a0 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20  separated by an 
1b0b0 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
1b0c0 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74  */.  initMaskSet
1b0d0 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68  (pMaskSet);.  wh
1b0e0 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 57  ereClauseInit(pW
1b0f0 43 2c 20 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C, pParse, pMask
1b100 53 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Set);.  sqlite3E
1b110 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73  xprCodeConstants
1b120 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 29  (pParse, pWhere)
1b130 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70  ;.  whereSplit(p
1b140 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41  WC, pWhere, TK_A
1b150 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53  ND);.    .  /* S
1b160 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57  pecial case: a W
1b170 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
1b180 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45   is constant.  E
1b190 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a  valuate the.  **
1b1a0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
1b1b0 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72  either jump over
1b1c0 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65   all of the code
1b1d0 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20   or fall thru.. 
1b1e0 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65   */.  if( pWhere
1b1f0 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
1b200 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  Src==0 || sqlite
1b210 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
1b220 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20  otJoin(pWhere)) 
1b230 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1b240 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1b250 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f  , pWhere, pWInfo
1b260 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45  ->iBreak, SQLITE
1b270 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
1b280 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
1b290 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  }..  /* Assign a
1b2a0 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69   bit from the bi
1b2b0 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74  tmask to every t
1b2c0 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  erm in the FROM 
1b2d0 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
1b2e0 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67  * When assigning
1b2f0 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20   bitmask values 
1b300 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63  to FROM clause c
1b310 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20  ursors, it must 
1b320 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65  be.  ** the case
1b330 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68   that if X is th
1b340 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68  e bitmask for th
1b350 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75  e N-th FROM clau
1b360 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a  se term then.  *
1b370 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  * the bitmask fo
1b380 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  r all FROM claus
1b390 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c  e terms to the l
1b3a0 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  eft of the N-th 
1b3b0 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d  term.  ** is (X-
1b3c0 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73  1).   An express
1b3d0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ion from the ON 
1b3e0 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
1b3f0 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20   JOIN can use.  
1b400 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67  ** its Expr.iRig
1b410 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75  htJoinTable valu
1b420 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69  e to find the bi
1b430 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67  tmask of the rig
1b440 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66  ht table.  ** of
1b450 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74   the join.  Subt
1b460 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d  racting one from
1b470 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
1b480 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61   bitmask gives a
1b490 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f  .  ** bitmask fo
1b4a0 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
1b4b0 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
1b4c0 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74  join.  Knowing t
1b4d0 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20  he bitmask.  ** 
1b4e0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
1b4f0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
1b500 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70  left join is imp
1b510 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20  ortant.  Ticket 
1b520 23 33 30 31 35 2e 0a 20 20 2a 2f 0a 20 20 66 6f  #3015..  */.  fo
1b530 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
1b540 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
1b550 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d     createMask(pM
1b560 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
1b570 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
1b580 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
1b590 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d  BUG.  {.    Bitm
1b5a0 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20  ask toTheLeft = 
1b5b0 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
1b5c0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
1b5d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69  ; i++){.      Bi
1b5e0 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73  tmask m = getMas
1b5f0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
1b600 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
1b610 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  or);.      asser
1b620 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c  t( (m-1)==toTheL
1b630 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54  eft );.      toT
1b640 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20  heLeft |= m;.   
1b650 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1b660 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20   /* Analyze all 
1b670 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73  of the subexpres
1b680 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61  sions.  Note tha
1b690 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20  t exprAnalyze() 
1b6a0 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e  might.  ** add n
1b6b0 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
1b6c0 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
1b6d0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1b6e0 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20  e.  We do not.  
1b6f0 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79  ** want to analy
1b700 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c  ze these virtual
1b710 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74   terms, so start
1b720 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68   analyzing at th
1b730 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77  e end.  ** and w
1b740 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74  ork forward so t
1b750 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69  hat the added vi
1b760 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20  rtual terms are 
1b770 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e  never processed.
1b780 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c  .  */.  exprAnal
1b790 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c  yzeAll(pTabList,
1b7a0 20 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d   pWC);.  if( db-
1b7b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1b7c0 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
1b7d0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a  eginError;.  }..
1b7e0 20 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62    /* Chose the b
1b7f0 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65  est index to use
1b800 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
1b810 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1b820 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
1b830 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e  is loop fills in
1b840 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
1b850 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ields:.  **.  **
1b860 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70     pWInfo->a[].p
1b870 49 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64  Idx      The ind
1b880 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
1b890 69 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  is level of the 
1b8a0 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49  loop..  **   pWI
1b8b0 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67 73  nfo->a[].wsFlags
1b8c0 20 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61     WHERE_xxx fla
1b8d0 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
1b8e0 74 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70  th pIdx.  **   p
1b8f0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20  WInfo->a[].nEq  
1b900 20 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20       The number 
1b910 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  of == and IN con
1b920 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20  straints.  **   
1b930 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f  pWInfo->a[].iFro
1b940 6d 20 20 20 20 20 57 68 69 63 68 20 74 65 72 6d  m     Which term
1b950 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1b960 75 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64  use is being cod
1b970 65 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ed.  **   pWInfo
1b980 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20  ->a[].iTabCur   
1b990 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1b9a0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
1b9b0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57   table.  **   pW
1b9c0 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75  Info->a[].iIdxCu
1b9d0 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72  r   The VDBE cur
1b9e0 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  sor for the inde
1b9f0 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  x.  **   pWInfo-
1ba00 3e 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20 57  >a[].pTerm     W
1ba10 68 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f 5f  hen wsFlags==WO_
1ba20 4f 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75 73  OR, the OR-claus
1ba30 65 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a  e term.  **.  **
1ba40 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
1ba50 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20  figures out the 
1ba60 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66  nesting order of
1ba70 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
1ba80 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e  ROM.  ** clause.
1ba90 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
1baa0 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
1bab0 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61    pTabItem = pTa
1bac0 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76  bList->a;.  pLev
1bad0 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a  el = pWInfo->a;.
1bae0 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b    andFlags = ~0;
1baf0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
1bb00 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
1bb10 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
1bb20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70  for(i=iFrom=0, p
1bb30 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
1bb40 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1bb50 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
1bb60 29 7b 0a 20 20 20 20 57 68 65 72 65 43 6f 73 74  ){.    WhereCost
1bb70 20 62 65 73 74 50 6c 61 6e 3b 20 20 20 20 20 20   bestPlan;      
1bb80 20 20 20 2f 2a 20 4d 6f 73 74 20 65 66 66 69 63     /* Most effic
1bb90 69 65 6e 74 20 70 6c 61 6e 20 73 65 65 6e 20 73  ient plan seen s
1bba0 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 49 6e 64  o far */.    Ind
1bbb0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
1bbc0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1bbd0 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65  x for FROM table
1bbe0 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a   at pTabItem */.
1bbf0 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20      int j;      
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1bc20 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20  ver FROM tables 
1bc30 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4a  */.    int bestJ
1bc40 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1bc50 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
1bc60 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d  of j */.    Bitm
1bc70 61 73 6b 20 6d 3b 20 20 20 20 20 20 20 20 20 20  ask m;          
1bc80 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
1bc90 73 6b 20 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f  sk value for j o
1bca0 72 20 62 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69  r bestJ */.    i
1bcb0 6e 74 20 6f 6e 63 65 20 3d 20 30 3b 20 20 20 20  nt once = 0;    
1bcc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1bcd0 75 65 20 77 68 65 6e 20 66 69 72 73 74 20 74 61  ue when first ta
1bce0 62 6c 65 20 69 73 20 73 65 65 6e 20 2a 2f 0a 0a  ble is seen */..
1bcf0 20 20 20 20 6d 65 6d 73 65 74 28 26 62 65 73 74      memset(&best
1bd00 50 6c 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Plan, 0, sizeof(
1bd10 62 65 73 74 50 6c 61 6e 29 29 3b 0a 20 20 20 20  bestPlan));.    
1bd20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 3d  bestPlan.rCost =
1bd30 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
1bd40 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d  .    for(j=iFrom
1bd50 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62  , pTabItem=&pTab
1bd60 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54  List->a[j]; j<pT
1bd70 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b  abList->nSrc; j+
1bd80 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a  +, pTabItem++){.
1bd90 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74 52        int doNotR
1bda0 65 6f 72 64 65 72 3b 20 20 2f 2a 20 54 72 75 65  eorder;  /* True
1bdb0 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 73   if this table s
1bdc0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f  hould not be reo
1bdd0 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1bde0 57 68 65 72 65 43 6f 73 74 20 73 43 6f 73 74 3b  WhereCost sCost;
1bdf0 20 20 20 2f 2a 20 43 6f 73 74 20 69 6e 66 6f 72     /* Cost infor
1be00 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 73 74  mation from best
1be10 49 6e 64 65 78 28 29 20 2a 2f 0a 0a 20 20 20 20  Index() */..    
1be20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d    doNotReorder =
1be30 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69    (pTabItem->joi
1be40 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
1be50 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a  |JT_CROSS))!=0;.
1be60 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 26        if( once &
1be70 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29  & doNotReorder )
1be80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d 20   break;.      m 
1be90 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
1bea0 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  et, pTabItem->iC
1beb0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
1bec0 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29  ( (m & notReady)
1bed0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
1bee0 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46  f( j==iFrom ) iF
1bef0 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  rom++;.        c
1bf00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
1bf10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1bf20 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b  TabItem->pTab );
1bf30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bf40 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1bf50 45 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69  E.      if( IsVi
1bf60 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e  rtual(pTabItem->
1bf70 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
1bf80 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1bf90 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 3b 20 2f  nfo *pVtabIdx; /
1bfa0 2a 20 43 75 72 72 65 6e 74 20 76 69 72 74 75 61  * Current virtua
1bfb0 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  l index */.     
1bfc0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
1bfd0 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66  _info **ppIdxInf
1bfe0 6f 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a  o = &pWInfo->a[j
1bff0 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20  ].pIdxInfo;.    
1c000 20 20 20 20 73 43 6f 73 74 2e 72 43 6f 73 74 20      sCost.rCost 
1c010 3d 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64  = bestVirtualInd
1c020 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  ex(pParse, pWC, 
1c030 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61  pTabItem, notRea
1c040 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy,.            
1c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c060 20 20 20 20 20 20 20 20 20 20 20 70 70 4f 72 64             ppOrd
1c070 65 72 42 79 20 3f 20 2a 70 70 4f 72 64 65 72 42  erBy ? *ppOrderB
1c080 79 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20 20  y : 0, i==0,.   
1c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0b0 20 20 20 20 70 70 49 64 78 49 6e 66 6f 29 3b 0a      ppIdxInfo);.
1c0c0 20 20 20 20 20 20 20 20 73 43 6f 73 74 2e 70 6c          sCost.pl
1c0d0 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  an.wsFlags = WHE
1c0e0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
1c0f0 0a 20 20 20 20 20 20 20 20 73 43 6f 73 74 2e 70  .        sCost.p
1c100 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d  lan.u.pVtabIdx =
1c110 20 70 56 74 61 62 49 64 78 20 3d 20 2a 70 70 49   pVtabIdx = *ppI
1c120 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  dxInfo;.        
1c130 69 66 28 20 70 56 74 61 62 49 64 78 20 26 26 20  if( pVtabIdx && 
1c140 70 56 74 61 62 49 64 78 2d 3e 6f 72 64 65 72 42  pVtabIdx->orderB
1c150 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20  yConsumed ){.   
1c160 20 20 20 20 20 20 20 73 43 6f 73 74 2e 70 6c 61         sCost.pla
1c170 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  n.wsFlags = WHER
1c180 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 7c  E_VIRTUALTABLE |
1c190 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a   WHERE_ORDERBY;.
1c1a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c1b0 20 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e 45 71    sCost.plan.nEq
1c1c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
1c1d0 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  ( (SQLITE_BIG_DB
1c1e0 4c 2f 32 2e 30 29 3c 73 43 6f 73 74 2e 72 43 6f  L/2.0)<sCost.rCo
1c1f0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
1c200 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73 20 6e  /* The cost is n
1c210 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
1c220 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
1c230 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74 68 65  ITE_BIG_DBL (the
1c240 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
1c250 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f  ital value of lo
1c260 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73  westCost in this
1c270 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c   loop. If it is,
1c280 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20   then.          
1c290 2a 2a 20 74 68 65 20 28 63 6f 73 74 3c 6c 6f 77  ** the (cost<low
1c2a0 65 73 74 43 6f 73 74 29 20 74 65 73 74 20 62 65  estCost) test be
1c2b0 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  low will never b
1c2c0 65 20 74 72 75 65 2e 0a 20 20 20 20 20 20 20 20  e true..        
1c2d0 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20    */ .          
1c2e0 73 43 6f 73 74 2e 72 43 6f 73 74 20 3d 20 28 53  sCost.rCost = (S
1c2f0 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e  QLITE_BIG_DBL/2.
1c300 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
1c310 20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69      }else .#endi
1c320 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
1c330 20 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72    bestIndex(pPar
1c340 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65  se, pWC, pTabIte
1c350 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20  m, notReady,.   
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1c370 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42  i==0 && ppOrderB
1c380 79 29 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20  y) ? *ppOrderBy 
1c390 3a 20 30 2c 20 26 73 43 6f 73 74 29 3b 0a 20 20  : 0, &sCost);.  
1c3a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c3b0 6f 6e 63 65 3d 3d 30 20 7c 7c 20 73 43 6f 73 74  once==0 || sCost
1c3c0 2e 72 43 6f 73 74 3c 62 65 73 74 50 6c 61 6e 2e  .rCost<bestPlan.
1c3d0 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rCost ){.       
1c3e0 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20   once = 1;.     
1c3f0 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 43     bestPlan = sC
1c400 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 62 65 73  ost;.        bes
1c410 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a  tJ = j;.      }.
1c420 20 20 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52        if( doNotR
1c430 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a  eorder ) break;.
1c440 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1c450 28 20 6f 6e 63 65 20 29 3b 0a 20 20 20 20 61 73  ( once );.    as
1c460 73 65 72 74 28 20 6e 6f 74 52 65 61 64 79 20 26  sert( notReady &
1c470 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
1c480 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62  t, pTabList->a[b
1c490 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29  estJ].iCursor) )
1c4a0 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
1c4b0 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
1c4c0 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25   selects table %
1c4d0 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22  d for loop %d\n"
1c4e0 2c 20 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20  , bestJ,.       
1c4f0 20 20 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66      pLevel-pWInf
1c500 6f 2d 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20  o->a));.    if( 
1c510 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77  (bestPlan.plan.w
1c520 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
1c530 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20  RDERBY)!=0 ){.  
1c540 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
1c550 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e   0;.    }.    an
1c560 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 50 6c  dFlags &= bestPl
1c570 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b  an.plan.wsFlags;
1c580 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  .    pLevel->pla
1c590 6e 20 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  n = bestPlan.pla
1c5a0 6e 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74 50  n;.    if( bestP
1c5b0 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
1c5c0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
1c5d0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
1c5e0 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
1c5f0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1c600 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
1c610 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d  vel->iIdxCur = -
1c620 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74  1;.    }.    not
1c630 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
1c640 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
1c650 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69  List->a[bestJ].i
1c660 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65  Cursor);.    pLe
1c670 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65 73  vel->iFrom = bes
1c680 74 4a 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  tJ;..    /* Chec
1c690 6b 20 74 68 61 74 20 69 66 20 74 68 65 20 74 61  k that if the ta
1c6a0 62 6c 65 20 73 63 61 6e 6e 65 64 20 62 79 20 74  ble scanned by t
1c6b0 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69  his loop iterati
1c6c0 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20 20 2a 2a  on had an.    **
1c6d0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1c6e0 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 69  se attached to i
1c6f0 74 2c 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65  t, that the name
1c700 64 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e 67  d index is being
1c710 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  .    ** used for
1c720 20 74 68 65 20 73 63 61 6e 2e 20 49 66 20 6e 6f   the scan. If no
1c730 74 2c 20 74 68 65 6e 20 71 75 65 72 79 20 63 6f  t, then query co
1c740 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73 20 66 61  mpilation has fa
1c750 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65 74  iled..    ** Ret
1c760 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
1c770 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20    */.    pIdx = 
1c780 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74  pTabList->a[best
1c790 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 61  J].pIndex;.    a
1c7a0 73 73 65 72 74 28 20 21 70 49 64 78 0a 20 20 20  ssert( !pIdx.   
1c7b0 20 20 20 20 20 20 20 20 7c 7c 20 28 62 65 73 74          || (best
1c7c0 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
1c7d0 73 26 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  s&WHERE_INDEXED)
1c7e0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
1c7f0 7c 20 70 49 64 78 3d 3d 62 65 73 74 50 6c 61 6e  | pIdx==bestPlan
1c800 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 29 3b 0a  .plan.u.pIdx );.
1c810 20 20 20 20 69 66 28 20 70 49 64 78 0a 20 20 20      if( pIdx.   
1c820 20 20 26 26 20 28 28 62 65 73 74 50 6c 61 6e 2e    && ((bestPlan.
1c830 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1c840 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30  HERE_INDEXED)==0
1c850 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 62 65 73  .         || bes
1c860 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64  tPlan.plan.u.pId
1c870 78 21 3d 70 49 64 78 29 0a 20 20 20 20 29 7b 0a  x!=pIdx).    ){.
1c880 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1c890 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
1c8a0 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 3a  annot use index:
1c8b0 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d   %s", pIdx->zNam
1c8c0 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77  e);.      goto w
1c8d0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
1c8e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52      }.  }.  WHER
1c8f0 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74  ETRACE(("*** Opt
1c900 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
1c910 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20  ***\n"));.  if( 
1c920 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c930 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
1c940 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
1c950 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  }..  /* If the t
1c960 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20  otal query only 
1c970 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67 6c 65  selects a single
1c980 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65 20 4f   row, then the O
1c990 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61  RDER BY.  ** cla
1c9a0 75 73 65 20 69 73 20 69 72 72 65 6c 65 76 61 6e  use is irrelevan
1c9b0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 61  t..  */.  if( (a
1c9c0 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ndFlags & WHERE_
1c9d0 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20 70 70  UNIQUE)!=0 && pp
1c9e0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2a  OrderBy ){.    *
1c9f0 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  ppOrderBy = 0;. 
1ca00 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1ca10 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44  caller is an UPD
1ca20 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
1ca30 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
1ca40 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20  requesting.  ** 
1ca50 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73  to use a one-pas
1ca60 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74  s algorithm, det
1ca70 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69  ermine if this i
1ca80 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20  s appropriate.. 
1ca90 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73 73   ** The one-pass
1caa0 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20   algorithm only 
1cab0 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48 45  works if the WHE
1cac0 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
1cad0 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20 73  aints.  ** the s
1cae0 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61  tatement to upda
1caf0 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e  te a single row.
1cb00 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1cb10 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
1cb20 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
1cb30 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
1cb40 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
1cb50 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
1cb60 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
1cb70 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 26 26  S_DESIRED)!=0 &&
1cb80 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45   (andFlags & WHE
1cb90 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b  RE_UNIQUE)!=0 ){
1cba0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  .    pWInfo->okO
1cbb0 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20  nePass = 1;.    
1cbc0 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c 61  pWInfo->a[0].pla
1cbd0 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48  n.wsFlags &= ~WH
1cbe0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
1cbf0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c  }..  /* Open all
1cc00 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
1cc10 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20  TabList and any 
1cc20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64  indices selected
1cc30 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68   for.  ** search
1cc40 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73  ing those tables
1cc50 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1cc60 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
1cc70 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a  (pParse, -1); /*
1cc80 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b   Insert the cook
1cc90 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f  ie verifier Goto
1cca0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
1ccb0 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
1ccc0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1ccd0 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
1cce0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1ccf0 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
1cd00 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
1cd10 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
1cd20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
1cd30 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1cd40 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a   table/index */.
1cd50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cd60 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20  OMIT_EXPLAIN.   
1cd70 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
1cd80 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20  lain==2 ){.     
1cd90 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20   char *zMsg;.   
1cda0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1cdb0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1cdc0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
1cdd0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
1cde0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1cdf0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 54 41  3MPrintf(db, "TA
1ce00 42 4c 45 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  BLE %s", pItem->
1ce10 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
1ce20 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
1ce30 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
1ce40 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1ce50 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1ce60 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  AS %s", zMsg, pI
1ce70 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1ce80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1ce90 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
1cea0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1ceb0 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20  DEXED)!=0 ){.   
1cec0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1ced0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1cee0 7a 4d 73 67 2c 20 22 25 73 20 57 49 54 48 20 49  zMsg, "%s WITH I
1cef0 4e 44 45 58 20 25 73 22 2c 0a 20 20 20 20 20 20  NDEX %s",.      
1cf00 20 20 20 20 20 7a 4d 73 67 2c 20 70 4c 65 76 65       zMsg, pLeve
1cf10 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
1cf20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  zName);.      }e
1cf30 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
1cf40 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1cf50 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b  HERE_MULTI_OR ){
1cf60 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
1cf70 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1cf80 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49  db, zMsg, "%s VI
1cf90 41 20 4d 55 4c 54 49 2d 49 4e 44 45 58 20 55 4e  A MULTI-INDEX UN
1cfa0 49 4f 4e 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  ION", zMsg);.   
1cfb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
1cfc0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1cfd0 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44  s & (WHERE_ROWID
1cfe0 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
1cff0 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20  RANGE) ){.      
1d000 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1d010 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1d020 67 2c 20 22 25 73 20 55 53 49 4e 47 20 50 52 49  g, "%s USING PRI
1d030 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29  MARY KEY", zMsg)
1d040 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
1d050 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1d060 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
1d070 20 65 6c 73 65 20 69 66 28 20 28 70 4c 65 76 65   else if( (pLeve
1d080 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1d090 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1d0a0 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
1d0b0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
1d0c0 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78  x_info *pVtabIdx
1d0d0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
1d0e0 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20  u.pVtabIdx;.    
1d0f0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1d100 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1d110 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c  Msg, "%s VIRTUAL
1d120 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a   TABLE INDEX %d:
1d130 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20  %s", zMsg,.     
1d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d150 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c  VtabIdx->idxNum,
1d160 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74   pVtabIdx->idxSt
1d170 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  r);.      }.#end
1d180 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  if.      if( pLe
1d190 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1d1a0 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
1d1b0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  Y ){.        zMs
1d1c0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1d1d0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1d1e0 73 20 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d 73  s ORDER BY", zMs
1d1f0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1d200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d210 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
1d220 6e 2c 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  n, i, pLevel->iF
1d230 72 6f 6d 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  rom, 0, zMsg, P4
1d240 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
1d250 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1d260 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
1d270 2f 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  /.    pTabItem =
1d280 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
1d290 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
1d2a0 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65    pTab = pTabIte
1d2b0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62  m->pTab;.    iDb
1d2c0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1d2d0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
1d2e0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1d2f0 61 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  a);.    if( (pTa
1d300 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
1d310 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c  _Ephemeral)!=0 |
1d320 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
1d330 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e  ) continue;.#ifn
1d340 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d350 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
1d360 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
1d370 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1d380 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1d390 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  !=0 ){.      int
1d3a0 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
1d3b0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
1d3c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d3d0 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20  p4(v, OP_VOpen, 
1d3e0 69 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  iCur, 0, 0,.    
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d400 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
1d410 29 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 50 34  )pTab->pVtab, P4
1d420 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
1d430 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
1d440 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
1d450 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1d460 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
1d470 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
1d480 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
1d490 5f 4f 50 45 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  _OPEN)==0 ){.   
1d4a0 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e     int op = pWIn
1d4b0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20  fo->okOnePass ? 
1d4c0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f  OP_OpenWrite : O
1d4d0 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
1d4e0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
1d4f0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  le(pParse, pTabI
1d500 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44  tem->iCursor, iD
1d510 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20  b, pTab, op);.  
1d520 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
1d530 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
1d540 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a  ab->nCol<BMS ){.
1d550 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
1d560 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
1d570 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
1d580 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
1d590 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
1d5a0 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
1d5b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1d5c0 6e 67 65 50 32 28 76 2c 20 73 71 6c 69 74 65 33  ngeP2(v, sqlite3
1d5d0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1d5e0 76 29 2d 32 2c 20 6e 29 3b 0a 20 20 20 20 20 20  v)-2, n);.      
1d5f0 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
1d600 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
1d610 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1d620 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
1d630 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
1d640 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
1d650 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
1d660 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1d670 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61 62 49  >iTabCur = pTabI
1d680 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
1d690 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
1d6a0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1d6b0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
1d6c0 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
1d6d0 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  pIx = pLevel->pl
1d6e0 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20  an.u.pIdx;.     
1d6f0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
1d700 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
1d710 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  info(pParse, pIx
1d720 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  );.      int iId
1d730 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
1d740 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73  IdxCur;.      as
1d750 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65  sert( pIx->pSche
1d760 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
1d770 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  a );.      asser
1d780 74 28 20 69 49 64 78 43 75 72 3e 3d 30 20 29 3b  t( iIdxCur>=0 );
1d790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d7a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1d7b0 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c  etNumColumns, 0,
1d7c0 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29   pIx->nColumn+1)
1d7d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d7e0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1d7f0 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75  OpenRead, iIdxCu
1d800 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44  r, pIx->tnum, iD
1d810 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1d820 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1d830 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
1d840 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
1d850 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1d860 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
1d870 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ame));.    }.   
1d880 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1d890 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
1d8a0 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49   iDb);.  }.  pWI
1d8b0 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69  nfo->iTop = sqli
1d8c0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1d8d0 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  dr(v);..  /* Gen
1d8e0 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
1d8f0 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
1d900 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
1d910 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
1d920 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
1d930 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
1d940 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
1d950 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
1d960 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
1d970 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
1d980 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
1d990 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
1d9a0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
1d9b0 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64    notReady = cod
1d9c0 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57  eOneLoopStart(pW
1d9d0 49 6e 66 6f 2c 20 69 2c 20 77 63 74 72 6c 46 6c  Info, i, wctrlFl
1d9e0 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a  ags, notReady);.
1d9f0 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43    }.  pWInfo->iC
1da00 6f 6e 74 69 6e 75 65 20 3d 20 70 57 49 6e 66 6f  ontinue = pWInfo
1da10 2d 3e 61 5b 69 2d 31 5d 2e 61 64 64 72 43 6f 6e  ->a[i-1].addrCon
1da20 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
1da30 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72 20 74  E_TEST  /* For t
1da40 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
1da50 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f  ging use only */
1da60 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20  .  /* Record in 
1da70 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69  the query plan i
1da80 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
1da90 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
1daa0 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  le.  ** and the 
1dab0 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63  index used to ac
1dac0 63 65 73 73 20 69 74 20 28 69 66 20 61 6e 79 29  cess it (if any)
1dad0 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
1dae0 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e  itself.  ** is n
1daf0 6f 74 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d  ot used, its nam
1db00 65 20 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20  e is just '{}'. 
1db10 20 49 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20   If no index is 
1db20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e  used.  ** the in
1db30 64 65 78 20 69 73 20 6c 69 73 74 65 64 20 61 73  dex is listed as
1db40 20 22 7b 7d 22 2e 20 20 49 66 20 74 68 65 20 70   "{}".  If the p
1db50 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73  rimary key is us
1db60 65 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  ed the.  ** inde
1db70 78 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20  x name is '*'.. 
1db80 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1db90 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1dba0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
1dbb0 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  *z;.    int n;. 
1dbc0 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
1dbd0 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70  nfo->a[i];.    p
1dbe0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
1dbf0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
1dc00 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70  From];.    z = p
1dc10 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b  TabItem->zAlias;
1dc20 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
1dc30 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  z = pTabItem->pT
1dc40 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  ab->zName;.    n
1dc50 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1dc60 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e  30(z);.    if( n
1dc70 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
1dc80 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
1dc90 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20  lan)-10 ){.     
1dca0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
1dcb0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1dcc0 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20  E_IDX_ONLY ){.  
1dcd0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
1dce0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
1dcf0 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20  [nQPlan], "{}", 
1dd00 32 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  2);.        nQPl
1dd10 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d  an += 2;.      }
1dd20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
1dd30 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
1dd40 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
1dd50 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  , z, n);.       
1dd60 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
1dd70 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1dd80 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
1dd90 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a  QPlan++] = ' ';.
1dda0 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
1ddb0 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  se( pLevel->plan
1ddc0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1ddd0 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a 20 20 20  _ROWID_EQ );.   
1dde0 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65   testcase( pLeve
1ddf0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1de00 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  & WHERE_ROWID_RA
1de10 4e 47 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70  NGE );.    if( p
1de20 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1de30 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57  ags & (WHERE_ROW
1de40 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
1de50 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20  D_RANGE) ){.    
1de60 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
1de70 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
1de80 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a  lan], "* ", 2);.
1de90 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
1dea0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
1deb0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
1dec0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1ded0 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20  NDEXED)!=0 ){.  
1dee0 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
1def0 74 72 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e  trlen30(pLevel->
1df00 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61  plan.u.pIdx->zNa
1df10 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  me);.      if( n
1df20 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
1df30 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
1df40 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20  lan)-2 ){.      
1df50 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
1df60 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
1df70 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c  lan], pLevel->pl
1df80 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
1df90 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , n);.        nQ
1dfa0 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
1dfb0 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79     sqlite3_query
1dfc0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20  _plan[nQPlan++] 
1dfd0 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20  = ' ';.      }. 
1dfe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dff0 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
1e000 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
1e010 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20  n], "{} ", 3);. 
1e020 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33       nQPlan += 3
1e030 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  ;.    }.  }.  wh
1e040 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26  ile( nQPlan>0 &&
1e050 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
1e060 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27  lan[nQPlan-1]=='
1e070 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   ' ){.    sqlite
1e080 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e  3_query_plan[--n
1e090 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  QPlan] = 0;.  }.
1e0a0 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
1e0b0 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30  plan[nQPlan] = 0
1e0c0 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a  ;.  nQPlan = 0;.
1e0d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1e0e0 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67  _TEST // Testing
1e0f0 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
1e100 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a  se only */..  /*
1e110 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74   Record the cont
1e120 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73  inuation address
1e130 20 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66   in the WhereInf
1e140 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
1e150 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70  en.  ** clean up
1e160 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
1e170 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  /.  return pWInf
1e180 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  o;..  /* Jump he
1e190 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  re if malloc fai
1e1a0 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e  ls */.whereBegin
1e1b0 45 72 72 6f 72 3a 0a 20 20 77 68 65 72 65 49 6e  Error:.  whereIn
1e1c0 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
1e1d0 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  o);.  return 0;.
1e1e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1e1f0 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
1e200 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65   WHERE loop.  Se
1e210 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a  e comments on .*
1e220 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
1e230 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69  gin() for additi
1e240 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1e250 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e260 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49  3WhereEnd(WhereI
1e270 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
1e280 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1e290 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1e2a0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1e2b0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1e2c0 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
1e2d0 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c   *pLevel;.  SrcL
1e2e0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
1e2f0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1e300 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1e310 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
1e320 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f   /* Generate loo
1e330 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  p termination co
1e340 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  de..  */.  sqlit
1e350 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d  e3ExprClearColum
1e360 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 2d  nCache(pParse, -
1e370 31 29 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62  1);.  for(i=pTab
1e380 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  List->nSrc-1; i>
1e390 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c  =0; i--){.    pL
1e3a0 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
1e3b0 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  a[i];.    sqlite
1e3c0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1e3d0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
1e3e0 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  rCont);.    if( 
1e3f0 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e  pLevel->op!=OP_N
1e400 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
1e410 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e420 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c  , pLevel->op, pL
1e430 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
1e440 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ->p2);.      sql
1e450 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1e460 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b  (v, pLevel->p5);
1e470 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1e480 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1e490 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
1e4a0 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75  BLE && pLevel->u
1e4b0 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  .in.nIn>0 ){.   
1e4c0 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
1e4d0 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74   *pIn;.      int
1e4e0 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
1e4f0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1e500 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
1e510 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  rNxt);.      for
1e520 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  (j=pLevel->u.in.
1e530 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c  nIn, pIn=&pLevel
1e540 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a  ->u.in.aInLoop[j
1e550 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  -1]; j>0; j--, p
1e560 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73  In--){.        s
1e570 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1e580 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
1e590 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20  nTop+1);.       
1e5a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e5b0 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
1e5c0 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61  In->iCur, pIn->a
1e5d0 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20  ddrInTop);.     
1e5e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1e5f0 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
1e600 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20  ddrInTop-1);.   
1e610 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1e620 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65  e3DbFree(db, pLe
1e630 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
1e640 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
1e650 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1e660 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
1e670 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69  >addrBrk);.    i
1e680 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
1e690 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  Join ){.      in
1e6a0 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64  t addr;.      ad
1e6b0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1e6c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
1e6d0 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  os, pLevel->iLef
1e6e0 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 73 71  tJoin);.      sq
1e6f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1e700 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
1e710 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
1e720 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
1e730 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
1e740 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
1e750 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e760 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
1e770 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
1e780 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e7a0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1e7b0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
1e7c0 72 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rst);.      sqli
1e7d0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1e7e0 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a  v, addr);.    }.
1e7f0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62    }..  /* The "b
1e800 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68  reak" point is h
1e810 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74  ere, just past t
1e820 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75  he end of the ou
1e830 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53  ter loop..  ** S
1e840 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  et it..  */.  sq
1e850 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1e860 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d  Label(v, pWInfo-
1e870 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20  >iBreak);..  /* 
1e880 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  Close all of the
1e890 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65   cursors that we
1e8a0 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c  re opened by sql
1e8b0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a  ite3WhereBegin..
1e8c0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
1e8d0 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
1e8e0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
1e8f0 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  rc; i++, pLevel+
1e900 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
1e910 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
1e920 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
1e930 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1e940 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  om];.    Table *
1e950 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
1e960 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
1e970 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
1e980 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
1e990 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
1e9a0 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62  eral)!=0 || pTab
1e9b0 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74  ->pSelect ) cont
1e9c0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
1e9d0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
1e9e0 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 43  s & WHERE_OMIT_C
1e9f0 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LOSE)==0 ){.    
1ea00 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
1ea10 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 70 4c 65  kOnePass && (pLe
1ea20 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1ea30 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
1ea40 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
1ea50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ea60 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
1ea70 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
1ea80 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
1ea90 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
1eaa0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1eab0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
1eac0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ead0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1eae0 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65   OP_Close, pLeve
1eaf0 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
1eb00 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1eb10 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20  /* If this scan 
1eb20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d  uses an index, m
1eb30 61 6b 65 20 63 6f 64 65 20 73 75 62 73 74 69 74  ake code substit
1eb40 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64  utions to read d
1eb50 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ata.    ** from 
1eb60 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 72 65  the index in pre
1eb70 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 74  ference to the t
1eb80 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c  able. Sometimes,
1eb90 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   this means.    
1eba0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65  ** the table nee
1ebb0 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1ebc0 66 72 6f 6d 2e 20 54 68 69 73 20 69 73 20 61 20  from. This is a 
1ebd0 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
1ebe0 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65  t,.    ** as the
1ebf0 20 76 64 62 65 20 6c 65 76 65 6c 20 77 61 69 74   vdbe level wait
1ec00 73 20 75 6e 74 69 6c 20 74 68 65 20 74 61 62 6c  s until the tabl
1ec10 65 20 69 73 20 72 65 61 64 20 62 65 66 6f 72 65  e is read before
1ec20 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
1ec30 20 73 65 65 6b 69 6e 67 20 74 68 65 20 74 61 62   seeking the tab
1ec40 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  le cursor to the
1ec50 20 72 65 63 6f 72 64 20 63 6f 72 72 65 73 70 6f   record correspo
1ec60 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  nding to the cur
1ec70 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69  rent.    ** posi
1ec80 74 69 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64 65  tion in the inde
1ec90 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  x..    ** .    *
1eca0 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63  * Calls to the c
1ecb0 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
1ecc0 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33   between sqlite3
1ecd0 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20  WhereBegin and. 
1ece0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65     ** sqlite3Whe
1ecf0 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20  reEnd will have 
1ed00 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61  created code tha
1ed10 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65  t references the
1ed20 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69   table.    ** di
1ed30 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f  rectly.  This lo
1ed40 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61  op scans all tha
1ed50 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66  t code looking f
1ed60 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a  or opcodes.    *
1ed70 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  * that reference
1ed80 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63   the table and c
1ed90 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74  onverts them int
1eda0 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20  o opcodes that. 
1edb0 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20     ** reference 
1edc0 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
1edd0 2f 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  /.    if( (pLeve
1ede0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1edf0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
1ee00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  !=0 ){.      int
1ee10 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20   k, j, last;.   
1ee20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
1ee30 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
1ee40 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
1ee50 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 69  .u.pIdx;.      i
1ee60 6e 74 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20  nt useIndexOnly 
1ee70 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  = pLevel->plan.w
1ee80 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1ee90 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 20 20 20 20  DX_ONLY;..      
1eea0 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
1eeb0 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  );.      pOp = s
1eec0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
1eed0 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29  v, pWInfo->iTop)
1eee0 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73  ;.      last = s
1eef0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1ef00 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
1ef10 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54  for(k=pWInfo->iT
1ef20 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c  op; k<last; k++,
1ef30 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pOp++){.       
1ef40 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c   if( pOp->p1!=pL
1ef50 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20  evel->iTabCur ) 
1ef60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1ef70 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
1ef80 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a  e==OP_Column ){.
1ef90 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
1efa0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
1efb0 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
1efc0 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
1efd0 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  2==pIdx->aiColum
1efe0 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[j] ){.        
1eff0 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
1f000 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
1f010 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
1f020 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
1f030 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1f040 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f050 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f060 20 20 20 20 20 61 73 73 65 72 74 28 21 75 73 65       assert(!use
1f070 49 6e 64 65 78 4f 6e 6c 79 20 7c 7c 20 6a 3c 70  IndexOnly || j<p
1f080 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
1f090 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1f0a0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
1f0b0 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
1f0c0 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
1f0d0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
1f0e0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
1f0f0 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77  code = OP_IdxRow
1f100 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  id;.        }els
1f110 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
1f120 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 26 26  e==OP_NullRow &&
1f130 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 29 7b   useIndexOnly ){
1f140 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
1f150 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
1f160 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f170 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1f180 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75   /* Final cleanu
1f190 70 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 49 6e  p.  */.  whereIn
1f1a0 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
1f1b0 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  o);.  return;.}.