/ Hex Artifact Content
Login

Artifact d0a78f876593b596c1e97286921cdc746e2f65ce:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64  izer"..**.** $Id
0330: 3a 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 33 37  : where.c,v 1.37
0340: 37 20 32 30 30 39 2f 30 33 2f 32 35 20 31 36 3a  7 2009/03/25 16:
0350: 35 31 3a 34 33 20 64 72 68 20 45 78 70 20 24 0a  51:43 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 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
2c60: 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71  ar(&p->wc);.  sq
2c70: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2c80: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  p);.}../*.** Dea
2c90: 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f  llocate all memo
2ca0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
2cb0: 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e 66  th a WhereAndInf
2cc0: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  o object..*/.sta
2cd0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41 6e  tic void whereAn
2ce0: 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69  dInfoDelete(sqli
2cf0: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41 6e  te3 *db, WhereAn
2d00: 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65  dInfo *p){.  whe
2d10: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
2d20: 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->wc);.  sqlite3
2d30: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
2d40: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
2d50: 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  te a WhereClause
2d60: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
2d70: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
2d80: 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66  ucture.** itself
2d90: 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20   is not freed.  
2da0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2db0: 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77  the inverse of w
2dc0: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29  hereClauseInit()
2dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2de0: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
2df0: 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  r(WhereClause *p
2e00: 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  WC){.  int i;.  
2e10: 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20  WhereTerm *a;.  
2e20: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
2e30: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  C->pParse->db;. 
2e40: 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72   for(i=pWC->nTer
2e50: 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69  m-1, a=pWC->a; i
2e60: 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a  >=0; i--, a++){.
2e70: 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61      if( a->wtFla
2e80: 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49  gs & TERM_DYNAMI
2e90: 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  C ){.      sqlit
2ea0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
2eb0: 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20   a->pExpr);.    
2ec0: 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46  }.    if( a->wtF
2ed0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e  lags & TERM_ORIN
2ee0: 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  FO ){.      wher
2ef0: 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  eOrInfoDelete(db
2f00: 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b  , a->u.pOrInfo);
2f10: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61  .    }else if( a
2f20: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
2f30: 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20 20  _ANDINFO ){.    
2f40: 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65    whereAndInfoDe
2f50: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 41  lete(db, a->u.pA
2f60: 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  ndInfo);.    }. 
2f70: 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21   }.  if( pWC->a!
2f80: 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b  =pWC->aStatic ){
2f90: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2fa0: 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b 0a  ee(db, pWC->a);.
2fb0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
2fc0: 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57 68   a single new Wh
2fd0: 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74 6f  ereTerm entry to
2fe0: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
2ff0: 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20   object pWC..** 
3000: 54 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  The new WhereTer
3010: 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 73  m object is cons
3020: 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78 70  tructed from Exp
3030: 72 20 70 20 61 6e 64 20 77 69 74 68 20 77 74 46  r p and with wtF
3040: 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e 64  lags..** The ind
3050: 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f  ex in pWC->a[] o
3060: 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54  f the new WhereT
3070: 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64 20  erm is returned 
3080: 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20 30  on success..** 0
3090: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
30a0: 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  the new WhereTer
30b0: 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61  m could not be a
30c0: 64 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d 65  dded due to a me
30d0: 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  mory.** allocati
30e0: 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6d  on error.  The m
30f0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3100: 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62 65   failure will be
3110: 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a 20   recorded in.** 
3120: 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  the db->mallocFa
3130: 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68 61  iled flag so tha
3140: 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 66  t higher-level f
3150: 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65 74  unctions can det
3160: 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ect it..**.** Th
3170: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
3180: 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  increase the siz
3190: 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61 5b  e of the pWC->a[
31a0: 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73  ] array as neces
31b0: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sary..**.** If t
31c0: 68 65 20 77 74 46 6c 61 67 73 20 61 72 67 75 6d  he wtFlags argum
31d0: 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45 52  ent includes TER
31e0: 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  M_DYNAMIC, then 
31f0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a  responsibility.*
3200: 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  * for freeing th
3210: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 69  e expression p i
3220: 73 20 61 73 73 75 6d 65 64 20 62 79 20 74 68 65  s assumed by the
3230: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
3240: 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69 73  ect pWC..** This
3250: 20 69 73 20 74 72 75 65 20 65 76 65 6e 20 69 66   is true even if
3260: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
3270: 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ils to allocate 
3280: 61 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 2e  a new WhereTerm.
3290: 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20  .**.** WARNING: 
32a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
32b0: 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 74  ght reallocate t
32c0: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  he space used to
32d0: 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54   store.** WhereT
32e0: 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74  erms.  All point
32f0: 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72 6d  ers to WhereTerm
3300: 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 61  s should be inva
3310: 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a 2a  lidated after.**
3320: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
3330: 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69  utine.  Such poi
3340: 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65 69  nters may be rei
3350: 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65  nitialized by re
3360: 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65  ferencing.** the
3370: 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e   pWC->a[] array.
3380: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
3390: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
33a0: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
33b0: 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38 20 77  C, Expr *p, u8 w
33c0: 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65  tFlags){.  Where
33d0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
33e0: 6e 74 20 69 64 78 3b 0a 20 20 69 66 28 20 70 57  nt idx;.  if( pW
33f0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
3400: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
3410: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
3420: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
3430: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61  3 *db = pWC->pPa
3440: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43  rse->db;.    pWC
3450: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
3460: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
3470: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
3480: 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20  WC->nSlot*2 );. 
3490: 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30     if( pWC->a==0
34a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74   ){.      if( wt
34b0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e  Flags & TERM_DYN
34c0: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20  AMIC ){.        
34d0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
34e0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
34f0: 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d  }.      pWC->a =
3500: 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74   pOld;.      ret
3510: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
3520: 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20   memcpy(pWC->a, 
3530: 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43  pOld, sizeof(pWC
3540: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65  ->a[0])*pWC->nTe
3550: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  rm);.    if( pOl
3560: 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  d!=pWC->aStatic 
3570: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3580: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29  DbFree(db, pOld)
3590: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d  ;.    }.    pWC-
35a0: 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33  >nSlot = sqlite3
35b0: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
35c0: 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28   pWC->a)/sizeof(
35d0: 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a  pWC->a[0]);.  }.
35e0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
35f0: 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65  a[idx = pWC->nTe
3600: 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e  rm++];.  pTerm->
3610: 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65  pExpr = p;.  pTe
3620: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74  rm->wtFlags = wt
3630: 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e  Flags;.  pTerm->
3640: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65  pWC = pWC;.  pTe
3650: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
3660: 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a  ;.  return idx;.
3670: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3680: 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73  utine identifies
3690: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
36a0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
36b0: 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63  use where.** eac
36c0: 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  h subexpression 
36d0: 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
36e0: 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  the AND operator
36f0: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   or some other.*
3700: 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69  * operator speci
3710: 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70  fied in the op p
3720: 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57  arameter.  The W
3730: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
3740: 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65  ture.** is fille
3750: 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  d with pointers 
3760: 74 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  to subexpression
3770: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
3780: 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20  .**.**    WHERE 
3790: 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20   a=='hello' AND 
37a0: 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31  coalesce(b,11)<1
37b0: 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f  0 AND (c+12!=d O
37c0: 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20  R c==22).**     
37d0: 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f        \________/
37e0: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
37f0: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
3800: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
3810: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
3820: 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 73  [0]            s
3830: 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20  lot[1]          
3840: 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a       slot[2].**.
3850: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
3860: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
3870: 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72  pExpr is unalter
3880: 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f  ed.  All this ro
3890: 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73  utine.** does is
38a0: 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74   make slot[] ent
38b0: 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75  ries point to su
38c0: 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68 69  bstructure withi
38d0: 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49  n pExpr..**.** I
38e0: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  n the previous s
38f0: 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74  entence and in t
3900: 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f  he diagram, "slo
3910: 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a  t[]" refers to.*
3920: 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  * the WhereClaus
3930: 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68  e.a[] array.  Th
3940: 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67  e slot[] array g
3950: 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74  rows as needed t
3960: 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c  o contain.** all
3970: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
3980: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ERE clause..*/.s
3990: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
39a0: 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73  Split(WhereClaus
39b0: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45  e *pWC, Expr *pE
39c0: 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20  xpr, int op){.  
39d0: 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  pWC->op = (u8)op
39e0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
39f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
3a00: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
3a10: 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
3a20: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78  eInsert(pWC, pEx
3a30: 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  pr, 0);.  }else{
3a40: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
3a50: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  pWC, pExpr->pLef
3a60: 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72  t, op);.    wher
3a70: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
3a80: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a  r->pRight, op);.
3a90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
3aa0: 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65  tialize an expre
3ab0: 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 0a 2a  ssion mask set.*
3ac0: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61  /.#define initMa
3ad0: 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74  skSet(P)  memset
3ae0: 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50  (P, 0, sizeof(*P
3af0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ))../*.** Return
3b00: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
3b10: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
3b20: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
3b30: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
3b40: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
3b50: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  set..*/.static B
3b60: 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57  itmask getMask(W
3b70: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
3b80: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
3b90: 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  or){.  int i;.  
3ba0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b  for(i=0; i<pMask
3bb0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
3bc0: 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e    if( pMaskSet->
3bd0: 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29  ix[i]==iCursor )
3be0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  {.      return (
3bf0: 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a  (Bitmask)1)<<i;.
3c00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3c10: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
3c20: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
3c30: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
3c40: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
3c50: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
3c60: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
3c70: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
3c80: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
3c90: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
3ca0: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
3cb0: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
3cc0: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
3cd0: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
3ce0: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
3cf0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
3d00: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
3d10: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
3d20: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
3d30: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
3d40: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
3d50: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
3d60: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
3d70: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
3d80: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
3d90: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
3da0: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
3db0: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
3dc0: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
3dd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
3de0: 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76 65 6c  alks (recursivel
3df0: 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  y) an expression
3e00: 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72 61   tree and genera
3e10: 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  tes.** a bitmask
3e20: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
3e30: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
3e40: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
3e50: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a  sion.** tree..**
3e60: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
3e70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
3e80: 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69   work, the calli
3e90: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  ng function must
3ea0: 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75   have.** previou
3eb0: 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69  sly invoked sqli
3ec0: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
3ed0: 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65 78 70  mes() on the exp
3ee0: 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a  ression.  See.**
3ef0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
3f00: 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74  ent on that rout
3f10: 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
3f20: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
3f30: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65  ** The sqlite3Re
3f40: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
3f50: 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20   routines looks 
3f60: 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  for column names
3f70: 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68 65   and.** sets the
3f80: 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b  ir opcodes to TK
3f90: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69  _COLUMN and thei
3fa0: 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  r Expr.iTable fi
3fb0: 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56  elds to.** the V
3fc0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
3fd0: 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  r of the table. 
3fe0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
3ff0: 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61  st has to.** tra
4000: 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72 73 6f  nslate the curso
4010: 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62  r numbers into b
4020: 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 61 6e  itmask values an
4030: 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20  d OR all.** the 
4040: 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74 68 65  bitmasks togethe
4050: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  r..*/.static Bit
4060: 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62  mask exprListTab
4070: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4080: 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a  kSet*, ExprList*
4090: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
40a0: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
40b0: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
40c0: 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a  Set*, Select*);.
40d0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
40e0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 57 68  xprTableUsage(Wh
40f0: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
4100: 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a  kSet, Expr *p){.
4110: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d    Bitmask mask =
4120: 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   0;.  if( p==0 )
4130: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
4140: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
4150: 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20  N ){.    mask = 
4160: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
4170: 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  , p->iTable);.  
4180: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20    return mask;. 
4190: 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70 72   }.  mask = expr
41a0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
41b0: 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  Set, p->pRight);
41c0: 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54  .  mask |= exprT
41d0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
41e0: 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  et, p->pLeft);. 
41f0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
4200: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
4210: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d 61 73  lect) ){.    mas
4220: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
4230: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4240: 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  et, p->x.pSelect
4250: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4260: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
4270: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4280: 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  Set, p->x.pList)
4290: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
42a0: 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69  ask;.}.static Bi
42b0: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
42c0: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
42d0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
42e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
42f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69  ){.  int i;.  Bi
4300: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
4310: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
4320: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
4330: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
4340: 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20  {.      mask |= 
4350: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
4360: 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e  MaskSet, pList->
4370: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
4380: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4390: 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42  mask;.}.static B
43a0: 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63  itmask exprSelec
43b0: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
43c0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
43d0: 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29 7b  et, Select *pS){
43e0: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
43f0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  = 0;.  while( pS
4400: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
4410: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
4420: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
4430: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61  >pEList);.    ma
4440: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
4450: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4460: 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29  t, pS->pGroupBy)
4470: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
4480: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
4490: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
44a0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61  OrderBy);.    ma
44b0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
44c0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
44d0: 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  S->pWhere);.    
44e0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
44f0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4500: 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20   pS->pHaving);. 
4510: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
4520: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
4530: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
4540: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
4550: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
4560: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
4570: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
4580: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
4590: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
45a0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
45b0: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
45c0: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
45d0: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
45e0: 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22 49  =", ">=", and "I
45f0: 4e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  N"..*/.static in
4600: 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20  t allowedOp(int 
4610: 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54  op){.  assert( T
4620: 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_GT>TK_EQ && TK
4630: 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _GT<TK_GE );.  a
4640: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f  ssert( TK_LT>TK_
4650: 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47  EQ && TK_LT<TK_G
4660: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
4670: 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_LE>TK_EQ && TK
4680: 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _LE<TK_GE );.  a
4690: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
46a0: 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72  _EQ+4 );.  retur
46b0: 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28  n op==TK_IN || (
46c0: 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c  op>=TK_EQ && op<
46d0: 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54  =TK_GE) || op==T
46e0: 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a  K_ISNULL;.}../*.
46f0: 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65  ** Swap two obje
4700: 63 74 73 20 6f 66 20 74 79 70 65 20 54 59 50 45  cts of type TYPE
4710: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41  ..*/.#define SWA
4720: 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50  P(TYPE,A,B) {TYP
4730: 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b  E t=A; A=B; B=t;
4740: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65  }../*.** Commute
4750: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
4760: 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73  erator.  Express
4770: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
4780: 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65   "X op Y".** are
4790: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
47a0: 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20  "Y op X"..**.** 
47b0: 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  If a collation s
47c0: 65 71 75 65 6e 63 65 20 69 73 20 61 73 73 6f 63  equence is assoc
47d0: 69 61 74 65 64 20 77 69 74 68 20 65 69 74 68 65  iated with eithe
47e0: 72 20 74 68 65 20 6c 65 66 74 20 6f 72 20 72 69  r the left or ri
47f0: 67 68 74 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74  ght.** side of t
4800: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 69  he comparison, i
4810: 74 20 72 65 6d 61 69 6e 73 20 61 73 73 6f 63 69  t remains associ
4820: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73 61  ated with the sa
4830: 6d 65 20 73 69 64 65 20 61 66 74 65 72 0a 2a 2a  me side after.**
4840: 20 74 68 65 20 63 6f 6d 6d 75 74 61 74 69 6f 6e   the commutation
4850: 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61 74 65 20  . So "Y collate 
4860: 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63  NOCASE op X" bec
4870: 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 63 6f 6c 6c  omes .** "X coll
4880: 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 59 22  ate NOCASE op Y"
4890: 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
48a0: 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  e any collation 
48b0: 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74  sequence on.** t
48c0: 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69 64  he left hand sid
48d0: 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  e of a compariso
48e0: 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  n overrides any 
48f0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
4900: 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  ce .** attached 
4910: 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 46 6f  to the right. Fo
4920: 72 20 74 68 65 20 73 61 6d 65 20 72 65 61 73 6f  r the same reaso
4930: 6e 20 74 68 65 20 45 50 5f 45 78 70 43 6f 6c 6c  n the EP_ExpColl
4940: 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e  ate flag.** is n
4950: 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a  ot commuted..*/.
4960: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
4970: 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70  Commute(Parse *p
4980: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
4990: 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69  pr){.  u16 expRi
49a0: 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52  ght = (pExpr->pR
49b0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
49c0: 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20  _ExpCollate);.  
49d0: 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70  u16 expLeft = (p
49e0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
49f0: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
4a00: 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  te);.  assert( a
4a10: 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e  llowedOp(pExpr->
4a20: 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  op) && pExpr->op
4a30: 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 70 45 78  !=TK_IN );.  pEx
4a40: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c  pr->pRight->pCol
4a50: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
4a60: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
4a70: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
4a80: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70   pExpr->pLeft->p
4a90: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
4aa0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
4ab0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
4ac0: 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a  .  SWAP(CollSeq*
4ad0: 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  ,pExpr->pRight->
4ae0: 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65  pColl,pExpr->pLe
4af0: 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70 45  ft->pColl);.  pE
4b00: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
4b10: 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69  gs = (pExpr->pRi
4b20: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50  ght->flags & ~EP
4b30: 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65  _ExpCollate) | e
4b40: 78 70 4c 65 66 74 3b 0a 20 20 70 45 78 70 72 2d  xpLeft;.  pExpr-
4b50: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 3d 20  >pLeft->flags = 
4b60: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66  (pExpr->pLeft->f
4b70: 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f  lags & ~EP_ExpCo
4b80: 6c 6c 61 74 65 29 20 7c 20 65 78 70 52 69 67 68  llate) | expRigh
4b90: 74 3b 0a 20 20 53 57 41 50 28 45 78 70 72 2a 2c  t;.  SWAP(Expr*,
4ba0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70 45  pExpr->pRight,pE
4bb0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  xpr->pLeft);.  i
4bc0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b  f( pExpr->op>=TK
4bd0: 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _GT ){.    asser
4be0: 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b  t( TK_LT==TK_GT+
4bf0: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
4c00: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20   TK_GE==TK_LE+2 
4c10: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  );.    assert( T
4c20: 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20  K_GT>TK_EQ );.  
4c30: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3c    assert( TK_GT<
4c40: 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73  TK_LE );.    ass
4c50: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d  ert( pExpr->op>=
4c60: 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e  TK_GT && pExpr->
4c70: 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op<=TK_GE );.   
4c80: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70   pExpr->op = ((p
4c90: 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e  Expr->op-TK_GT)^
4ca0: 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a  2)+TK_GT;.  }.}.
4cb0: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65  ./*.** Translate
4cc0: 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72   from TK_xx oper
4cd0: 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62 69  ator to WO_xx bi
4ce0: 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  tmask..*/.static
4cf0: 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d 61 73   u16 operatorMas
4d00: 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36  k(int op){.  u16
4d10: 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c   c;.  assert( al
4d20: 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20  lowedOp(op) );. 
4d30: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
4d40: 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b  {.    c = WO_IN;
4d50: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
4d60: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
4d70: 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b    c = WO_ISNULL;
4d80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
4d90: 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f  sert( (WO_EQ<<(o
4da0: 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78 37 66  p-TK_EQ)) < 0x7f
4db0: 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20 28 75  ff );.    c = (u
4dc0: 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  16)(WO_EQ<<(op-T
4dd0: 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73  K_EQ));.  }.  as
4de0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e  sert( op!=TK_ISN
4df0: 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e  ULL || c==WO_ISN
4e00: 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ULL );.  assert(
4e10: 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d   op!=TK_IN || c=
4e20: 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65  =WO_IN );.  asse
4e30: 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  rt( op!=TK_EQ ||
4e40: 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61   c==WO_EQ );.  a
4e50: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54  ssert( op!=TK_LT
4e60: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a   || c==WO_LT );.
4e70: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
4e80: 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20  _LE || c==WO_LE 
4e90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
4ea0: 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GT || c==WO_
4eb0: 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GT );.  assert( 
4ec0: 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d  op!=TK_GE || c==
4ed0: 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72  WO_GE );.  retur
4ee0: 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n c;.}../*.** Se
4ef0: 61 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20  arch for a term 
4f00: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
4f10: 75 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74  use that is of t
4f20: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4f30: 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65  <expr>".** where
4f40: 20 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63   X is a referenc
4f50: 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e  e to the iColumn
4f60: 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 61   of table iCur a
4f70: 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  nd <op> is one o
4f80: 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f  f.** the WO_xx o
4f90: 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70  perator codes sp
4fa0: 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 6f  ecified by the o
4fb0: 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20  p parameter..** 
4fc0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
4fd0: 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52   to the term.  R
4fe0: 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66  eturn 0 if not f
4ff0: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
5000: 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54  WhereTerm *findT
5010: 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75  erm(.  WhereClau
5020: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
5030: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
5040: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
5050: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
5060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
5070: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c  rsor number of L
5080: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  HS */.  int iCol
5090: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  umn,          /*
50a0: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
50b0: 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61  f LHS */.  Bitma
50c0: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
50d0: 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74   /* RHS must not
50e0: 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68   overlap with th
50f0: 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32  is mask */.  u32
5100: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
5110: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f     /* Mask of WO
5120: 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72  _xx values descr
5130: 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a  ibing operator *
5140: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
5160: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
5170: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c  with this index,
5180: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
5190: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
51a0: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a  pTerm;.  int k;.
51b0: 20 20 61 73 73 65 72 74 28 20 69 43 75 72 3e 3d    assert( iCur>=
51c0: 30 20 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f  0 );.  op &= WO_
51d0: 41 4c 4c 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  ALL;.  for(pTerm
51e0: 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e  =pWC->a, k=pWC->
51f0: 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70  nTerm; k; k--, p
5200: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
5210: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
5220: 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20  or==iCur.       
5230: 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  && (pTerm->prere
5240: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
5250: 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  y)==0.       && 
5260: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
5270: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
5280: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65      && (pTerm->e
5290: 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 29 21 3d  Operator & op)!=
52a0: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
52b0: 66 28 20 70 49 64 78 20 26 26 20 70 54 65 72 6d  f( pIdx && pTerm
52c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f  ->eOperator!=WO_
52d0: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ISNULL ){.      
52e0: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
52f0: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
5300: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
5310: 6c 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  l;.        char 
5320: 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20 20 20  idxaff;.        
5330: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 50  int j;.        P
5340: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
5350: 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20  WC->pParse;..   
5360: 20 20 20 20 20 69 64 78 61 66 66 20 3d 20 70 49       idxaff = pI
5370: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
5380: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
5390: 74 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ty;.        if( 
53a0: 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
53b0: 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64 78 61  inityOk(pX, idxa
53c0: 66 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ff) ) continue;.
53d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 67 75  .        /* Figu
53e0: 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 6c 61  re out the colla
53f0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72 65  tion sequence re
5400: 71 75 69 72 65 64 20 66 72 6f 6d 20 61 6e 20 69  quired from an i
5410: 6e 64 65 78 20 66 6f 72 0a 20 20 20 20 20 20 20  ndex for.       
5420: 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75 73 65   ** it to be use
5430: 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69 73 69  ful for optimisi
5440: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58  ng expression pX
5450: 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20 20 20  . Store this.   
5460: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e       ** value in
5470: 20 76 61 72 69 61 62 6c 65 20 70 43 6f 6c 6c 2e   variable pColl.
5480: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
5490: 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70      assert(pX->p
54a0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Left);.        p
54b0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
54c0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
54d0: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
54e0: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
54f0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
5500: 74 28 70 43 6f 6c 6c 20 7c 7c 20 70 50 61 72 73  t(pColl || pPars
5510: 65 2d 3e 6e 45 72 72 29 3b 0a 0a 20 20 20 20 20  e->nErr);..     
5520: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78     for(j=0; pIdx
5530: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69  ->aiColumn[j]!=i
5540: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
5550: 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45          if( NEVE
5560: 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  R(j>=pIdx->nColu
5570: 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  mn) ) return 0;.
5580: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5590: 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 73    if( pColl && s
55a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
55b0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78  oll->zName, pIdx
55c0: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63  ->azColl[j]) ) c
55d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
55e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 54  .      return pT
55f0: 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  erm;.    }.  }. 
5600: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5610: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
5620: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
5630: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72  d exprAnalyze(Sr
5640: 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61  cList*, WhereCla
5650: 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  use*, int);../*.
5660: 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c  ** Call exprAnal
5670: 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  yze on all terms
5680: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
5690: 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73  se.  .**.**.*/.s
56a0: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
56b0: 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63  nalyzeAll(.  Src
56c0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
56d0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
56e0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
56f0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20  ereClause *pWC  
5700: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48         /* the WH
5710: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
5720: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
5730: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
5740: 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69  =pWC->nTerm-1; i
5750: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65  >=0; i--){.    e
5760: 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
5770: 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20  ist, pWC, i);.  
5780: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
5790: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
57a0: 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
57b0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
57c0: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
57d0: 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20  ssion is a LIKE 
57e0: 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  or GLOB operator
57f0: 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20   that.** can be 
5800: 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20  optimized using 
5810: 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
5820: 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  raints.  Return 
5830: 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a  TRUE if it is.**
5840: 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66   so and false if
5850: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f   not..**.** In o
5860: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65  rder for the ope
5870: 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69  rator to be opti
5880: 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53  mizible, the RHS
5890: 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69 6e   must be a strin
58a0: 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61  g.** literal tha
58b0: 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
58c0: 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 64   with a wildcard
58d0: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
58e0: 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a  t isLikeOrGlob(.
58f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5900: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
5910: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
5920: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
5930: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
5940: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
5950: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
5960: 6e 74 20 2a 70 6e 50 61 74 74 65 72 6e 2c 20 20  nt *pnPattern,  
5970: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f   /* Number of no
5980: 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66 69  n-wildcard prefi
5990: 78 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  x characters */.
59a0: 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65    int *pisComple
59b0: 74 65 2c 20 2f 2a 20 54 72 75 65 20 69 66 20 74  te, /* True if t
59c0: 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64  he only wildcard
59d0: 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73   is % in the las
59e0: 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20  t character */. 
59f0: 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20 20   int *pnoCase   
5a00: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70     /* True if up
5a10: 70 65 72 63 61 73 65 20 69 73 20 65 71 75 69 76  percase is equiv
5a20: 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61  alent to lowerca
5a30: 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  se */.){.  const
5a40: 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
5a50: 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20        /* String 
5a60: 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f  on RHS of LIKE o
5a70: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
5a80: 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  r *pRight, *pLef
5a90: 74 3b 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74  t;      /* Right
5aa0: 20 61 6e 64 20 6c 65 66 74 20 73 69 7a 65 20 6f   and left size o
5ab0: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
5ac0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
5ad0: 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
5ae0: 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65 72 61  /* List of opera
5af0: 6e 64 73 20 74 6f 20 74 68 65 20 4c 49 4b 45 20  nds to the LIKE 
5b00: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
5b10: 74 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  t c;            
5b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
5b30: 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d  character in z[]
5b40: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f   /* Number of no
5b70: 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66 69  n-wildcard prefi
5b80: 78 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  x characters */.
5b90: 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 20 20 20    char wc[3];   
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5bb0: 57 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74  Wildcard charact
5bc0: 65 72 73 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  ers */.  CollSeq
5bd0: 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
5be0: 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
5bf0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 4c 48   sequence for LH
5c00: 53 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  S */.  sqlite3 *
5c10: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5c20: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
5c30: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69  nnection */..  i
5c40: 66 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b  f( !sqlite3IsLik
5c50: 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45  eFunction(db, pE
5c60: 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63  xpr, pnoCase, wc
5c70: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
5c80: 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  0;.  }.#ifdef SQ
5c90: 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66  LITE_EBCDIC.  if
5ca0: 28 20 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74  ( *pnoCase ) ret
5cb0: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 0;.#endif.  
5cc0: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
5cd0: 2e 70 4c 69 73 74 3b 0a 20 20 70 52 69 67 68 74  .pList;.  pRight
5ce0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70   = pList->a[0].p
5cf0: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 52 69 67  Expr;.  if( pRig
5d00: 68 74 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e  ht->op!=TK_STRIN
5d10: 47 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  G ){.    return 
5d20: 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 66 74 20 3d  0;.  }.  pLeft =
5d30: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
5d40: 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d  pr;.  if( pLeft-
5d50: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
5d60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5d70: 20 20 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71    }.  pColl = sq
5d80: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
5d90: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
5da0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c  .  assert( pColl
5db0: 21 3d 30 20 7c 7c 20 70 4c 65 66 74 2d 3e 69 43  !=0 || pLeft->iC
5dc0: 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 69  olumn==-1 );.  i
5dd0: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20  f( pColl==0 ){. 
5de0: 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69     /* No collati
5df0: 6f 6e 20 69 73 20 64 65 66 69 6e 65 64 20 66 6f  on is defined fo
5e00: 72 20 74 68 65 20 52 4f 57 49 44 2e 20 20 55 73  r the ROWID.  Us
5e10: 65 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 2a  e the default. *
5e20: 2f 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62  /.    pColl = db
5e30: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 7d  ->pDfltColl;.  }
5e40: 0a 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 74  .  if( (pColl->t
5e50: 79 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c  ype!=SQLITE_COLL
5e60: 5f 42 49 4e 41 52 59 20 7c 7c 20 2a 70 6e 6f 43  _BINARY || *pnoC
5e70: 61 73 65 29 20 26 26 0a 20 20 20 20 20 20 28 70  ase) &&.      (p
5e80: 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49  Coll->type!=SQLI
5e90: 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 20 7c  TE_COLL_NOCASE |
5ea0: 7c 20 21 2a 70 6e 6f 43 61 73 65 29 20 29 7b 0a  | !*pnoCase) ){.
5eb0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5ec0: 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f  }.  sqlite3Dequo
5ed0: 74 65 45 78 70 72 28 70 52 69 67 68 74 29 3b 0a  teExpr(pRight);.
5ee0: 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 70 52    z = (char *)pR
5ef0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20  ight->token.z;. 
5f00: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20   cnt = 0;.  if( 
5f10: 7a 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  z ){.    while( 
5f20: 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26  (c=z[cnt])!=0 &&
5f30: 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d   c!=wc[0] && c!=
5f40: 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32  wc[1] && c!=wc[2
5f50: 5d 20 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20  ] ){ cnt++; }.  
5f60: 7d 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 7c  }.  if( cnt==0 |
5f70: 7c 20 32 35 35 3d 3d 28 75 38 29 7a 5b 63 6e 74  | 255==(u8)z[cnt
5f80: 2d 31 5d 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1] ){.    retur
5f90: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 69 73 43  n 0;.  }.  *pisC
5fa0: 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e 74 5d  omplete = z[cnt]
5fb0: 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74  ==wc[0] && z[cnt
5fc0: 2b 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61 74  +1]==0;.  *pnPat
5fd0: 74 65 72 6e 20 3d 20 63 6e 74 3b 0a 20 20 72 65  tern = cnt;.  re
5fe0: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
5ff0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6000: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
6010: 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N */...#ifndef S
6020: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6030: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68  ALTABLE./*.** Ch
6040: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
6050: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
6060: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
6070: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  m.**.**         
6080: 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70  column MATCH exp
6090: 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  r.**.** If it is
60a0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55   then return TRU
60b0: 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75  E.  If not, retu
60c0: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
60d0: 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f  tic int isMatchO
60e0: 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20  fColumn(.  Expr 
60f0: 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54  *pExpr      /* T
6100: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
6110: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ion */.){.  Expr
6120: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20  List *pList;..  
6130: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
6140: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
6150: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6160: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
6170: 65 6e 2e 6e 21 3d 35 20 7c 7c 0a 20 20 20 20 20  en.n!=5 ||.     
6180: 20 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d    sqlite3StrNICm
6190: 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  p((const char*)p
61a0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
61b0: 61 74 63 68 22 2c 35 29 21 3d 30 20 29 7b 0a 20  atch",5)!=0 ){. 
61c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
61d0: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
61e0: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28  ->x.pList;.  if(
61f0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32   pList->nExpr!=2
6200: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
6210: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
6220: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[1].pExpr->o
6230: 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29  p != TK_COLUMN )
6240: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6250: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
6260: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6270: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
6280: 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ABLE */../*.** I
6290: 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72  f the pBase expr
62a0: 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
62b0: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
62c0: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a  SING clause of.*
62d0: 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  * a join, then t
62e0: 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72  ransfer the appr
62f0: 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73  opriate markings
6300: 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64   over to derived
6310: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6320: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
6330: 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72  kings(Expr *pDer
6340: 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73  ived, Expr *pBas
6350: 65 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  e){.  pDerived->
6360: 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e  flags |= pBase->
6370: 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a  flags & EP_FromJ
6380: 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d  oin;.  pDerived-
6390: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
63a0: 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74   = pBase->iRight
63b0: 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69  JoinTable;.}..#i
63c0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
63d0: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
63e0: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69  ZATION) && !defi
63f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6400: 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20  SUBQUERY)./*.** 
6410: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74  Analyze a term t
6420: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
6430: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63  two or more OR-c
6440: 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74  onnected.** subt
6450: 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a  erms.  So in:.**
6460: 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52  .**     ... WHER
6470: 45 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d  E  (a=5) AND (b=
6480: 37 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33  7 OR c=9 OR d=13
6490: 29 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20  ) AND (d=13).** 
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e           ^^^^^^^
64c0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a  ^^^^^^^^^^^^^.**
64d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
64e0: 20 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20   analyzes terms 
64f0: 73 75 63 68 20 61 73 20 74 68 65 20 6d 69 64 64  such as the midd
6500: 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61  le term in the a
6510: 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a  bove example..**
6520: 20 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f   A WhereOrTerm o
6530: 62 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65  bject is compute
6540: 64 20 61 6e 64 20 61 74 74 61 63 68 65 64 20 74  d and attached t
6550: 6f 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72  o the term under
6560: 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65  .** analysis, re
6570: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
6580: 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61  outcome of the a
6590: 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a  nalysis.  Hence:
65a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  .**.**     Where
65b0: 54 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c  Term.wtFlags   |
65c0: 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a  =  TERM_ORINFO.*
65d0: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
65e0: 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20  u.pOrInfo  =  a 
65f0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
6600: 63 61 74 65 64 20 57 68 65 72 65 4f 72 54 65 72  cated WhereOrTer
6610: 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54  m object.**.** T
6620: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e  he term being an
6630: 61 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65  alyzed must have
6640: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20   two or more of 
6650: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62  OR-connected sub
6660: 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67  terms..** A sing
6670: 6c 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74  le subterm might
6680: 20 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44   be a set of AND
6690: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73  -connected sub-s
66a0: 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d  ubterms..** Exam
66b0: 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e  ples of terms un
66c0: 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a  der analysis:.**
66d0: 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20 20  .**     (A)     
66e0: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e  t1.x=t2.y OR t1.
66f0: 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31  x=t2.z OR t1.y=1
6700: 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35  5 OR t1.z=t3.a+5
6710: 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20 20  .**     (B)     
6720: 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72 32  x=expr1 OR expr2
6730: 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a  =x OR x=expr3.**
6740: 20 20 20 20 20 28 43 29 20 20 20 20 20 74 31 2e       (C)     t1.
6750: 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d  x=t2.y OR (t1.x=
6760: 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35  t2.z AND t1.y=15
6770: 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20  ).**     (D)    
6780: 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31   x=expr1 OR (y>1
6790: 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a  1 AND y<22 AND z
67a0: 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29   LIKE '*hello*')
67b0: 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20 20  .**     (E)     
67c0: 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32  (p.a=1 AND q.b=2
67d0: 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28   AND r.c=3) OR (
67e0: 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20  p.x=4 AND q.y=5 
67f0: 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a  AND r.z=6).**.**
6800: 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49   CASE 1:.**.** I
6810: 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61  f all subterms a
6820: 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54  re of the form T
6830: 2e 43 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65  .C=expr for some
6840: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f   single column o
6850: 66 20 43 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  f C.** a single 
6860: 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77  table T (as show
6870: 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61  n in example B a
6880: 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74  bove) then creat
6890: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a  e a new virtual.
68a0: 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  ** term that is 
68b0: 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e  an equivalent IN
68c0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e   expression.  In
68d0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
68e0: 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69   the term.** bei
68f0: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a  ng analyzed is:.
6900: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65  **.**      x = e
6910: 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20  xpr1  OR  expr2 
6920: 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70  = x  OR  x = exp
6930: 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72  r3.**.** then cr
6940: 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75  eate a new virtu
6950: 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69  al term like thi
6960: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  s:.**.**      x 
6970: 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c  IN (expr1,expr2,
6980: 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53  expr3).**.** CAS
6990: 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 2:.**.** If al
69a0: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69  l subterms are i
69b0: 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69  ndexable by a si
69c0: 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68  ngle table T, th
69d0: 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20  en set.**.**    
69e0: 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72   WhereTerm.eOper
69f0: 61 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  ator            
6a00: 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20    =  WO_OR.**   
6a10: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
6a20: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
6a30: 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72    |=  the cursor
6a40: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
6a50: 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74  e T.**.** A subt
6a60: 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c  erm is "indexabl
6a70: 65 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74  e" if it is of t
6a80: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20  he form.** "T.C 
6a90: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
6aa0: 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75  re C is any colu
6ab0: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e  mn of table T an
6ac0: 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e  d .** <op> is on
6ad0: 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22  e of "=", "<", "
6ae0: 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20  <=", ">", ">=", 
6af0: 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49  "IS NULL", or "I
6b00: 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  N"..** A subterm
6b10: 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62   is also indexab
6b20: 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41  le if it is an A
6b30: 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ND of two or mor
6b40: 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73  e.** subsubterms
6b50: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
6b60: 20 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61   which is indexa
6b70: 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20  ble.  Indexable 
6b80: 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73  AND .** subterms
6b90: 20 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65   have their eOpe
6ba0: 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f  rator set to WO_
6bb0: 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76  AND and they hav
6bc0: 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20  e.** u.pAndInfo 
6bd0: 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63  set to a dynamic
6be0: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
6bf0: 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65  hereAndTerm obje
6c00: 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61  ct..**.** From a
6c10: 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20  nother point of 
6c20: 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65  view, "indexable
6c30: 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  " means that the
6c40: 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a   subterm could.*
6c50: 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65  * potentially be
6c60: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
6c70: 64 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70  dex if an approp
6c80: 72 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73  riate index exis
6c90: 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c  ts..** This anal
6ca0: 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ysis does not co
6cb0: 6e 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f  nsider whether o
6cc0: 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20  r not the index 
6cd0: 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20  exists; that.** 
6ce0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 65  is something the
6cf0: 20 62 65 73 74 49 6e 64 65 78 28 29 20 72 6f 75   bestIndex() rou
6d00: 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d  tine will determ
6d10: 69 6e 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79  ine.  This analy
6d20: 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b  sis.** only look
6d30: 73 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62  s at whether sub
6d40: 74 65 72 6d 73 20 61 70 70 72 6f 70 72 69 61 74  terms appropriat
6d50: 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65  e for indexing e
6d60: 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  xist..**.** All 
6d70: 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75  examples A throu
6d80: 67 68 20 45 20 61 62 6f 76 65 20 61 6c 6c 20 73  gh E above all s
6d90: 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20  atisfy case 2.  
6da0: 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a  But if a term.**
6db0: 20 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73   also statisfies
6dc0: 20 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73   case 1 (such as
6dd0: 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   B) we know that
6de0: 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77   the optimizer w
6df0: 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72  ill.** always pr
6e00: 65 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20  efer case 1, so 
6e10: 69 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20  in that case we 
6e20: 70 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73  pretend that cas
6e30: 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61  e 2 is not.** sa
6e40: 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  tisfied..**.** I
6e50: 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
6e60: 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c  ase that multipl
6e70: 65 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64  e tables are ind
6e80: 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61  exable.  For exa
6e90: 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f  mple,.** (E) abo
6ea0: 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20  ve is indexable 
6eb0: 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20  on tables P, Q, 
6ec0: 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72  and R..**.** Ter
6ed0: 6d 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20  ms that satisfy 
6ee0: 63 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69  case 2 are candi
6ef0: 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70  dates for lookup
6f00: 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70   by using.** sep
6f10: 61 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f  arate indices to
6f20: 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72   find rowids for
6f30: 20 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e   each subterm an
6f40: 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74  d composing.** t
6f50: 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20  he union of all 
6f60: 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52  rowids using a R
6f70: 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54  owSet object.  T
6f80: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a  his is similar.*
6f90: 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64  * to "bitmap ind
6fa0: 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64  ices" in other d
6fb0: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e  atabase engines.
6fc0: 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45  .**.** OTHERWISE
6fd0: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68  :.**.** If neith
6fe0: 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61  er case 1 nor ca
6ff0: 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e  se 2 apply, then
7000: 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72   leave the eOper
7010: 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a  ator set to.** z
7020: 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20  ero.  This term 
7030: 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f  is not useful fo
7040: 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61  r search..*/.sta
7050: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
7060: 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72  lyzeOrTerm(.  Sr
7070: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
7080: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
7090: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
70a0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
70b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
70c0: 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20   complete WHERE 
70d0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
70e0: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
70f0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
7100: 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f  f the OR-term to
7110: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
7120: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
7130: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
7140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7150: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
7160: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
7170: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
7180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
7190: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
71a0: 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  on */.  WhereTer
71b0: 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  m *pTerm = &pWC-
71c0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20  >a[idxTerm];    
71d0: 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62  /* The term to b
71e0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
71f0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
7200: 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20  erm->pExpr;     
7210: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
7220: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65  xpression of the
7230: 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65   term */.  Where
7240: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
7250: 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65  t = pWC->pMaskSe
7260: 74 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73 65 20  t; /* Table use 
7270: 6d 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 69  masks */.  int i
7280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
72b0: 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ers */.  WhereCl
72c0: 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20  ause *pOrWc;    
72d0: 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66     /* Breakup of
72e0: 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74   pTerm into subt
72f0: 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54  erms */.  WhereT
7300: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20  erm *pOrTerm;   
7310: 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72      /* A Sub-ter
7320: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72  m within the pOr
7330: 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49  Wc */.  WhereOrI
7340: 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20  nfo *pOrInfo;   
7350: 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20    /* Additional 
7360: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f  information asso
7370: 63 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72  ciated with pTer
7380: 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63  m */.  Bitmask c
7390: 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20  hngToIN;        
73a0: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
73b0: 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61  might satisfy ca
73c0: 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73  se 1 */.  Bitmas
73d0: 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20  k indexable;    
73e0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
73f0: 61 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  at are indexable
7400: 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73  , satisfying cas
7410: 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  e 2 */..  /*.  *
7420: 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63  * Break the OR c
7430: 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73  lause into its s
7440: 65 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73  eparate subterms
7450: 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20  .  The subterms 
7460: 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20  are.  ** stored 
7470: 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  in a WhereClause
7480: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
7490: 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65  ining within the
74a0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a   WhereOrInfo.  *
74b0: 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  * object that is
74c0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
74d0: 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61   original OR cla
74e0: 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20  use term..  */. 
74f0: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
7500: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
7510: 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52  _DYNAMIC|TERM_OR
7520: 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46  INFO|TERM_ANDINF
7530: 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  O))==0 );.  asse
7540: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
7550: 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d  K_OR );.  pTerm-
7560: 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72  >u.pOrInfo = pOr
7570: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
7580: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
7590: 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29  izeof(*pOrInfo))
75a0: 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d  ;.  if( pOrInfo=
75b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
75c0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
75d0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20   TERM_ORINFO;.  
75e0: 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f  pOrWc = &pOrInfo
75f0: 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61  ->wc;.  whereCla
7600: 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70  useInit(pOrWc, p
7610: 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73  WC->pParse, pMas
7620: 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 53 70  kSet);.  whereSp
7630: 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72  lit(pOrWc, pExpr
7640: 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72  , TK_OR);.  expr
7650: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
7660: 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64   pOrWc);.  if( d
7670: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7680: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
7690: 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  rt( pOrWc->nTerm
76a0: 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  >=2 );..  /*.  *
76b0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65  * Compute the se
76c0: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
76d0: 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63   might satisfy c
76e0: 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a  ases 1 or 2..  *
76f0: 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20  /.  indexable = 
7700: 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74  chngToIN = ~(Bit
7710: 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d  mask)0;.  for(i=
7720: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20  pOrWc->nTerm-1, 
7730: 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61  pOrTerm=pOrWc->a
7740: 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61  ; i>=0 && indexa
7750: 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  ble; i--, pOrTer
7760: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
7770: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
7780: 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d  r & WO_SINGLE)==
7790: 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  0 ){.      Where
77a0: 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66  AndInfo *pAndInf
77b0: 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
77c0: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
77d0: 74 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tor==0 );.      
77e0: 61 73 73 65 72 74 28 20 28 70 4f 72 54 65 72 6d  assert( (pOrTerm
77f0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
7800: 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f  M_ANDINFO|TERM_O
7810: 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  RINFO))==0 );.  
7820: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
7830: 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66 6f  ;.      pAndInfo
7840: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7850: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
7860: 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20  (*pAndInfo));.  
7870: 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66 6f      if( pAndInfo
7880: 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
7890: 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 3b  eClause *pAndWC;
78a0: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
78b0: 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20  rm *pAndTerm;.  
78c0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
78d0: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
78e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   0;.        pOrT
78f0: 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20  erm->u.pAndInfo 
7900: 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20  = pAndInfo;.    
7910: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
7920: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44  lags |= TERM_AND
7930: 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f  INFO;.        pO
7940: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
7950: 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20   = WO_AND;.     
7960: 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41 6e     pAndWC = &pAn
7970: 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
7980: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
7990: 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e  it(pAndWC, pWC->
79a0: 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74  pParse, pMaskSet
79b0: 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
79c0: 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20 70 4f  Split(pAndWC, pO
79d0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b  rTerm->pExpr, TK
79e0: 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 65  _AND);.        e
79f0: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53  xprAnalyzeAll(pS
7a00: 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20  rc, pAndWC);.   
7a10: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
7a20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7a30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
7a40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7a50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
7a60: 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d  r(j=0, pAndTerm=
7a70: 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e  pAndWC->a; j<pAn
7a80: 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  dWC->nTerm; j++,
7a90: 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20   pAndTerm++){.  
7aa0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
7ab0: 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70  ( pAndTerm->pExp
7ac0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
7ad0: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70   if( allowedOp(p
7ae0: 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  AndTerm->pExpr->
7af0: 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  op) ){.         
7b00: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
7b10: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  k(pMaskSet, pAnd
7b20: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
7b30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
7b40: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7b50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
7b60: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
7b70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
7b80: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
7b90: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
7ba0: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
7bb0: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
7bc0: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
7bd0: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
7be0: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
7bf0: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
7c00: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
7c10: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
7c20: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
7c30: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74  b;.      b = get
7c40: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
7c50: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
7c60: 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  or);.      if( p
7c70: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
7c80: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
7c90: 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  {.        WhereT
7ca0: 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
7cb0: 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d  OrWc->a[pOrTerm-
7cc0: 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
7cd0: 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28     b |= getMask(
7ce0: 70 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72  pMaskSet, pOther
7cf0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
7d00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64       }.      ind
7d10: 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20  exable &= b;.   
7d20: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
7d30: 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51  eOperator!=WO_EQ
7d40: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67   ){.        chng
7d50: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
7d60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
7d70: 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20  hngToIN &= b;.  
7d80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7d90: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72  .  /*.  ** Recor
7da0: 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  d the set of tab
7db0: 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79  les that satisfy
7dc0: 20 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65   case 2.  The se
7dd0: 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20  t might be.  ** 
7de0: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f  empty..  */.  pO
7df0: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
7e00: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20   = indexable;.  
7e10: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7e20: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20   = indexable==0 
7e30: 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20  ? 0 : WO_OR;..  
7e40: 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  /*.  ** chngToIN
7e50: 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20   holds a set of 
7e60: 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67  tables that *mig
7e70: 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65  ht* satisfy case
7e80: 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65   1.  But.  ** we
7e90: 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
7ea0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63   additional chec
7eb0: 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63  king to see if c
7ec0: 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a  ase 1 really.  *
7ed0: 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a  * is satisfied..
7ee0: 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54    */.  if( chngT
7ef0: 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  oIN ){.    int o
7f00: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
7f10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7f20: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74  the conversion t
7f30: 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f  o IN is valid */
7f40: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  .    int iColumn
7f50: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
7f60: 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  * Column index o
7f70: 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72  n lhs of IN oper
7f80: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ator */.    int 
7f90: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20  iCursor = -1;   
7fa0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63        /* Table c
7fb0: 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20  ursor common to 
7fc0: 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  all terms */.   
7fd0: 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20   int j = 0;     
7fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
7ff0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
8000: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
8010: 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c   a table and col
8020: 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73  umn that appears
8030: 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   on one side or 
8040: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
8050: 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61   of the == opera
8060: 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62  tor in every sub
8070: 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c  term.  That tabl
8080: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20  e and column.   
8090: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f   ** will be reco
80a0: 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20  rded in iCursor 
80b0: 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68  and iColumn.  Th
80c0: 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ere might not be
80d0: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68   any.    ** such
80e0: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
80f0: 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67  n.  Set okToChng
8100: 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f  ToIN if an appro
8110: 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20  priate table.   
8120: 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69   ** and column i
8130: 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76  s found but leav
8140: 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66  e okToChngToIN f
8150: 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e  alse if not foun
8160: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
8170: 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f  r(j=0; j<2 && !o
8180: 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b  kToChngToIN; j++
8190: 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d  ){.      pOrTerm
81a0: 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20   = pOrWc->a;.   
81b0: 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e     for(i=pOrWc->
81c0: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
81d0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
81e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
81f0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8200: 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20  or==WO_EQ );.   
8210: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8220: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
8230: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  R_OK;.        if
8240: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
8250: 75 72 73 6f 72 3d 3d 69 43 6f 6c 75 6d 6e 20 29  ursor==iColumn )
8260: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8270: 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e     if( (chngToIN
8280: 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   & getMask(pMask
8290: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
82a0: 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 20  ftCursor))==0 ) 
82b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
82c0: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54    iColumn = pOrT
82d0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
82e0: 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73  n;.        iCurs
82f0: 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  or = pOrTerm->le
8300: 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ftCursor;.      
8310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8320: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29  .      if( i<0 )
8330: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8340: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
8350: 20 20 61 73 73 65 72 74 28 20 28 63 68 6e 67 54    assert( (chngT
8360: 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29  oIN&(chngToIN-1)
8370: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
8380: 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e  assert( chngToIN
8390: 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  ==getMask(pMaskS
83a0: 65 74 2c 20 69 43 6f 6c 75 6d 6e 29 20 29 3b 0a  et, iColumn) );.
83b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
83c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 6b 54       }.      okT
83d0: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20  oChngToIN = 1;. 
83e0: 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20       for(; i>=0 
83f0: 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b  && okToChngToIN;
8400: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
8410: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8420: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8430: 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  ator==WO_EQ );. 
8440: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
8450: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
8460: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
8470: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8480: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
8490: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  R_OK;.        }e
84a0: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
84b0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69  >u.leftColumn!=i
84c0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
84d0: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
84e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
84f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
8500: 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52  nt affLeft, affR
8510: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
8520: 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d  /* If the right-
8530: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73  hand side is als
8540: 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  o a column, then
8550: 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a   the affinities.
8560: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
8570: 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c  both right and l
8580: 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62  eft sides must b
8590: 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74  e such that no t
85a0: 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ype.          **
85b0: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65   conversions are
85c0: 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65   required on the
85d0: 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74   right.  (Ticket
85e0: 20 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20   #2249).        
85f0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61    */.          a
8600: 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  ffRight = sqlite
8610: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
8620: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
8630: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
8640: 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74   affLeft = sqlit
8650: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
8660: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
8670: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
8680: 20 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30   if( affRight!=0
8690: 20 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66   && affRight!=af
86a0: 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  fLeft ){.       
86b0: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
86c0: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  N = 0;.         
86d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
86e0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
86f0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f  lags |= TERM_OR_
8700: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
8710: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8720: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
8730: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f  At this point, o
8740: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74  kToChngToIN is t
8750: 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20  rue if original 
8760: 70 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a  pTerm satisfies.
8770: 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20      ** case 1.  
8780: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f  In that case, co
8790: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69  nstruct a new vi
87a0: 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20  rtual term that 
87b0: 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d  is .    ** pTerm
87c0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
87d0: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  an IN operator..
87e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
87f0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20  kToChngToIN ){. 
8800: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
8810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8820: 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69   transient dupli
8830: 63 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  cate expression 
8840: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
8850: 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20  t *pList = 0;   
8860: 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68  /* The RHS of th
8870: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
8880: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
8890: 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ft = 0;       /*
88a0: 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   The LHS of the 
88b0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
88c0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
88d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
88e0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f  he complete IN o
88f0: 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20  perator */..    
8900: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
8910: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
8920: 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20  pOrWc->a; i>=0; 
8930: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
8940: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
8950: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8960: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20   TERM_OR_OK)==0 
8970: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8980: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
8990: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
89a0: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
89b0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
89c0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
89d0: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20  ursor );.       
89e0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
89f0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d  ->u.leftColumn==
8a00: 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  iColumn );.     
8a10: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
8a20: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72  3ExprDup(db, pOr
8a30: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
8a40: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
8a50: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
8a60: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
8a70: 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  WC->pParse, pLis
8a80: 74 2c 20 70 44 75 70 2c 20 30 29 3b 0a 20 20 20  t, pDup, 0);.   
8a90: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72       pLeft = pOr
8aa0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
8ab0: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ft;.      }.    
8ac0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
8ad0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70  =0 );.      pDup
8ae0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8af0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
8b00: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
8b10: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
8b20: 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29  _IN, pDup, 0, 0)
8b30: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
8b40: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
8b50: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  idxNew;.        
8b60: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
8b70: 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72  ings(pNew, pExpr
8b80: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
8b90: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
8ba0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
8bb0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
8bc0: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74     pNew->x.pList
8bd0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
8be0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
8bf0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
8c00: 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52  , pNew, TERM_VIR
8c10: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
8c20: 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  C);.        test
8c30: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
8c40: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41  );.        exprA
8c50: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
8c60: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
8c70: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
8c80: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
8c90: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
8ca0: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
8cb0: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  xTerm;.        p
8cc0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
8cd0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8ce0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
8cf0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
8d00: 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d   pList);.      }
8d10: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
8d20: 70 65 72 61 74 6f 72 20 3d 20 30 3b 20 20 2f 2a  perator = 0;  /*
8d30: 20 63 61 73 65 20 31 20 74 72 75 6d 70 73 20 63   case 1 trumps c
8d40: 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  ase 2 */.    }. 
8d50: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
8d60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
8d70: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21  PTIMIZATION && !
8d80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
8d90: 55 45 52 59 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  UERY */.../*.** 
8da0: 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69  The input to thi
8db0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
8dc0: 57 68 65 72 65 54 65 72 6d 20 73 74 72 75 63 74  WhereTerm struct
8dd0: 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74 68  ure with only th
8de0: 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69 65  e.** "pExpr" fie
8df0: 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54  ld filled in.  T
8e00: 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
8e10: 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e 61  outine is to ana
8e20: 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62 65  lyze the.** sube
8e30: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f  xpression and po
8e40: 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20 6f  pulate all the o
8e50: 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 74  ther fields of t
8e60: 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20  he WhereTerm.** 
8e70: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
8e80: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
8e90: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
8ea0: 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58  m "<expr> <op> X
8eb0: 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75 74  " it gets commut
8ec0: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  ed.** to the sta
8ed0: 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22 58  ndard form of "X
8ee0: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a   <op> <expr>"..*
8ef0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
8f00: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
8f10: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
8f20: 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61 6e   where both X an
8f30: 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d  d Y are.** colum
8f40: 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69  ns, then the ori
8f50: 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ginal expression
8f60: 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
8f70: 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a  d a new virtual.
8f80: 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66  ** term of the f
8f90: 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20 69  orm "Y <op> X" i
8fa0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 57  s added to the W
8fb0: 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 0a  HERE clause and.
8fc0: 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61  ** analyzed sepa
8fd0: 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72 69  rately.  The ori
8fe0: 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d 61  ginal term is ma
8ff0: 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 43  rked with TERM_C
9000: 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68 65  OPIED.** and the
9010: 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61 72   new term is mar
9020: 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44 59  ked with TERM_DY
9030: 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65 20 69  NAMIC (because i
9040: 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65 65  t's pExpr.** nee
9050: 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 77  ds to be freed w
9060: 69 74 68 20 74 68 65 20 57 68 65 72 65 43 6c 61  ith the WhereCla
9070: 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56 49  use) and TERM_VI
9080: 52 54 55 41 4c 20 28 62 65 63 61 75 73 65 20 69  RTUAL (because i
9090: 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75 74  t.** is a commut
90a0: 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72 69  ed copy of a pri
90b0: 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20 6f  or term.)  The o
90c0: 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61 73  riginal term has
90d0: 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64   nChild=1.** and
90e0: 20 74 68 65 20 63 6f 70 79 20 68 61 73 20 69 64   the copy has id
90f0: 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20 74  xParent set to t
9100: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
9110: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a  original term..*
9120: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
9130: 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63  prAnalyze(.  Src
9140: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
9150: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
9160: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
9170: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
9180: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
9190: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
91a0: 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20    int idxTerm   
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
91c0: 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d  ndex of the term
91d0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
91e0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
91f0: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
9200: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9210: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
9220: 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  zed */.  WhereMa
9230: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
9240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
9250: 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20   of table index 
9260: 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20  masks */.  Expr 
9270: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
9280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9290: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
92a0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
92b0: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
92c0: 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
92d0: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
92e0: 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72  tes of the pExpr
92f0: 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74  ->pLeft */.  Bit
9300: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9320: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
9330: 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74  f pExpr */.  Bit
9340: 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20  mask extraRight 
9350: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 74  = 0;.  int nPatt
9360: 65 72 6e 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6d  ern;.  int isCom
9370: 70 6c 65 74 65 3b 0a 20 20 69 6e 74 20 6e 6f 43  plete;.  int noC
9380: 61 73 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20  ase;.  int op;  
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c          /* Top-l
93b0: 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20  evel operator.  
93c0: 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50  pExpr->op */.  P
93d0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
93e0: 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  WC->pParse;     
93f0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
9400: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
9410: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9420: 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
9430: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
9440: 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  */..  if( db->ma
9450: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
9460: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
9470: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
9480: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73  idxTerm];.  pMas
9490: 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73  kSet = pWC->pMas
94a0: 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20  kSet;.  pExpr = 
94b0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
94c0: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
94d0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
94e0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
94f0: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
9500: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
9510: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
9520: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
9530: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
9540: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9550: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
9560: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
9570: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9580: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
9590: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
95a0: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  et, pExpr->x.pSe
95b0: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
95c0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
95d0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
95e0: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
95f0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
9600: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
9610: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
9620: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
9630: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9640: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
9650: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
9660: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
9670: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
9680: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
9690: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
96a0: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
96b0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
96c0: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
96d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
96e0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
96f0: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
9700: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
9710: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
9720: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
9730: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
9740: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
9750: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
9760: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
9770: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
9780: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97a0: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
97b0: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
97c0: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
97d0: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
97e0: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
97f0: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
9800: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
9810: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
9820: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
9830: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
9840: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
9850: 70 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d  p(op) && (pTerm-
9860: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
9870: 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b  rereqLeft)==0 ){
9880: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
9890: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
98a0: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
98b0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
98c0: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  t;.    if( pLeft
98d0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
98e0: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
98f0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
9900: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
9910: 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43    pTerm->u.leftC
9920: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
9930: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54  Column;.      pT
9940: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
9950: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70   operatorMask(op
9960: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9970: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
9980: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
9990: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
99a0: 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  erm *pNew;.     
99b0: 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20   Expr *pDup;.   
99c0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
99d0: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
99e0: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
99f0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
9a00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
9a10: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
9a20: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
9a30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
9a40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9a50: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
9a60: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
9a70: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
9a80: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
9a90: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
9aa0: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
9ab0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
9ac0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
9ad0: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
9ae0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
9af0: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
9b00: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
9b10: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
9b20: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
9b30: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
9b40: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
9b50: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
9b60: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
9b70: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
9b80: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
9b90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9ba0: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45         pDup = pE
9bb0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  xpr;.        pNe
9bc0: 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  w = pTerm;.     
9bd0: 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d   }.      exprCom
9be0: 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75  mute(pParse, pDu
9bf0: 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20  p);.      pLeft 
9c00: 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20  = pDup->pLeft;. 
9c10: 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43       pNew->leftC
9c20: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
9c30: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65  Table;.      pNe
9c40: 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  w->u.leftColumn 
9c50: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
9c60: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72  ;.      pNew->pr
9c70: 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
9c80: 65 71 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e  eqLeft;.      pN
9c90: 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  ew->prereqAll = 
9ca0: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20  prereqAll;.     
9cb0: 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72   pNew->eOperator
9cc0: 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28   = operatorMask(
9cd0: 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d  pDup->op);.    }
9ce0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
9cf0: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
9d00: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  N_OPTIMIZATION. 
9d10: 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73   /* If a term is
9d20: 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65   the BETWEEN ope
9d30: 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77  rator, create tw
9d40: 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  o new virtual te
9d50: 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65  rms.  ** that de
9d60: 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74  fine the range t
9d70: 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20  hat the BETWEEN 
9d80: 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72  implements.  For
9d90: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
9da0: 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45   **      a BETWE
9db0: 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a  EN b AND c.  **.
9dc0: 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65    ** is converte
9dd0: 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
9de0: 2a 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45  *      (a BETWEE
9df0: 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28  N b AND c) AND (
9e00: 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29  a>=b) AND (a<=c)
9e10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74  .  **.  ** The t
9e20: 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65  wo new terms are
9e30: 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20   added onto the 
9e40: 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65  end of the Where
9e50: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20  Clause object.. 
9e60: 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d   ** The new term
9e70: 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20  s are "dynamic" 
9e80: 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e  and are children
9e90: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
9ea0: 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65   BETWEEN.  ** te
9eb0: 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  rm.  That means 
9ec0: 74 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57  that if the BETW
9ed0: 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65  EEN term is code
9ee0: 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  d, the children 
9ef0: 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64  are.  ** skipped
9f00: 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68  .  Or, if the ch
9f10: 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73  ildren are satis
9f20: 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  fied by an index
9f30: 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  , the original. 
9f40: 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d   ** BETWEEN term
9f50: 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   is skipped..  *
9f60: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
9f70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45  pr->op==TK_BETWE
9f80: 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54  EN && pWC->op==T
9f90: 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70  K_AND ){.    Exp
9fa0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
9fb0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
9fc0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
9fd0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70  atic const u8 op
9fe0: 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b  s[] = {TK_GE, TK
9ff0: 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  _LE};.    assert
a000: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
a010: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
a020: 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20  >nExpr==2 );.   
a030: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
a040: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
a050: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
a060: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
a070: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
a080: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 6f 70  lite3Expr(db, op
a090: 73 5b 69 5d 2c 20 73 71 6c 69 74 65 33 45 78 70  s[i], sqlite3Exp
a0a0: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e  rDup(db, pExpr->
a0b0: 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20  pLeft, 0),.     
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a0e0: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  xprDup(db, pList
a0f0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29  ->a[i].pExpr, 0)
a100: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e  , 0);.      idxN
a110: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
a120: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
a130: 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55  Expr, TERM_VIRTU
a140: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
a150: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
a160: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
a170: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
a180: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
a190: 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ew);.      pTerm
a1a0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
a1b0: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  rm];.      pWC->
a1c0: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
a1d0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
a1e0: 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43   }.    pTerm->nC
a1f0: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65  hild = 2;.  }.#e
a200: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
a210: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
a220: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
a230: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a240: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
a250: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
a260: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
a270: 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e  UBQUERY).  /* An
a280: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
a290: 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66  t is composed of
a2a0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62   two or more sub
a2b0: 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
a2c0: 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70  by.  ** an OR op
a2d0: 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65  erator..  */.  e
a2e0: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
a2f0: 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20  p==TK_OR ){.    
a300: 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d  assert( pWC->op=
a310: 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65  =TK_AND );.    e
a320: 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d  xprAnalyzeOrTerm
a330: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54  (pSrc, pWC, idxT
a340: 65 72 6d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  erm);.  }.#endif
a350: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
a360: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
a370: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
a380: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
a390: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41  IMIZATION.  /* A
a3a0: 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  dd constraints t
a3b0: 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
a3c0: 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c  rch space on a L
a3d0: 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a  IKE or GLOB.  **
a3e0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
a3f0: 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74    ** A like patt
a400: 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ern of the form 
a410: 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20  "x LIKE 'abc%'" 
a420: 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20  is changed into 
a430: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
a440: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78  .  **          x
a450: 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61  >='abc' AND x<'a
a460: 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27  bd' AND x LIKE '
a470: 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20  abc%'.  **.  ** 
a480: 54 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  The last charact
a490: 65 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  er of the prefix
a4a0: 20 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d   "abc" is increm
a4b0: 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68  ented to form th
a4c0: 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69  e.  ** terminati
a4d0: 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62  on condition "ab
a4e0: 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  d"..  */.  if( i
a4f0: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72  sLikeOrGlob(pPar
a500: 73 65 2c 20 70 45 78 70 72 2c 20 26 6e 50 61 74  se, pExpr, &nPat
a510: 74 65 72 6e 2c 20 26 69 73 43 6f 6d 70 6c 65 74  tern, &isComplet
a520: 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 20 20  e, &noCase).    
a530: 20 20 20 20 20 26 26 20 70 57 43 2d 3e 6f 70 3d       && pWC->op=
a540: 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45  =TK_AND ){.    E
a550: 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69  xpr *pLeft, *pRi
a560: 67 68 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  ght;.    Expr *p
a570: 53 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20  Str1, *pStr2;.  
a580: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
a590: 31 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20  1, *pNewExpr2;. 
a5a0: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 2c 20     int idxNew1, 
a5b0: 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c  idxNew2;..    pL
a5c0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
a5d0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
a5e0: 3b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ;.    pRight = p
a5f0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
a600: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [0].pExpr;.    p
a610: 53 74 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45  Str1 = sqlite3PE
a620: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 53  xpr(pParse, TK_S
a630: 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20 30 29 3b  TRING, 0, 0, 0);
a640: 0a 20 20 20 20 69 66 28 20 70 53 74 72 31 20 29  .    if( pStr1 )
a650: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
a660: 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 53  okenCopy(db, &pS
a670: 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52 69  tr1->token, &pRi
a680: 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  ght->token);.   
a690: 20 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2e     pStr1->token.
a6a0: 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20  n = nPattern;.  
a6b0: 20 20 20 20 70 53 74 72 31 2d 3e 66 6c 61 67 73      pStr1->flags
a6c0: 20 3d 20 45 50 5f 44 65 71 75 6f 74 65 64 3b 0a   = EP_Dequoted;.
a6d0: 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72 32 20      }.    pStr2 
a6e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a6f0: 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a  (db, pStr1, 0);.
a700: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
a710: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
a720: 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 0a 20 20     u8 c, *pC;.  
a730: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
a740: 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Str2->token.dyn 
a750: 29 3b 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d  ); */.      pC =
a760: 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 74 6f   (u8*)&pStr2->to
a770: 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e 2d 31  ken.z[nPattern-1
a780: 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43  ];.      c = *pC
a790: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61  ;.      if( noCa
a7a0: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  se ){.        if
a7b0: 28 20 63 3d 3d 27 40 27 20 29 20 69 73 43 6f 6d  ( c=='@' ) isCom
a7c0: 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  plete = 0;.     
a7d0: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70     c = sqlite3Up
a7e0: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20  perToLower[c];. 
a7f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43       }.      *pC
a800: 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a   = c + 1;.    }.
a810: 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20      pNewExpr1 = 
a820: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
a830: 72 73 65 2c 20 54 4b 5f 47 45 2c 20 73 71 6c 69  rse, TK_GE, sqli
a840: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c  te3ExprDup(db,pL
a850: 65 66 74 2c 30 29 2c 70 53 74 72 31 2c 30 29 3b  eft,0),pStr1,0);
a860: 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77  .    idxNew1 = w
a870: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
a880: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c  (pWC, pNewExpr1,
a890: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
a8a0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
a8b0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
a8c0: 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w1==0 );.    exp
a8d0: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
a8e0: 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20  WC, idxNew1);.  
a8f0: 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71    pNewExpr2 = sq
a900: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
a910: 65 2c 20 54 4b 5f 4c 54 2c 20 73 71 6c 69 74 65  e, TK_LT, sqlite
a920: 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66  3ExprDup(db,pLef
a930: 74 2c 30 29 2c 70 53 74 72 32 2c 30 29 3b 0a 20  t,0),pStr2,0);. 
a940: 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65     idxNew2 = whe
a950: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
a960: 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54  WC, pNewExpr2, T
a970: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
a980: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74  _DYNAMIC);.    t
a990: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 32  estcase( idxNew2
a9a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41  ==0 );.    exprA
a9b0: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
a9c0: 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20  , idxNew2);.    
a9d0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
a9e0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66  idxTerm];.    if
a9f0: 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  ( isComplete ){.
aa00: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
aa10: 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20  New1].iParent = 
aa20: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
aa30: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69  WC->a[idxNew2].i
aa40: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
aa50: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
aa60: 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d  Child = 2;.    }
aa70: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
aa80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
aa90: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
aaa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
aab0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
aac0: 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f  E.  /* Add a WO_
aad0: 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79 20  MATCH auxiliary 
aae0: 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73  term to the cons
aaf0: 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74 68  traint set if th
ab00: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65  e.  ** current e
ab10: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
ab20: 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d  the form:  colum
ab30: 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20  n MATCH expr..  
ab40: 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  ** This informat
ab50: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
ab60: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
ab70: 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69  thods of.  ** vi
ab80: 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54  rtual tables.  T
ab90: 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79 20  he native query 
aba0: 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e  optimizer does n
abb0: 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20  ot attempt.  ** 
abc0: 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77  to do anything w
abd0: 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69  ith MATCH functi
abe0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
abf0: 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
ac00: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e  pExpr) ){.    in
ac10: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78  t idxNew;.    Ex
ac20: 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65  pr *pRight, *pLe
ac30: 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ft;.    WhereTer
ac40: 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20  m *pNewTerm;.   
ac50: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43   Bitmask prereqC
ac60: 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70  olumn, prereqExp
ac70: 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d  r;..    pRight =
ac80: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
ac90: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
aca0: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
acb0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
acc0: 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45  xpr;.    prereqE
acd0: 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55  xpr = exprTableU
ace0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
acf0: 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72  Right);.    prer
ad00: 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54  eqColumn = exprT
ad10: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
ad20: 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  et, pLeft);.    
ad30: 69 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20  if( (prereqExpr 
ad40: 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d  & prereqColumn)=
ad50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
ad60: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
ad70: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
ad80: 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
ad90: 4d 41 54 43 48 2c 20 30 2c 20 73 71 6c 69 74 65  MATCH, 0, sqlite
ada0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69  3ExprDup(db, pRi
adb0: 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  ght, 0), 0);.   
adc0: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
add0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
ade0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
adf0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
ae00: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
ae10: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
ae20: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
ae30: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
ae40: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
ae50: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
ae60: 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72  ght = prereqExpr
ae70: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
ae80: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
ae90: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
aea0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
aeb0: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
aec0: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
aed0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
aee0: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43  erator = WO_MATC
aef0: 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  H;.      pNewTer
af00: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  m->iParent = idx
af10: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
af20: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
af30: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
af40: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
af50: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
af60: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
af70: 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
af80: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
af90: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
afa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
afb0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
afc0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
afd0: 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20  /..  /* Prevent 
afe0: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
aff0: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66  of a LEFT JOIN f
b000: 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74  rom being used t
b010: 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20  o drive.  ** an 
b020: 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73  index for tables
b030: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
b040: 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
b050: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
b060: 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68  ght |= extraRigh
b070: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
b080: 72 6e 20 54 52 55 45 20 69 66 20 61 6e 79 20 6f  rn TRUE if any o
b090: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b0a0: 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 69 46  s in pList->a[iF
b0b0: 69 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74 61 69 6e  irst...] contain
b0c0: 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
b0d0: 74 6f 20 61 6e 79 20 74 61 62 6c 65 20 6f 74 68  to any table oth
b0e0: 65 72 20 74 68 61 6e 20 74 68 65 20 69 42 61 73  er than the iBas
b0f0: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
b100: 69 63 20 69 6e 74 20 72 65 66 65 72 65 6e 63 65  ic int reference
b110: 73 4f 74 68 65 72 54 61 62 6c 65 73 28 0a 20 20  sOtherTables(.  
b120: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
b130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
b140: 72 63 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  rch expressions 
b150: 69 6e 20 74 68 73 20 6c 69 73 74 20 2a 2f 0a 20  in ths list */. 
b160: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
b170: 4d 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20 4d 61  MaskSet,   /* Ma
b180: 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65  pping from table
b190: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
b1a0: 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20    int iFirst,   
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
b1c0: 65 20 73 65 61 72 63 68 69 6e 67 20 77 69 74 68  e searching with
b1d0: 20 74 68 65 20 69 46 69 72 73 74 2d 74 68 20 65   the iFirst-th e
b1e0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
b1f0: 6e 74 20 69 42 61 73 65 20 20 20 20 20 20 20 20  nt iBase        
b200: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f           /* Igno
b210: 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
b220: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29   this table */.)
b230: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 61 6c 6c 6f  {.  Bitmask allo
b240: 77 65 64 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70  wed = ~getMask(p
b250: 4d 61 73 6b 53 65 74 2c 20 69 42 61 73 65 29 3b  MaskSet, iBase);
b260: 0a 20 20 77 68 69 6c 65 28 20 69 46 69 72 73 74  .  while( iFirst
b270: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  <pList->nExpr ){
b280: 0a 20 20 20 20 69 66 28 20 28 65 78 70 72 54 61  .    if( (exprTa
b290: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
b2a0: 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72  t, pList->a[iFir
b2b0: 73 74 2b 2b 5d 2e 70 45 78 70 72 29 26 61 6c 6c  st++].pExpr)&all
b2c0: 6f 77 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  owed)!=0 ){.    
b2d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b2e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b2f0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
b300: 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73   routine decides
b310: 20 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20   if pIdx can be 
b320: 75 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  used to satisfy 
b330: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
b340: 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63  clause.  If it c
b350: 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31  an, it returns 1
b360: 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f  .  If pIdx canno
b370: 74 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  t satisfy the.**
b380: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
b390: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
b3a0: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20  eturns 0..**.** 
b3b0: 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f  pOrderBy is an O
b3c0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
b3d0: 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61  rom a SELECT sta
b3e0: 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73  tement.  pTab is
b3f0: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
b400: 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  t table in the F
b410: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
b420: 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73  at same SELECT s
b430: 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20  tatement and.** 
b440: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
b450: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
b460: 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69   "base".  pIdx i
b470: 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54  s an index on pT
b480: 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c  ab..**.** nEqCol
b490: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
b4a0: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64  f columns of pId
b4b0: 78 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  x that are used 
b4c0: 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63  as equality.** c
b4d0: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79  onstraints.  Any
b4e0: 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e   of these column
b4f0: 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67  s may be missing
b500: 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
b510: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64  BY.** clause and
b520: 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73   the match can s
b530: 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73  till be a succes
b540: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72  s..**.** All ter
b550: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
b560: 42 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67  BY that match ag
b570: 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20  ainst the index 
b580: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a  must be either.*
b590: 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20  * ASC or DESC.  
b5a0: 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52  (Terms of the OR
b5b0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61  DER BY clause pa
b5c0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
b5d0: 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20  UNIQUE.** index 
b5e0: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73  do not need to s
b5f0: 61 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73  atisfy this cons
b600: 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70  traint.)  The *p
b610: 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a  bRev value is.**
b620: 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
b630: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
b640: 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64   is all DESC and
b650: 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20   it is set to 0 
b660: 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  if.** the ORDER 
b670: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
b680: 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   ASC..*/.static 
b690: 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64  int isSortingInd
b6a0: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
b6b0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
b6c0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b6d0: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
b6e0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a  et *pMaskSet, /*
b6f0: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
b700: 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ble cursor numbe
b710: 72 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f  rs to bitmaps */
b720: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
b730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b740: 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74  e index we are t
b750: 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  esting */.  int 
b760: 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  base,           
b770: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
b780: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
b790: 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  le to be sorted 
b7a0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
b7b0: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
b7c0: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
b7d0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  use */.  int nEq
b7e0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
b7f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
b800: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68  dex columns with
b810: 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
b820: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20  */.  int *pbRev 
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b840: 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44 45  Set to 1 if ORDE
b850: 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f 0a  R BY is DESC */.
b860: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
b890: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 73  nters */.  int s
b8a0: 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20 20 20  ortOrder = 0;   
b8b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 4f             /* XO
b8c0: 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64 20 4f  R of index and O
b8d0: 52 44 45 52 20 42 59 20 73 6f 72 74 20 64 69 72  RDER BY sort dir
b8e0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
b8f0: 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
b900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b910: 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42  umber of ORDER B
b920: 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72  Y terms */.  str
b930: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
b940: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
b950: 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  A term of the OR
b960: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
b970: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b980: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
b990: 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
b9a0: 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d 20 3d  !=0 );.  nTerm =
b9b0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
b9c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 72  ;.  assert( nTer
b9d0: 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74  m>0 );..  /* Mat
b9e0: 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ch terms of the 
b9f0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
ba00: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
ba10: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  of.  ** the inde
ba20: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  x..  **.  ** Not
ba30: 65 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 68  e that indices h
ba40: 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ave pIdx->nColum
ba50: 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e  n regular column
ba60: 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65 20  s plus.  ** one 
ba70: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
ba80: 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  n containing the
ba90: 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f 77   rowid.  The row
baa0: 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f  id column.  ** o
bab0: 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61  f the index is a
bac0: 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d  lso allowed to m
bad0: 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65  atch against the
bae0: 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63   ORDER BY.  ** c
baf0: 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  lause..  */.  fo
bb00: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
bb10: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54  OrderBy->a; j<nT
bb20: 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d 3e  erm && i<=pIdx->
bb30: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
bb40: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20     Expr *pExpr; 
bb50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
bb60: 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f  ression of the O
bb70: 52 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a 2f  RDER BY pTerm */
bb80: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
bb90: 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20 63  oll;    /* The c
bba0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
bbb0: 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  e of pExpr */.  
bbc0: 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72    int termSortOr
bbd0: 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64  der; /* Sort ord
bbe0: 65 72 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  er for this term
bbf0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   */.    int iCol
bc00: 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  umn;       /* Th
bc10: 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i-th column of
bc20: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31 20   the index.  -1 
bc30: 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20  for rowid */.   
bc40: 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 3b   int iSortOrder;
bc50: 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45 53      /* 1 for DES
bc60: 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e 20  C, 0 for ASC on 
bc70: 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 74  the i-th index t
bc80: 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  erm */.    const
bc90: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a   char *zColl; /*
bca0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
bcb0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
bcc0: 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20 74  for i-th index t
bcd0: 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70  erm */..    pExp
bce0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
bcf0: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
bd00: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
bd10: 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
bd20: 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 2f  =base ){.      /
bd30: 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e  * Can not use an
bd40: 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20 61   index sort on a
bd50: 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73 20  nything that is 
bd60: 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  not a column in 
bd70: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66  the.      ** lef
bd80: 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66 20  t-most table of 
bd90: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
bda0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
bdb0: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20      }.    pColl 
bdc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
bdd0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
bde0: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  pr);.    if( !pC
bdf0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
be00: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
be10: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ll;.    }.    if
be20: 28 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ( i<pIdx->nColum
be30: 6e 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  n ){.      iColu
be40: 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  mn = pIdx->aiCol
be50: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  umn[i];.      if
be60: 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ( iColumn==pIdx-
be70: 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29  >pTable->iPKey )
be80: 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  {.        iColum
be90: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  n = -1;.      }.
bea0: 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72        iSortOrder
beb0: 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
bec0: 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43  der[i];.      zC
bed0: 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
bee0: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  ll[i];.    }else
bef0: 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20  {.      iColumn 
bf00: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72  = -1;.      iSor
bf10: 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  tOrder = 0;.    
bf20: 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d    zColl = pColl-
bf30: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20  >zName;.    }.  
bf40: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
bf50: 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c  lumn!=iColumn ||
bf60: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
bf70: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
bf80: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  oll) ){.      /*
bf90: 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f   Term j of the O
bfa0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 64  RDER BY clause d
bfb0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f  oes not match co
bfc0: 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e  lumn i of the in
bfd0: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
bfe0: 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20   i<nEqCol ){.   
bff0: 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e       /* If an in
c000: 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  dex column that 
c010: 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
c020: 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61  y == fails to ma
c030: 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a  tch an.        *
c040: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c  * ORDER BY term,
c050: 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75   that is OK.  Ju
c060: 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63  st ignore that c
c070: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
c080: 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ex.        */.  
c090: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
c0a0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c0b0: 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i==pIdx->nColumn
c0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
c0d0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 20 69 73  ndex column i is
c0e0: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 41 6c 6c   the rowid.  All
c0f0: 20 6f 74 68 65 72 20 74 65 72 6d 73 20 6d 61 74   other terms mat
c100: 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ch. */.        b
c110: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
c120: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e{.        /* If
c130: 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   an index column
c140: 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20   fails to match 
c150: 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  and is not const
c160: 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20  rained by ==.   
c170: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
c180: 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61   index cannot sa
c190: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
c1a0: 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  BY constraint.. 
c1b0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c1c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c1d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
c1e0: 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72  sert( pIdx->aSor
c1f0: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
c200: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
c210: 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20  sortOrder==0 || 
c220: 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pTerm->sortOrder
c230: 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
c240: 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30  t( iSortOrder==0
c250: 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d   || iSortOrder==
c260: 31 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72  1 );.    termSor
c270: 74 4f 72 64 65 72 20 3d 20 69 53 6f 72 74 4f 72  tOrder = iSortOr
c280: 64 65 72 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72  der ^ pTerm->sor
c290: 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20  tOrder;.    if( 
c2a0: 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20  i>nEqCol ){.    
c2b0: 20 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72    if( termSortOr
c2c0: 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29  der!=sortOrder )
c2d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  {.        /* Ind
c2e0: 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65  ices can only be
c2f0: 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44   used if all ORD
c300: 45 52 20 42 59 20 74 65 72 6d 73 20 70 61 73 74  ER BY terms past
c310: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
c320: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
c330: 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74  ints are all eit
c340: 68 65 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e  her DESC or ASC.
c350: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
c360: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
c370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
c380: 6f 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53  ortOrder = termS
c390: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
c3a0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65      j++;.    pTe
c3b0: 72 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43  rm++;.    if( iC
c3c0: 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 72 65 66 65  olumn<0 && !refe
c3d0: 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65  rencesOtherTable
c3e0: 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73  s(pOrderBy, pMas
c3f0: 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29  kSet, j, base) )
c400: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
c410: 65 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  e indexed column
c420: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
c430: 6b 65 79 20 61 6e 64 20 65 76 65 72 79 74 68 69  key and everythi
c440: 6e 67 20 6d 61 74 63 68 65 73 0a 20 20 20 20 20  ng matches.     
c450: 20 2a 2a 20 73 6f 20 66 61 72 20 61 6e 64 20 6e   ** so far and n
c460: 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52  one of the ORDER
c470: 20 42 59 20 74 65 72 6d 73 20 74 6f 20 74 68 65   BY terms to the
c480: 20 72 69 67 68 74 20 72 65 66 65 72 65 6e 63 65   right reference
c490: 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
c4a0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f  tables in the jo
c4b0: 69 6e 2c 20 74 68 65 6e 20 77 65 20 61 72 65 20  in, then we are 
c4c0: 61 73 73 75 72 65 64 20 74 68 61 74 20 74 68 65  assured that the
c4d0: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
c4e0: 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ed .      ** to 
c4f0: 73 6f 72 74 20 62 65 63 61 75 73 65 20 74 68 65  sort because the
c500: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
c510: 75 6e 69 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f  unique and so no
c520: 6e 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 0a  ne of the other.
c530: 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73        ** columns
c540: 20 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64   will make any d
c550: 69 66 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  ifference.      
c560: 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 6e 54 65  */.      j = nTe
c570: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rm;.    }.  }.. 
c580: 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72   *pbRev = sortOr
c590: 64 65 72 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e  der!=0;.  if( j>
c5a0: 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a  =nTerm ){.    /*
c5b0: 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   All terms of th
c5c0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
c5d0: 65 20 61 72 65 20 63 6f 76 65 72 65 64 20 62 79  e are covered by
c5e0: 20 74 68 69 73 20 69 6e 64 65 78 20 73 6f 0a 20   this index so. 
c5f0: 20 20 20 2a 2a 20 74 68 69 73 20 69 6e 64 65 78     ** this index
c600: 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
c610: 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20   sorting. */.   
c620: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
c630: 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
c640: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69  or!=OE_None && i
c650: 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a  ==pIdx->nColumn.
c660: 20 20 20 20 20 20 26 26 20 21 72 65 66 65 72 65        && !refere
c670: 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28  ncesOtherTables(
c680: 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53  pOrderBy, pMaskS
c690: 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a  et, j, base) ){.
c6a0: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73      /* All terms
c6b0: 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 20 6d   of this index m
c6c0: 61 74 63 68 20 73 6f 6d 65 20 70 72 65 66 69 78  atch some prefix
c6d0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
c6e0: 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 61   clause.    ** a
c6f0: 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  nd the index is 
c700: 55 4e 49 51 55 45 20 61 6e 64 20 6e 6f 20 74 65  UNIQUE and no te
c710: 72 6d 73 20 6f 6e 20 74 68 65 20 74 61 69 6c 20  rms on the tail 
c720: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  of the ORDER BY.
c730: 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 72 65      ** clause re
c740: 66 65 72 65 6e 63 65 20 6f 74 68 65 72 20 74 61  ference other ta
c750: 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20  bles in a join. 
c760: 20 49 66 20 74 68 69 73 20 69 73 20 61 6c 6c 20   If this is all 
c770: 74 72 75 65 20 74 68 65 6e 0a 20 20 20 20 2a 2a  true then.    **
c780: 20 74 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c   the order by cl
c790: 61 75 73 65 20 69 73 20 73 75 70 65 72 66 6c 75  ause is superflu
c7a0: 6f 75 73 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ous. */.    retu
c7b0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
c7c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
c7d0: 68 65 63 6b 20 74 61 62 6c 65 20 74 6f 20 73 65  heck table to se
c7e0: 65 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42  e if the ORDER B
c7f0: 59 20 63 6c 61 75 73 65 20 69 6e 20 70 4f 72 64  Y clause in pOrd
c800: 65 72 42 79 20 63 61 6e 20 62 65 20 73 61 74 69  erBy can be sati
c810: 73 66 69 65 64 0a 2a 2a 20 62 79 20 73 6f 72 74  sfied.** by sort
c820: 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 6f 66 20  ing in order of 
c830: 52 4f 57 49 44 2e 20 20 52 65 74 75 72 6e 20 74  ROWID.  Return t
c840: 72 75 65 20 69 66 20 73 6f 20 61 6e 64 20 73 65  rue if so and se
c850: 74 20 2a 70 62 52 65 76 20 74 6f 20 62 65 0a 2a  t *pbRev to be.*
c860: 2a 20 74 72 75 65 20 66 6f 72 20 72 65 76 65 72  * true for rever
c870: 73 65 20 52 4f 57 49 44 20 61 6e 64 20 66 61 6c  se ROWID and fal
c880: 73 65 20 66 6f 72 20 66 6f 72 77 61 72 64 20 52  se for forward R
c890: 4f 57 49 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  OWID order..*/.s
c8a0: 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74 61 62  tatic int sortab
c8b0: 6c 65 42 79 52 6f 77 69 64 28 0a 20 20 69 6e 74  leByRowid(.  int
c8c0: 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20   base,          
c8d0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
c8e0: 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20  umber for table 
c8f0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a  to be sorted */.
c900: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
c910: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65  erBy,     /* The
c920: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
c930: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
c940: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a  et *pMaskSet, /*
c950: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
c960: 62 6c 65 20 63 75 72 73 6f 72 73 20 74 6f 20 62  ble cursors to b
c970: 69 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20  itmaps */.  int 
c980: 2a 70 62 52 65 76 20 20 20 20 20 20 20 20 20 20  *pbRev          
c990: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
c9a0: 69 66 20 4f 52 44 45 52 20 42 59 20 69 73 20 44  if ORDER BY is D
c9b0: 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ESC */.){.  Expr
c9c0: 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
c9d0: 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
c9e0: 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
c9f0: 79 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  y->nExpr>0 );.  
ca00: 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  p = pOrderBy->a[
ca10: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
ca20: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
ca30: 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 62   && p->iTable==b
ca40: 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ase && p->iColum
ca50: 6e 3d 3d 2d 31 0a 20 20 20 20 26 26 20 21 72 65  n==-1.    && !re
ca60: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
ca70: 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d  les(pOrderBy, pM
ca80: 61 73 6b 53 65 74 2c 20 31 2c 20 62 61 73 65 29  askSet, 1, base)
ca90: 20 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20 3d   ){.    *pbRev =
caa0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
cab0: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 72  sortOrder;.    r
cac0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
cad0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
cae0: 2a 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64  * Prepare a crud
caf0: 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  e estimate of th
cb00: 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  e logarithm of t
cb10: 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a  he input value..
cb20: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e  ** The results n
cb30: 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74  eed not be exact
cb40: 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  .  This is only 
cb50: 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74  used for estimat
cb60: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c  ing.** the total
cb70: 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d   cost of perform
cb80: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  ing operations w
cb90: 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f  ith O(logN) or O
cba0: 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c  (NlogN).** compl
cbb0: 65 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20  exity.  Because 
cbc0: 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73  N is just a gues
cbd0: 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61  s, it is no grea
cbe0: 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20  t tragedy if.** 
cbf0: 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65  logN is a little
cc00: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
cc10: 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f  double estLog(do
cc20: 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c  uble N){.  doubl
cc30: 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f  e logN = 1;.  do
cc40: 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77  uble x = 10;.  w
cc50: 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20  hile( N>x ){.   
cc60: 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20   logN += 1;.    
cc70: 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72  x *= 10;.  }.  r
cc80: 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f  eturn logN;.}../
cc90: 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
cca0: 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
ccb0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
ccc0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
ccd0: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
cce0: 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
ccf0: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
cd00: 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
cd10: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
cd20: 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
cd30: 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
cd40: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
cd50: 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
cd60: 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
cd70: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
cd80: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
cd90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
cda0: 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
cdb0: 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
cdc0: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
cdd0: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
cde0: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
cdf0: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
ce00: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
ce10: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
ce20: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
ce30: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
ce40: 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
ce50: 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
ce60: 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
ce70: 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
ce80: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
ce90: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
cea0: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
ceb0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
cec0: 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
ced0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
cee0: 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
cef0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
cf00: 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
cf10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
cf20: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
cf30: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
cf40: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
cf50: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
cf60: 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
cf70: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
cf80: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
cf90: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
cfa0: 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
cfb0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
cfc0: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
cfd0: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
cfe0: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
cff0: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
d000: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
d010: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
d020: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
d030: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
d040: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
d050: 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
d060: 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
d070: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
d080: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
d090: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
d0a0: 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
d0b0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
d0c0: 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
d0d0: 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
d0e0: 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
d0f0: 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
d100: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
d110: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
d120: 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
d130: 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
d140: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
d150: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
d160: 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
d170: 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
d180: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
d190: 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
d1a0: 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
d1b0: 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73  tedCost);.}.#els
d1c0: 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  e.#define TRACE_
d1d0: 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64  IDX_INPUTS(A).#d
d1e0: 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
d1f0: 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69  OUTPUTS(A).#endi
d200: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
d210: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
d220: 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  BLE./*.** Comput
d230: 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78  e the best index
d240: 20 66 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74   for a virtual t
d250: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
d260: 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 63 6f  best index is co
d270: 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 78 42  mputed by the xB
d280: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20  estIndex method 
d290: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a  of the virtual.*
d2a0: 2a 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20  * table module. 
d2b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
d2c0: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 77   really just a w
d2d0: 72 61 70 70 65 72 20 74 68 61 74 20 73 65 74 73  rapper that sets
d2e0: 20 75 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   up.** the sqlit
d2f0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
d300: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
d310: 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63  used to communic
d320: 61 74 65 20 77 69 74 68 0a 2a 2a 20 78 42 65 73  ate with.** xBes
d330: 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e  tIndex..**.** In
d340: 20 61 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f   a join, this ro
d350: 75 74 69 6e 65 20 6d 69 67 68 74 20 62 65 20 63  utine might be c
d360: 61 6c 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20 74  alled multiple t
d370: 69 6d 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  imes for the.** 
d380: 73 61 6d 65 20 76 69 72 74 75 61 6c 20 74 61 62  same virtual tab
d390: 6c 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  le.  The sqlite3
d3a0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
d3b0: 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
d3c0: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
d3d0: 7a 65 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74  zed on the first
d3e0: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20   invocation and 
d3f0: 72 65 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75  reused on all su
d400: 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f  bsequent.** invo
d410: 63 61 74 69 6f 6e 73 2e 20 20 54 68 65 20 73 71  cations.  The sq
d420: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d430: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
d440: 73 6f 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20  so used when.** 
d450: 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
d460: 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  d to access the 
d470: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
d480: 54 68 65 20 77 68 65 72 65 49 6e 66 6f 44 65 6c  The whereInfoDel
d490: 65 74 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e  ete() .** routin
d4a0: 65 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  e takes care of 
d4b0: 66 72 65 65 69 6e 67 20 74 68 65 20 73 71 6c 69  freeing the sqli
d4c0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
d4d0: 74 72 75 63 74 75 72 65 20 61 66 74 65 72 0a 2a  tructure after.*
d4e0: 2a 20 65 76 65 72 79 62 6f 64 79 20 68 61 73 20  * everybody has 
d4f0: 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 69 74  finished with it
d500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62  ..*/.static doub
d510: 6c 65 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e  le bestVirtualIn
d520: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
d530: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
d540: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
d550: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d560: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
d570: 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  WC,             
d580: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
d590: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
d5a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
d5b0: 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  Src,     /* The 
d5c0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
d5d0: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
d5e0: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
d5f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
d600: 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
d610: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
d620: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78  vailable */.  Ex
d630: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
d640: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d650: 54 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61  The order by cla
d660: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 64  use */.  int ord
d670: 65 72 42 79 55 73 61 62 6c 65 2c 20 20 20 20 20  erByUsable,     
d680: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
d690: 69 66 20 77 65 20 63 61 6e 20 70 6f 74 65 6e 74  if we can potent
d6a0: 69 61 6c 20 73 6f 72 74 20 2a 2f 0a 20 20 73 71  ial sort */.  sq
d6b0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d6c0: 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20 2f 2a 20   **ppIdxInfo /* 
d6d0: 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61 74 69 6f  Index informatio
d6e0: 6e 20 70 61 73 73 65 64 20 74 6f 20 78 42 65 73  n passed to xBes
d6f0: 74 49 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 54  tIndex */.){.  T
d700: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 72  able *pTab = pSr
d710: 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  c->pTab;.  sqlit
d720: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
d730: 20 70 54 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20   pTab->pVtab;.  
d740: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
d750: 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20  fo *pIdxInfo;.  
d760: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
d770: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
d780: 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
d790: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
d7a0: 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f  x_orderby *pIdxO
d7b0: 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74  rderBy;.  struct
d7c0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
d7d0: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
d7e0: 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
d7f0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
d800: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
d810: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 72  OrderBy;.  int r
d820: 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  c;..  /* If the 
d830: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
d840: 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 61 73  fo structure has
d850: 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69 6f   not been previo
d860: 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  usly.  ** alloca
d870: 74 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ted and initiali
d880: 7a 65 64 20 66 6f 72 20 74 68 69 73 20 76 69 72  zed for this vir
d890: 74 75 61 6c 20 74 61 62 6c 65 2c 20 74 68 65 6e  tual table, then
d8a0: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61   allocate.  ** a
d8b0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
d8c0: 20 6e 6f 77 0a 20 20 2a 2f 0a 20 20 70 49 64 78   now.  */.  pIdx
d8d0: 49 6e 66 6f 20 3d 20 2a 70 70 49 64 78 49 6e 66  Info = *ppIdxInf
d8e0: 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  o;.  if( pIdxInf
d8f0: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  o==0 ){.    int 
d900: 6e 54 65 72 6d 3b 0a 20 20 20 20 57 48 45 52 45  nTerm;.    WHERE
d910: 54 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74  TRACE(("Recomput
d920: 69 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66  ing index info f
d930: 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 54 61  or %s...\n", pTa
d940: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20  b->zName));..   
d950: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
d960: 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65  mber of possible
d970: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
d980: 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72  nstraints referr
d990: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ing.    ** to th
d9a0: 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
d9b0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6e 54   */.    for(i=nT
d9c0: 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
d9d0: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
d9e0: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
d9f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
da00: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
da10: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
da20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
da30: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
da40: 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72  >eOperator&(pTer
da50: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29  m->eOperator-1))
da60: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
da70: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
da80: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29  perator==WO_IN )
da90: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
daa0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
dab0: 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  or==WO_ISNULL );
dac0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
dad0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
dae0: 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
daf0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
db00: 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 7d    nTerm++;.    }
db10: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
db20: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
db30: 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f  contains only co
db40: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72  lumns in the cur
db50: 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20 76 69 72  rent .    ** vir
db60: 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20  tual table then 
db70: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
db80: 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20  or the aOrderBy 
db90: 70 61 72 74 20 6f 66 0a 20 20 20 20 2a 2a 20 74  part of.    ** t
dba0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
dbb0: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
dbc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4f 72 64  .    */.    nOrd
dbd0: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  erBy = 0;.    if
dbe0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
dbf0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
dc00: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
dc10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  i++){.        Ex
dc20: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
dc30: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
dc40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
dc50: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
dc60: 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
dc70: 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  ble!=pSrc->iCurs
dc80: 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
dc90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d    }.      if( i=
dca0: 3d 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  =pOrderBy->nExpr
dcb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72 64   ){.        nOrd
dcc0: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
dcd0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a  >nExpr;.      }.
dce0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
dcf0: 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
dd00: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
dd10: 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2f 0a 20  ructure.    */. 
dd20: 20 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71     pIdxInfo = sq
dd30: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
dd40: 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
dd50: 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a  zeof(*pIdxInfo).
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28               + (
dd80: 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73  sizeof(*pIdxCons
dd90: 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61  ) + sizeof(*pUsa
dda0: 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20  ge))*nTerm.     
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddc0: 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
ddd0: 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e  (*pIdxOrderBy)*n
dde0: 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 69  OrderBy );.    i
ddf0: 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
de00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
de10: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
de20: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
de30: 3b 0a 20 20 20 20 20 20 2f 2a 20 28 64 6f 75 62  ;.      /* (doub
de40: 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20  le)0 In case of 
de50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
de60: 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
de70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 64  .      return (d
de80: 6f 75 62 6c 65 29 30 3b 0a 20 20 20 20 7d 0a 20  ouble)0;.    }. 
de90: 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20     *ppIdxInfo = 
dea0: 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 20 20 2f  pIdxInfo;..    /
deb0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
dec0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
ded0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
dee0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
def0: 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20 6d 61  ntains.    ** ma
df00: 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ny fields that a
df10: 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e  re declared "con
df20: 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78  st" to prevent x
df30: 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20  BestIndex from. 
df40: 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74     ** changing t
df50: 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f  hem.  We have to
df60: 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63   do some funky c
df70: 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  asting in order 
df80: 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  to.    ** initia
df90: 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64  lize those field
dfa0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
dfb0: 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
dfc0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
dfd0: 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78  onstraint*)&pIdx
dfe0: 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20 70 49 64  Info[1];.    pId
dff0: 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75  xOrderBy = (stru
e000: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
e010: 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43  _orderby*)&pIdxC
e020: 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 20 20  ons[nTerm];.    
e030: 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74  pUsage = (struct
e040: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
e050: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
e060: 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f  )&pIdxOrderBy[nO
e070: 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 2a 28 69  rderBy];.    *(i
e080: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
e090: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65  Constraint = nTe
e0a0: 72 6d 3b 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26  rm;.    *(int*)&
e0b0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
e0c0: 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  By = nOrderBy;. 
e0d0: 20 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69     *(struct sqli
e0e0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
e0f0: 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
e100: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->aConstraint = 
e110: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 20 20 2a 28  pIdxCons;.    *(
e120: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
e130: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26  ndex_orderby**)&
e140: 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
e150: 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79  By = pIdxOrderBy
e160: 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20 73  ;.    *(struct s
e170: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
e180: 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29  straint_usage**)
e190: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
e1a0: 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20  traintUsage =.  
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 20 20     pUsage;..    
e200: 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d  for(i=j=0, pTerm
e210: 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
e220: 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
e230: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
e240: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
e250: 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
e260: 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
e270: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
e280: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
e290: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
e2a0: 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1))==0 );.     
e2b0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
e2c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
e2d0: 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IN );.      test
e2e0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
e2f0: 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c  erator==WO_ISNUL
e300: 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  L );.      if( p
e310: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
e320: 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  & (WO_IN|WO_ISNU
e330: 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
e340: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
e350: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72  ].iColumn = pTer
e360: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
e370: 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  .      pIdxCons[
e380: 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
e390: 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f   i;.      pIdxCo
e3a0: 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 70  ns[j].op = (u8)p
e3b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b  Term->eOperator;
e3c0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 69  .      /* The di
e3d0: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
e3e0: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
e3f0: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
e400: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
e410: 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
e420: 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
e430: 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
e440: 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
e450: 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 66    The.      ** f
e460: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
e470: 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63   verify this fac
e480: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  t. */.      asse
e490: 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
e4a0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
e4b0: 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 61  NT_EQ );.      a
e4c0: 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51  ssert( WO_LT==SQ
e4d0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
e4e0: 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20  RAINT_LT );.    
e4f0: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d    assert( WO_LE=
e500: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
e510: 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20  NSTRAINT_LE );. 
e520: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
e530: 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GT==SQLITE_INDEX
e540: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29  _CONSTRAINT_GT )
e550: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e560: 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GE==SQLITE_IN
e570: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
e580: 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
e590: 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
e5a0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
e5b0: 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
e5c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
e5d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
e5e0: 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_EQ|WO_LT|WO_L
e5f0: 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  E|WO_GT|WO_GE|WO
e600: 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 20  _MATCH) );.     
e610: 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   j++;.    }.    
e620: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
e630: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
e640: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
e650: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
e660: 78 70 72 3b 0a 20 20 20 20 20 20 70 49 64 78 4f  xpr;.      pIdxO
e670: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
e680: 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
e690: 6d 6e 3b 0a 20 20 20 20 20 20 70 49 64 78 4f 72  mn;.      pIdxOr
e6a0: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20  derBy[i].desc = 
e6b0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
e6c0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
e6d0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
e6e0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c  s point, the sql
e6f0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
e700: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 70  structure that p
e710: 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20  IdxInfo points. 
e720: 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76 65   ** to will have
e730: 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
e740: 64 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e 67  d, either during
e750: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76   the current inv
e760: 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20  ocation or.  ** 
e770: 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f  during some prio
e780: 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e  r invocation.  N
e790: 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76 65 20  ow we just have 
e7a0: 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68 65  to customize the
e7b0: 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66  .  ** details of
e7c0: 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74 68   pIdxInfo for th
e7d0: 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61  e current invoca
e7e0: 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69 74  tion and pass it
e7f0: 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e   to.  ** xBestIn
e800: 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  dex..  */..  /* 
e810: 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20  The module name 
e820: 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e  must be defined.
e830: 20 41 6c 73 6f 2c 20 62 79 20 74 68 69 73 20 70   Also, by this p
e840: 6f 69 6e 74 20 74 68 65 72 65 20 6d 75 73 74 0a  oint there must.
e850: 20 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74 65    ** be a pointe
e860: 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
e870: 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 20  vtab structure. 
e880: 4f 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20 73  Otherwise.  ** s
e890: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
e8a0: 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64  umnNames() would
e8b0: 20 68 61 76 65 20 70 69 63 6b 65 64 20 75 70 20   have picked up 
e8c0: 74 68 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f  the error. .  */
e8d0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
e8e0: 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20  >azModuleArg && 
e8f0: 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
e900: 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  g[0] );.  assert
e910: 28 20 70 56 74 61 62 20 29 3b 0a 23 69 66 20 30  ( pVtab );.#if 0
e920: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 56 74  .  if( pTab->pVt
e930: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ab==0 ){.    sql
e940: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
e950: 72 73 65 2c 20 22 75 6e 64 65 66 69 6e 65 64 20  rse, "undefined 
e960: 6d 6f 64 75 6c 65 20 25 73 20 66 6f 72 20 74 61  module %s for ta
e970: 62 6c 65 20 25 73 22 2c 0a 20 20 20 20 20 20 20  ble %s",.       
e980: 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
e990: 72 67 5b 30 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61  rg[0], pTab->zNa
e9a0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
e9b0: 30 2e 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0.0;.  }.#endif.
e9c0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43  .  /* Set the aC
e9d0: 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62  onstraint[].usab
e9e0: 6c 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e  le fields and in
e9f0: 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20  itialize all .  
ea00: 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  ** output variab
ea10: 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  les to zero..  *
ea20: 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69  *.  ** aConstrai
ea30: 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74  nt[].usable is t
ea40: 72 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  rue for constrai
ea50: 6e 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69  nts where the ri
ea60: 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69  ght-hand.  ** si
ea70: 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  de contains only
ea80: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
ea90: 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
eaa0: 74 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  t of the current
eab0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e  .  ** table.  In
eac0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
ead0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
eae0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
eaf0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
eb00: 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70      column = exp
eb10: 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  r.  **.  ** and 
eb20: 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
eb30: 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  g a join, then t
eb40: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  he constraint on
eb50: 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a   column is .  **
eb60: 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61   only valid if a
eb70: 6c 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65  ll tables refere
eb80: 6e 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63  nced in expr occ
eb90: 75 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ur to the left. 
eba0: 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
ebb0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75   containing colu
ebc0: 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  mn..  **.  ** Th
ebd0: 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d  e aConstraints[]
ebe0: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
ebf0: 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
ec00: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
ec10: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
ec20: 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79  table.  That way
ec30: 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f   we only have to
ec40: 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65   compute it once
ec50: 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67  .  ** even thoug
ec60: 68 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74  h we might try t
ec70: 6f 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20  o pick the best 
ec80: 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74  index multiple t
ec90: 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65  imes..  ** For e
eca0: 61 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70  ach attempt at p
ecb0: 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c  icking an index,
ecc0: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61   the order of ta
ecd0: 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a  bles in the.  **
ece0: 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64   join might be d
ecf0: 69 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68  ifferent so we h
ed00: 61 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65  ave to recompute
ed10: 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67   the usable flag
ed20: 0a 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e  .  ** each time.
ed30: 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  .  */.  pIdxCons
ed40: 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
ed50: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
ed60: 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
ed70: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
ed80: 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
ed90: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
eda0: 73 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sage;.  for(i=0;
edb0: 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
edc0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
edd0: 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
ede0: 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
edf0: 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70  ermOffset;.    p
ee00: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
ee10: 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d  ];.    pIdxCons-
ee20: 3e 75 73 61 62 6c 65 20 3d 20 20 28 70 54 65 72  >usable =  (pTer
ee30: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
ee40: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 3f 31   notReady)==0 ?1
ee50: 3a 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  :0;.  }.  memset
ee60: 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65  (pUsage, 0, size
ee70: 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49  of(pUsage[0])*pI
ee80: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
ee90: 69 6e 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78  int);.  if( pIdx
eea0: 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
eeb0: 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71  IdxStr ){.    sq
eec0: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
eed0: 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
eee0: 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  }.  pIdxInfo->id
eef0: 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78  xStr = 0;.  pIdx
ef00: 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30  Info->idxNum = 0
ef10: 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  ;.  pIdxInfo->ne
ef20: 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
ef30: 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
ef40: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
ef50: 3d 20 30 3b 0a 20 20 2f 2a 20 28 28 64 6f 75 62  = 0;.  /* ((doub
ef60: 6c 65 29 32 29 20 49 6e 20 63 61 73 65 20 6f 66  le)2) In case of
ef70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
ef80: 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
ef90: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  /.  pIdxInfo->es
efa0: 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51  timatedCost = SQ
efb0: 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28  LITE_BIG_DBL / (
efc0: 28 64 6f 75 62 6c 65 29 32 29 3b 0a 20 20 6e 4f  (double)2);.  nO
efd0: 72 64 65 72 42 79 20 3d 20 70 49 64 78 49 6e 66  rderBy = pIdxInf
efe0: 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69  o->nOrderBy;.  i
eff0: 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  f( pIdxInfo->nOr
f000: 64 65 72 42 79 20 26 26 20 21 6f 72 64 65 72 42  derBy && !orderB
f010: 79 55 73 61 62 6c 65 20 29 7b 0a 20 20 20 20 2a  yUsable ){.    *
f020: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
f030: 3e 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >nOrderBy = 0;. 
f040: 20 7d 0a 0a 20 20 28 76 6f 69 64 29 73 71 6c 69   }..  (void)sqli
f050: 74 65 33 53 61 66 65 74 79 4f 66 66 28 70 50 61  te3SafetyOff(pPa
f060: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 57 48 45 52  rse->db);.  WHER
f070: 45 54 52 41 43 45 28 28 22 78 42 65 73 74 49 6e  ETRACE(("xBestIn
f080: 64 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70  dex for %s\n", p
f090: 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
f0a0: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
f0b0: 28 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 63  (pIdxInfo);.  rc
f0c0: 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
f0d0: 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56  e->xBestIndex(pV
f0e0: 74 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  tab, pIdxInfo);.
f0f0: 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50    TRACE_IDX_OUTP
f100: 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b 0a 20  UTS(pIdxInfo);. 
f110: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
f120: 66 65 74 79 4f 6e 28 70 50 61 72 73 65 2d 3e 64  fetyOn(pParse->d
f130: 62 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53  b);..  if( rc!=S
f140: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f150: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
f160: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50  OMEM ){.      pP
f170: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
f180: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
f190: 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62  }else if( !pVtab
f1a0: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
f1b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f1c0: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
f1d0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
f1e0: 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c));.    }else{.
f1f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f200: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
f210: 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  s", pVtab->zErrM
f220: 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  sg);.    }.  }. 
f230: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
f240: 50 61 72 73 65 2d 3e 64 62 2c 20 70 56 74 61 62  Parse->db, pVtab
f250: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56  ->zErrMsg);.  pV
f260: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
f270: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
f280: 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
f290: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
f2a0: 20 69 66 28 20 21 70 49 64 78 49 6e 66 6f 2d 3e   if( !pIdxInfo->
f2b0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
f2c0: 73 61 62 6c 65 20 26 26 20 70 55 73 61 67 65 5b  sable && pUsage[
f2d0: 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
f2e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f2f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f300: 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
f310: 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78  e %s: xBestIndex
f320: 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
f330: 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62  alid plan", pTab
f340: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
f350: 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20  /* (double)0 In 
f360: 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f  case of SQLITE_O
f370: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
f380: 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 72  NT... */.      r
f390: 65 74 75 72 6e 20 28 64 6f 75 62 6c 65 29 30 3b  eturn (double)0;
f3a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 28  .    }.  }..  *(
f3b0: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
f3c0: 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
f3d0: 72 42 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 49  rBy;.  return pI
f3e0: 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
f3f0: 64 43 6f 73 74 3b 0a 7d 0a 23 65 6e 64 69 66 20  dCost;.}.#endif 
f400: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
f410: 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
f420: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 71  /*.** Find the q
f430: 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63  uery plan for ac
f440: 63 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63  cessing a partic
f450: 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 57 72 69  ular table.  Wri
f460: 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71  te the.** best q
f470: 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74  uery plan and it
f480: 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20  s cost into the 
f490: 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74  WhereCost object
f4a0: 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65   supplied as the
f4b0: 0a 2a 2a 20 6c 61 73 74 20 70 61 72 61 6d 65 74  .** last paramet
f4c0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f  er..**.** The lo
f4d0: 77 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20 77  west cost plan w
f4e0: 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69  ins.  The cost i
f4f0: 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
f500: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a   the amount of.*
f510: 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49  * CPU and disk I
f520: 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f 63 65  /O need to proce
f530: 73 73 20 74 68 65 20 72 65 71 75 65 73 74 20 75  ss the request u
f540: 73 69 6e 67 20 74 68 65 20 73 65 6c 65 63 74 65  sing the selecte
f550: 64 20 70 6c 61 6e 2e 0a 2a 2a 20 46 61 63 74 6f  d plan..** Facto
f560: 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63  rs that influenc
f570: 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a  e cost include:.
f580: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  **.**    *  The 
f590: 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
f5a0: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
f5b0: 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65 64 2e  ll be retrieved.
f5c0: 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20    (The.**       
f5d0: 66 65 77 65 72 20 74 68 65 20 62 65 74 74 65 72  fewer the better
f5e0: 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57  .).**.**    *  W
f5f0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f  hether or not so
f600: 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72  rting must occur
f610: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68  ..**.**    *  Wh
f620: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
f630: 72 65 20 6d 75 73 74 20 62 65 20 73 65 70 61 72  re must be separ
f640: 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74  ate lookups in t
f650: 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65  he.**       inde
f660: 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69  x and in the mai
f670: 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  n table..**.** I
f680: 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
f690: 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
f6a0: 20 28 70 53 72 63 2d 3e 70 49 6e 64 65 78 29 20   (pSrc->pIndex) 
f6b0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
f6c0: 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
f6d0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  SQL statement, t
f6e0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
f6f0: 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73  n only considers
f700: 20 70 6c 61 6e 73 20 75 73 69 6e 67 20 74 68 65   plans using the
f710: 20 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78   .** named index
f720: 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 70 6c 61  . If no such pla
f730: 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e  n is found, then
f740: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f   the returned co
f750: 73 74 20 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  st is.** SQLITE_
f760: 42 49 47 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c  BIG_DBL. If a pl
f770: 61 6e 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  an is found that
f780: 20 75 73 65 73 20 74 68 65 20 6e 61 6d 65 64 20   uses the named 
f790: 69 6e 64 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20  index, .** then 
f7a0: 74 68 65 20 63 6f 73 74 20 69 73 20 63 61 6c 63  the cost is calc
f7b0: 75 6c 61 74 65 64 20 69 6e 20 74 68 65 20 75 73  ulated in the us
f7c0: 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  ual way..**.** I
f7d0: 66 20 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20  f a NOT INDEXED 
f7e0: 63 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 6e 6f  clause (pSrc->no
f7f0: 74 49 6e 64 65 78 65 64 21 3d 30 29 20 77 61 73  tIndexed!=0) was
f800: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
f810: 20 74 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68   table .** in th
f820: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
f830: 6e 74 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65  nt, then no inde
f840: 78 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  xes are consider
f850: 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65  ed. However, the
f860: 20 0a 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c   .** selected pl
f870: 61 6e 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b  an may still tak
f880: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
f890: 68 65 20 74 61 62 6c 65 73 20 62 75 69 6c 74 2d  he tables built-
f8a0: 69 6e 20 72 6f 77 69 64 0a 2a 2a 20 69 6e 64 65  in rowid.** inde
f8b0: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
f8c0: 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50  d bestIndex(.  P
f8d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f8e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f8f0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
f900: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
f910: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
f920: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
f930: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
f940: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
f950: 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
f960: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
f970: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
f980: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
f990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
f9a0: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
f9b0: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
f9c0: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
f9d0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
f9e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
f9f0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
fa00: 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f    WhereCost *pCo
fa10: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st            /*
fa20: 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65   Lowest cost que
fa30: 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20  ry plan */.){.  
fa40: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
fa50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
fa60: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
fa70: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
fa80: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d   */.  int iCur =
fa90: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20   pSrc->iCursor; 
faa0: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
fab0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
fac0: 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20  be accessed */. 
fad0: 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
faf0: 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
fb00: 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
fb10: 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20 20  int rev;        
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
fb30: 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72  rue to scan in r
fb40: 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
fb50: 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 20 20    int wsFlags;  
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb70: 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65   Flags associate
fb80: 64 20 77 69 74 68 20 70 50 72 6f 62 65 20 2a 2f  d with pProbe */
fb90: 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20  .  int nEq;     
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fbb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
fbc0: 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
fbd0: 20 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d   */.  int eqTerm
fbe0: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
fbf0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76 61 6c    /* Mask of val
fc00: 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72  id equality oper
fc10: 61 74 6f 72 73 20 2a 2f 0a 20 20 64 6f 75 62 6c  ators */.  doubl
fc20: 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20  e cost;         
fc30: 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
fc40: 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a  f using pProbe *
fc50: 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 3b  /.  double nRow;
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d  /* Estimated num
fc80: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 72  ber of rows in r
fc90: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
fca0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
fcb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
fcc0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
fcd0: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 3b  Bitmask maskSrc;
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
fcf0: 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 70  itmask for the p
fd00: 53 72 63 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  Src table */..  
fd10: 57 48 45 52 45 54 52 41 43 45 28 28 22 62 65 73  WHERETRACE(("bes
fd20: 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73 20 6e  tIndex: tbl=%s n
fd30: 6f 74 52 65 61 64 79 3d 25 6c 6c 78 5c 6e 22 2c  otReady=%llx\n",
fd40: 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61   pSrc->pTab->zNa
fd50: 6d 65 2c 6e 6f 74 52 65 61 64 79 29 29 3b 0a 20  me,notReady));. 
fd60: 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
fd70: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
fd80: 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
fd90: 65 78 65 64 20 29 7b 0a 20 20 20 20 70 50 72 6f  exed ){.    pPro
fda0: 62 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  be = 0;.  }..  /
fdb0: 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
fdc0: 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 20 61 6e  as no indices an
fdd0: 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74  d there are no t
fde0: 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65 72  erms in the wher
fdf0: 65 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 74 68  e.  ** clause th
fe00: 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
fe10: 52 4f 57 49 44 2c 20 74 68 65 6e 20 77 65 20 77  ROWID, then we w
fe20: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 62 6c  ill never be abl
fe30: 65 20 74 6f 20 64 6f 0a 20 20 2a 2a 20 61 6e 79  e to do.  ** any
fe40: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
fe50: 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63   a full table sc
fe60: 61 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  an on this table
fe70: 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73 0a 20  .  We might as. 
fe80: 20 2a 2a 20 77 65 6c 6c 20 70 75 74 20 69 74 20   ** well put it 
fe90: 66 69 72 73 74 20 69 6e 20 74 68 65 20 6a 6f 69  first in the joi
fea0: 6e 20 6f 72 64 65 72 2e 20 20 54 68 61 74 20 77  n order.  That w
feb0: 61 79 2c 20 70 65 72 68 61 70 73 20 69 74 20 63  ay, perhaps it c
fec0: 61 6e 20 62 65 0a 20 20 2a 2a 20 72 65 66 65 72  an be.  ** refer
fed0: 65 6e 63 65 64 20 62 79 20 6f 74 68 65 72 20 74  enced by other t
fee0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
fef0: 6e 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  n..  */.  memset
ff00: 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f  (pCost, 0, sizeo
ff10: 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 69 66  f(*pCost));.  if
ff20: 28 20 70 50 72 6f 62 65 3d 3d 30 20 26 26 0a 20  ( pProbe==0 &&. 
ff30: 20 20 20 20 66 69 6e 64 54 65 72 6d 28 70 57 43      findTerm(pWC
ff40: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57  , iCur, -1, 0, W
ff50: 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c 54  O_EQ|WO_IN|WO_LT
ff60: 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
ff70: 47 45 2c 30 29 3d 3d 30 20 26 26 0a 20 20 20 20  GE,0)==0 &&.    
ff80: 20 28 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c   (pOrderBy==0 ||
ff90: 20 21 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69   !sortableByRowi
ffa0: 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79  d(iCur, pOrderBy
ffb0: 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  , pWC->pMaskSet,
ffc0: 20 26 72 65 76 29 29 20 29 7b 0a 20 20 20 20 72   &rev)) ){.    r
ffd0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 43 6f  eturn;.  }.  pCo
ffe0: 73 74 2d 3e 72 43 6f 73 74 20 3d 20 53 51 4c 49  st->rCost = SQLI
fff0: 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f  TE_BIG_DBL;..  /
10000 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 72 6f  * Check for a ro
10010 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
10020 64 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74  d IN (...) const
10030 72 61 69 6e 74 73 2e 20 49 66 20 74 68 65 72 65  raints. If there
10040 20 77 61 73 0a 20 20 2a 2a 20 61 6e 20 49 4e 44   was.  ** an IND
10050 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 61  EXED BY clause a
10060 74 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20  ttached to this 
10070 74 61 62 6c 65 2c 20 73 6b 69 70 20 74 68 69 73  table, skip this
10080 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 69 66   step..  */.  if
10090 28 20 21 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  ( !pSrc->pIndex 
100a0 29 7b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66  ){.    pTerm = f
100b0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
100c0 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
100d0 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29   WO_EQ|WO_IN, 0)
100e0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 20  ;.    if( pTerm 
100f0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
10100 45 78 70 72 3b 0a 20 20 20 20 20 20 70 43 6f 73  Expr;.      pCos
10110 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
10120 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  = WHERE_ROWID_EQ
10130 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
10140 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
10150 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20  O_EQ ){.        
10160 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20 61 6c  /* Rowid== is al
10170 77 61 79 73 20 74 68 65 20 62 65 73 74 20 70 69  ways the best pi
10180 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72  ck.  Look no fur
10190 74 68 65 72 2e 20 20 42 65 63 61 75 73 65 20 6f  ther.  Because o
101a0 6e 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  nly.        ** a
101b0 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 73 20 67   single row is g
101c0 65 6e 65 72 61 74 65 64 2c 20 6f 75 74 70 75 74  enerated, output
101d0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 73 6f   is always in so
101e0 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  rted order */.  
101f0 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
10200 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  n.wsFlags = WHER
10210 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57 48 45  E_ROWID_EQ | WHE
10220 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20  RE_UNIQUE;.     
10230 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e     pCost->plan.n
10240 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  Eq = 1;.        
10250 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
10260 20 62 65 73 74 20 69 73 20 72 6f 77 69 64 5c 6e   best is rowid\n
10270 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  "));.        pCo
10280 73 74 2d 3e 72 43 6f 73 74 20 3d 20 30 3b 0a 20  st->rCost = 0;. 
10290 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e 52         pCost->nR
102a0 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ow = 1;.        
102b0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 65  return;.      }e
102c0 6c 73 65 20 69 66 28 20 21 45 78 70 72 48 61 73  lse if( !ExprHas
102d0 50 72 6f 70 65 72 74 79 28 28 70 45 78 70 72 20  Property((pExpr 
102e0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 2c  = pTerm->pExpr),
102f0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 0a   EP_xIsSelect) .
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
10310 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 0a  pExpr->x.pList .
10320 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
10330 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28 4c 49   /* Rowid IN (LI
10340 53 54 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f  ST): cost is Nlo
10350 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  gN where N is th
10360 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 73 74  e number of list
10370 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d  .        ** elem
10380 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ents.  */.      
10390 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
103a0 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 70   pCost->nRow = p
103b0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
103c0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 43  Expr;.        pC
103d0 6f 73 74 2d 3e 72 43 6f 73 74 20 2a 3d 20 65 73  ost->rCost *= es
103e0 74 4c 6f 67 28 70 43 6f 73 74 2d 3e 72 43 6f 73  tLog(pCost->rCos
103f0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
10400 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  .        /* Rowi
10410 64 20 49 4e 20 28 53 45 4c 45 43 54 29 3a 20 63  d IN (SELECT): c
10420 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65  ost is NlogN whe
10430 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
10440 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20  er of rows.     
10450 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
10460 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ult of the inner
10470 20 73 65 6c 65 63 74 2e 20 20 57 65 20 68 61 76   select.  We hav
10480 65 20 6e 6f 20 77 61 79 20 74 6f 20 65 73 74 69  e no way to esti
10490 6d 61 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  mate.        ** 
104a0 74 68 61 74 20 76 61 6c 75 65 20 73 6f 20 6d 61  that value so ma
104b0 6b 65 20 61 20 77 69 6c 64 20 67 75 65 73 73 2e  ke a wild guess.
104c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 6f 73   */.        pCos
104d0 74 2d 3e 6e 52 6f 77 20 3d 20 31 30 30 3b 0a 20  t->nRow = 100;. 
104e0 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43         pCost->rC
104f0 6f 73 74 20 3d 20 32 30 30 3b 0a 20 20 20 20 20  ost = 200;.     
10500 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54 52   }.      WHERETR
10510 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20  ACE(("... rowid 
10520 49 4e 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22  IN cost: %.9g\n"
10530 2c 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 29 29  , pCost->rCost))
10540 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
10550 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 63  * Estimate the c
10560 6f 73 74 20 6f 66 20 61 20 74 61 62 6c 65 20 73  ost of a table s
10570 63 61 6e 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  can.  If we do n
10580 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79  ot know how many
10590 0a 20 20 20 20 2a 2a 20 65 6e 74 72 69 65 73 20  .    ** entries 
105a0 61 72 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  are in the table
105b0 2c 20 75 73 65 20 31 20 6d 69 6c 6c 69 6f 6e 20  , use 1 million 
105c0 61 73 20 61 20 67 75 65 73 73 2e 0a 20 20 20 20  as a guess..    
105d0 2a 2f 0a 20 20 20 20 63 6f 73 74 20 3d 20 70 50  */.    cost = pP
105e0 72 6f 62 65 20 3f 20 70 50 72 6f 62 65 2d 3e 61  robe ? pProbe->a
105f0 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 31 30 30  iRowEst[0] : 100
10600 30 30 30 30 3b 0a 20 20 20 20 57 48 45 52 45 54  0000;.    WHERET
10610 52 41 43 45 28 28 22 2e 2e 2e 20 74 61 62 6c 65  RACE(("... table
10620 20 73 63 61 6e 20 62 61 73 65 20 63 6f 73 74 3a   scan base cost:
10630 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
10640 3b 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20  ;.    wsFlags = 
10650 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
10660 45 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 68 65  E;.  .    /* Che
10670 63 6b 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ck for constrain
10680 74 73 20 6f 6e 20 61 20 72 61 6e 67 65 20 6f 66  ts on a range of
10690 20 72 6f 77 69 64 73 20 69 6e 20 61 20 74 61 62   rowids in a tab
106a0 6c 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a  le scan..    */.
106b0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
106c0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
106d0 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
106e0 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
106f0 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  WO_GE, 0);.    i
10700 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
10710 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
10720 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
10730 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
10740 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  _LE, 0) ){.     
10750 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
10760 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
10770 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33         cost /= 3
10780 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74  ;  /* Guess that
10790 20 72 6f 77 69 64 3c 45 58 50 52 20 65 6c 69 6d   rowid<EXPR elim
107a0 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64  inates two-third
107b0 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s of rows */.   
107c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66     }.      if( f
107d0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
107e0 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
107f0 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29   WO_GT|WO_GE, 0)
10800 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c   ){.        wsFl
10810 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d  ags |= WHERE_BTM
10820 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
10830 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47  cost /= 3;  /* G
10840 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64 3e  uess that rowid>
10850 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20  EXPR eliminates 
10860 74 77 6f 2d 74 68 69 72 64 73 20 6f 66 20 72 6f  two-thirds of ro
10870 77 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ws */.      }.  
10880 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
10890 22 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65  "... rowid range
108a0 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f   reduces cost to
108b0 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
108c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
108d0 20 20 20 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a     wsFlags = 0;.
108e0 20 20 20 20 7d 0a 20 20 20 20 6e 52 6f 77 20 3d      }.    nRow =
108f0 20 63 6f 73 74 3b 0a 20 20 0a 20 20 20 20 2f 2a   cost;.  .    /*
10900 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 73 63   If the table sc
10910 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69  an does not sati
10920 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
10930 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73   clause, increas
10940 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 73  e.    ** the cos
10950 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f  t by NlogN to co
10960 76 65 72 20 74 68 65 20 65 78 70 65 6e 73 65 20  ver the expense 
10970 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20  of sorting. */. 
10980 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
10990 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 6f 72  ){.      if( sor
109a0 74 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75  tableByRowid(iCu
109b0 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 57 43  r, pOrderBy, pWC
109c0 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 26 72 65 76  ->pMaskSet, &rev
109d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46  ) ){.        wsF
109e0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
109f0 44 45 52 42 59 7c 57 48 45 52 45 5f 52 4f 57 49  DERBY|WHERE_ROWI
10a00 44 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20  D_RANGE;.       
10a10 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20   if( rev ){.    
10a20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
10a30 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a   WHERE_REVERSE;.
10a40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10a50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
10a60 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c  ost += cost*estL
10a70 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20  og(cost);.      
10a80 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
10a90 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65  .. sorting incre
10aa0 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  ases cost to %.9
10ab0 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
10ac0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
10ad0 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
10ae0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
10af0 65 76 65 72 73 65 4f 72 64 65 72 20 29 7b 0a 20  everseOrder ){. 
10b00 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 70 70 6c       /* For appl
10b10 69 63 61 74 69 6f 6e 20 74 65 73 74 69 6e 67 2c  ication testing,
10b20 20 72 61 6e 64 6f 6d 6c 79 20 72 65 76 65 72 73   randomly revers
10b30 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64  e the output ord
10b40 65 72 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  er for.      ** 
10b50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10b60 73 20 74 68 61 74 20 6f 6d 69 74 20 74 68 65 20  s that omit the 
10b70 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
10b80 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65 6c 70    This will help
10b90 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e  .      ** to fin
10ba0 64 20 63 61 73 65 73 20 77 68 65 72 65 0a 20 20  d cases where.  
10bb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 73 46      */.      wsF
10bc0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
10bd0 56 45 52 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  VERSE;.    }..  
10be0 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68    /* Remember th
10bf0 69 73 20 63 61 73 65 20 69 66 20 69 74 20 69 73  is case if it is
10c00 20 74 68 65 20 62 65 73 74 20 73 6f 20 66 61 72   the best so far
10c10 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 73 74   */.    if( cost
10c20 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b  <pCost->rCost ){
10c30 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43  .      pCost->rC
10c40 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20  ost = cost;.    
10c50 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20    pCost->nRow = 
10c60 6e 52 6f 77 3b 0a 20 20 20 20 20 20 70 43 6f 73  nRow;.      pCos
10c70 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
10c80 3d 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 7d  = wsFlags;.    }
10c90 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
10ca0 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
10cb0 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 53  IMIZATION.  /* S
10cc0 65 61 72 63 68 20 66 6f 72 20 61 6e 20 4f 52 2d  earch for an OR-
10cd0 63 6c 61 75 73 65 20 74 68 61 74 20 63 61 6e 20  clause that can 
10ce0 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 6b 20  be used to look 
10cf0 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  up the table..  
10d00 2a 2f 0a 20 20 6d 61 73 6b 53 72 63 20 3d 20 67  */.  maskSrc = g
10d10 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73  etMask(pWC->pMas
10d20 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 66  kSet, iCur);.  f
10d30 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57  or(i=0, pTerm=pW
10d40 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
10d50 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
10d60 29 7b 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75  ){.    WhereClau
10d70 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 20 20 74  se tempWC;.    t
10d80 65 6d 70 57 43 20 3d 20 2a 70 57 43 3b 0a 20 20  empWC = *pWC;.  
10d90 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
10da0 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20  erator==WO_OR . 
10db0 20 20 20 20 20 20 20 26 26 20 28 28 70 54 65 72         && ((pTer
10dc0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 7e  m->prereqAll & ~
10dd0 6d 61 73 6b 53 72 63 29 20 26 20 6e 6f 74 52 65  maskSrc) & notRe
10de0 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ady)==0.        
10df0 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
10e00 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
10e10 26 20 6d 61 73 6b 53 72 63 29 21 3d 30 20 29 7b  & maskSrc)!=0 ){
10e20 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75  .      WhereClau
10e30 73 65 20 2a 70 4f 72 57 43 20 3d 20 26 70 54 65  se *pOrWC = &pTe
10e40 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
10e50 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  c;.      WhereTe
10e60 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20  rm *pOrTerm;.   
10e70 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
10e80 69 6e 74 20 73 6f 72 74 61 62 6c 65 20 3d 20 30  int sortable = 0
10e90 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  ;.      double r
10ea0 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  Total = 0;.     
10eb0 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20   nRow = 0;.     
10ec0 20 66 6f 72 28 6a 3d 30 2c 20 70 4f 72 54 65 72   for(j=0, pOrTer
10ed0 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 6a 3c 70 4f  m=pOrWC->a; j<pO
10ee0 72 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  rWC->nTerm; j++,
10ef0 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
10f00 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 73       WhereCost s
10f10 54 65 72 6d 43 6f 73 74 3b 0a 20 20 20 20 20 20  TermCost;.      
10f20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
10f30 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64 65 78 20 4f  .. Multi-index O
10f40 52 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74 65  R testing for te
10f50 72 6d 20 25 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c  rm %d of %d....\
10f60 6e 22 2c 20 6a 2c 69 29 29 3b 0a 20 20 20 20 20  n", j,i));.     
10f70 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
10f80 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e  eOperator==WO_AN
10f90 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57  D ){.          W
10fa0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64  hereClause *pAnd
10fb0 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75  WC = &pOrTerm->u
10fc0 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  .pAndInfo->wc;. 
10fd0 20 20 20 20 20 20 20 20 20 62 65 73 74 49 6e 64           bestInd
10fe0 65 78 28 70 50 61 72 73 65 2c 20 70 41 6e 64 57  ex(pParse, pAndW
10ff0 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
11000 79 2c 20 30 2c 20 26 73 54 65 72 6d 43 6f 73 74  y, 0, &sTermCost
11010 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
11020 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
11030 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
11040 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  {.          temp
11050 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a  WC.a = pOrTerm;.
11060 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
11070 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  .nTerm = 1;.    
11080 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28        bestIndex(
11090 70 50 61 72 73 65 2c 20 26 74 65 6d 70 57 43 2c  pParse, &tempWC,
110a0 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
110b0 20 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b   0, &sTermCost);
110c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
110d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
110e0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
110f0 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20        rTotal += 
11100 73 54 65 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b  sTermCost.rCost;
11110 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  .        nRow +=
11120 20 73 54 65 72 6d 43 6f 73 74 2e 6e 52 6f 77 3b   sTermCost.nRow;
11130 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 54 6f  .        if( rTo
11140 74 61 6c 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73  tal>=pCost->rCos
11150 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  t ) break;.     
11160 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72   }.      if( pOr
11170 64 65 72 42 79 21 3d 30 20 29 7b 0a 20 20 20 20  derBy!=0 ){.    
11180 20 20 20 20 69 66 28 20 73 6f 72 74 61 62 6c 65      if( sortable
11190 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f  ByRowid(iCur, pO
111a0 72 64 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61  rderBy, pWC->pMa
111b0 73 6b 53 65 74 2c 20 26 72 65 76 29 20 26 26 20  skSet, &rev) && 
111c0 21 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  !rev ){.        
111d0 20 20 73 6f 72 74 61 62 6c 65 20 3d 20 31 3b 0a    sortable = 1;.
111e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
111f0 20 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20           rTotal 
11200 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e  += nRow*estLog(n
11210 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Row);.          
11220 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
11230 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73   sorting increas
11240 65 73 20 4f 52 20 63 6f 73 74 20 74 6f 20 25 2e  es OR cost to %.
11250 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 29 29 3b  9g\n", rTotal));
11260 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11270 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54 52   }.      WHERETR
11280 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c 74 69 2d  ACE(("... multi-
11290 69 6e 64 65 78 20 4f 52 20 63 6f 73 74 3d 25 2e  index OR cost=%.
112a0 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e 22 2c  9g nrow=%.9g\n",
112b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
112c0 20 20 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77 29     rTotal, nRow)
112d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 54 6f  );.      if( rTo
112e0 74 61 6c 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74  tal<pCost->rCost
112f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 73   ){.        pCos
11300 74 2d 3e 72 43 6f 73 74 20 3d 20 72 54 6f 74 61  t->rCost = rTota
11310 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  l;.        pCost
11320 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20  ->nRow = nRow;. 
11330 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c         pCost->pl
11340 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  an.wsFlags = WHE
11350 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20  RE_MULTI_OR;.   
11360 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
11370 2e 75 2e 70 54 65 72 6d 20 3d 20 70 54 65 72 6d  .u.pTerm = pTerm
11380 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 6f  ;.        if( so
11390 72 74 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  rtable ){.      
113a0 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
113b0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
113c0 4f 52 44 45 52 42 59 7c 57 48 45 52 45 5f 4d 55  ORDERBY|WHERE_MU
113d0 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 20 20  LTI_OR;.        
113e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
113f0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
11400 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
11410 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20  IMIZATION */..  
11420 2f 2a 20 49 66 20 74 68 65 20 70 53 72 63 20 74  /* If the pSrc t
11430 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
11440 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
11450 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d  T JOIN then we m
11460 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20  ay not.  ** use 
11470 61 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69  an index to sati
11480 73 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73  sfy IS NULL cons
11490 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20  traints on that 
114a0 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a  table.  This is.
114b0 20 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c    ** because col
114c0 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75  umns might end u
114d0 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20  p being NULL if 
114e0 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e  the table does n
114f0 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20  ot match -.  ** 
11500 61 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77  a circumstance w
11510 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 63  hich the index c
11520 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69  annot help us di
11530 73 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20  scover.  Ticket 
11540 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66  #2177..  */.  if
11550 28 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  ( (pSrc->jointyp
11560 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
11570 29 7b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73  ){.    eqTermMas
11580 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b  k = WO_EQ|WO_IN;
11590 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 71  .  }else{.    eq
115a0 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  TermMask = WO_EQ
115b0 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_IN|WO_ISNULL
115c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ;.  }..  /* Look
115d0 20 61 74 20 65 61 63 68 20 69 6e 64 65 78 2e 0a   at each index..
115e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d    */.  if( pSrc-
115f0 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 70  >pIndex ){.    p
11600 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
11610 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ndex;.  }.  for(
11620 3b 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65  ; pProbe; pProbe
11630 3d 28 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 3f  =(pSrc->pIndex ?
11640 20 30 20 3a 20 70 50 72 6f 62 65 2d 3e 70 4e 65   0 : pProbe->pNe
11650 78 74 29 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  xt)){.    double
11660 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20   inMultiplier = 
11670 31 3b 0a 0a 20 20 20 20 57 48 45 52 45 54 52 41  1;..    WHERETRA
11680 43 45 28 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25  CE(("... index %
11690 73 3a 5c 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a  s:\n", pProbe->z
116a0 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Name));..    /* 
116b0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
116c0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
116d0 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72  he index that ar
116e0 65 20 73 61 74 69 73 66 69 65 64 0a 20 20 20 20  e satisfied.    
116f0 2a 2a 20 62 79 20 78 3d 45 58 50 52 20 63 6f 6e  ** by x=EXPR con
11700 73 74 72 61 69 6e 74 73 20 6f 72 20 78 20 49 4e  straints or x IN
11710 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e   (...) constrain
11720 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  ts..    */.    w
11730 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  sFlags = 0;.    
11740 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 6f 62  for(i=0; i<pProb
11750 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  e->nColumn; i++)
11760 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20  {.      int j = 
11770 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
11780 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  [i];.      pTerm
11790 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
117a0 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
117b0 64 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20  dy, eqTermMask, 
117c0 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69  pProbe);.      i
117d0 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
117e0 65 61 6b 3b 0a 20 20 20 20 20 20 77 73 46 6c 61  eak;.      wsFla
117f0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
11800 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28  MN_EQ;.      if(
11810 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
11820 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  r & WO_IN ){.   
11830 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
11840 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
11850 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
11860 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
11870 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _IN;.        if(
11880 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
11890 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
118a0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
118b0 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20     inMultiplier 
118c0 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 7d  *= 25;.        }
118d0 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
118e0 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  x.pList ){.     
118f0 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65       inMultiplie
11900 72 20 2a 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  r *= pExpr->x.pL
11910 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31 3b 0a  ist->nExpr + 1;.
11920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11930 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 6f 77  }.    }.    nRow
11940 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
11950 45 73 74 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74 69  Est[i] * inMulti
11960 70 6c 69 65 72 3b 0a 20 20 20 20 63 6f 73 74 20  plier;.    cost 
11970 3d 20 6e 52 6f 77 20 2a 20 65 73 74 4c 6f 67 28  = nRow * estLog(
11980 69 6e 4d 75 6c 74 69 70 6c 69 65 72 29 3b 0a 20  inMultiplier);. 
11990 20 20 20 6e 45 71 20 3d 20 69 3b 0a 20 20 20 20     nEq = i;.    
119a0 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72  if( pProbe->onEr
119b0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20  ror!=OE_None && 
119c0 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  (wsFlags & WHERE
119d0 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20  _COLUMN_IN)==0. 
119e0 20 20 20 20 20 20 20 20 26 26 20 6e 45 71 3d 3d          && nEq==
119f0 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
11a00 29 7b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73  ){.      wsFlags
11a10 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45   |= WHERE_UNIQUE
11a20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52  ;.    }.    WHER
11a30 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20  ETRACE(("...... 
11a40 6e 45 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25 2e  nEq=%d inMult=%.
11a50 39 67 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c  9g cost=%.9g\n",
11a60 6e 45 71 2c 69 6e 4d 75 6c 74 69 70 6c 69 65 72  nEq,inMultiplier
11a70 2c 63 6f 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a  ,cost));..    /*
11a80 20 4c 6f 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20   Look for range 
11a90 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20  constraints.    
11aa0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70  */.    if( nEq<p
11ab0 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Probe->nColumn )
11ac0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20  {.      int j = 
11ad0 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
11ae0 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65  [nEq];.      pTe
11af0 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
11b00 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
11b10 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
11b20 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70  E|WO_GT|WO_GE, p
11b30 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66  Probe);.      if
11b40 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  ( pTerm ){.     
11b50 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
11b60 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
11b70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69  ;.        if( fi
11b80 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
11b90 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
11ba0 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f  O_LT|WO_LE, pPro
11bb0 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  be) ){.         
11bc0 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
11bd0 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
11be0 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33         cost /= 3
11bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77  ;.          nRow
11c00 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d   /= 3;.        }
11c10 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e  .        if( fin
11c20 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
11c30 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   j, notReady, WO
11c40 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62  _GT|WO_GE, pProb
11c50 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
11c60 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
11c70 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
11c80 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b        cost /= 3;
11c90 0a 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77 20  .          nRow 
11ca0 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a  /= 3;.        }.
11cb0 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
11cc0 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67  CE(("...... rang
11cd0 65 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74  e reduces cost t
11ce0 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
11cf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11d00 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
11d10 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74   additional cost
11d20 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 66 20 74   of sorting if t
11d30 68 61 74 20 69 73 20 61 20 66 61 63 74 6f 72 2e  hat is a factor.
11d40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11d50 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
11d60 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20 26    if( (wsFlags &
11d70 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
11d80 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )==0 &&.        
11d90 20 20 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65     isSortingInde
11da0 78 28 70 50 61 72 73 65 2c 70 57 43 2d 3e 70 4d  x(pParse,pWC->pM
11db0 61 73 6b 53 65 74 2c 70 50 72 6f 62 65 2c 69 43  askSet,pProbe,iC
11dc0 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c  ur,pOrderBy,nEq,
11dd0 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20  &rev) ){.       
11de0 20 69 66 28 20 77 73 46 6c 61 67 73 3d 3d 30 20   if( wsFlags==0 
11df0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 73 46  ){.          wsF
11e00 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
11e10 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20  UMN_RANGE;.     
11e20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 73 46     }.        wsF
11e30 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
11e40 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20 69  DERBY;.        i
11e50 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20  f( rev ){.      
11e60 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
11e70 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20  HERE_REVERSE;.  
11e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
11e90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 73  lse{.        cos
11ea0 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67  t += cost*estLog
11eb0 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  (cost);.        
11ec0 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
11ed0 2e 2e 2e 20 6f 72 64 65 72 62 79 20 69 6e 63 72  ... orderby incr
11ee0 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e  eases cost to %.
11ef0 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20  9g\n", cost));. 
11f00 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
11f10 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
11f20 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
11f30 52 65 76 65 72 73 65 4f 72 64 65 72 20 29 7b 0a  ReverseOrder ){.
11f40 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 70 70        /* For app
11f50 6c 69 63 61 74 69 6f 6e 20 74 65 73 74 69 6e 67  lication testing
11f60 2c 20 72 61 6e 64 6f 6d 6c 79 20 72 65 76 65 72  , randomly rever
11f70 73 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  se the output or
11f80 64 65 72 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  der for.      **
11f90 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11fa0 74 73 20 74 68 61 74 20 6f 6d 69 74 20 74 68 65  ts that omit the
11fb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11fc0 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65 6c  .  This will hel
11fd0 70 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69  p.      ** to fi
11fe0 6e 64 20 63 61 73 65 73 20 77 68 65 72 65 0a 20  nd cases where. 
11ff0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 73       */.      ws
12000 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52  Flags |= WHERE_R
12010 45 56 45 52 53 45 3b 0a 20 20 20 20 7d 0a 0a 20  EVERSE;.    }.. 
12020 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
12030 65 65 20 69 66 20 77 65 20 63 61 6e 20 67 65 74  ee if we can get
12040 20 61 77 61 79 20 77 69 74 68 20 75 73 69 6e 67   away with using
12050 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 20   just the index 
12060 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65  without.    ** e
12070 76 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ver reading the 
12080 74 61 62 6c 65 2e 20 20 49 66 20 74 68 61 74 20  table.  If that 
12090 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
120a0 6e 20 68 61 6c 76 65 20 74 68 65 0a 20 20 20 20  n halve the.    
120b0 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68 69 73 20  ** cost of this 
120c0 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
120d0 20 20 69 66 28 20 77 73 46 6c 61 67 73 20 26 26    if( wsFlags &&
120e0 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 3c   pSrc->colUsed <
120f0 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
12100 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20  (BMS-1)) ){.    
12110 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53    Bitmask m = pS
12120 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  rc->colUsed;.   
12130 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
12140 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62  for(j=0; j<pProb
12150 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  e->nColumn; j++)
12160 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
12170 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
12180 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  mn[j];.        i
12190 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20  f( x<BMS-1 ){.  
121a0 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28          m &= ~((
121b0 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b  (Bitmask)1)<<x);
121c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
121d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d   }.      if( m==
121e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46  0 ){.        wsF
121f0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
12200 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  X_ONLY;.        
12210 63 6f 73 74 20 2f 3d 20 32 3b 0a 20 20 20 20 20  cost /= 2;.     
12220 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
12230 2e 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20  ...... idx-only 
12240 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20  reduces cost to 
12250 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
12260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
12270 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
12280 6e 64 65 78 20 68 61 73 20 61 63 68 69 65 76 65  ndex has achieve
12290 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
122a0 74 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 75  t so far, then u
122b0 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  se it..    */.  
122c0 20 20 69 66 28 20 77 73 46 6c 61 67 73 21 3d 30    if( wsFlags!=0
122d0 20 26 26 20 63 6f 73 74 20 3c 20 70 43 6f 73 74   && cost < pCost
122e0 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20  ->rCost ){.     
122f0 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20   pCost->rCost = 
12300 63 6f 73 74 3b 0a 20 20 20 20 20 20 70 43 6f 73  cost;.      pCos
12310 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a  t->nRow = nRow;.
12320 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
12330 6e 2e 77 73 46 6c 61 67 73 20 3d 20 77 73 46 6c  n.wsFlags = wsFl
12340 61 67 73 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  ags;.      pCost
12350 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 45 71  ->plan.nEq = nEq
12360 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12370 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
12380 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
12390 58 45 44 20 29 3b 0a 20 20 20 20 20 20 70 43 6f  XED );.      pCo
123a0 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20  st->plan.u.pIdx 
123b0 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 7d 0a  = pProbe;.    }.
123c0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74    }..  /* Report
123d0 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
123e0 0a 20 20 2a 2f 0a 20 20 70 43 6f 73 74 2d 3e 70  .  */.  pCost->p
123f0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 65  lan.wsFlags |= e
12400 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 57 48 45  qTermMask;.  WHE
12410 52 45 54 52 41 43 45 28 28 22 62 65 73 74 20 69  RETRACE(("best i
12420 6e 64 65 78 20 69 73 20 25 73 2c 20 63 6f 73 74  ndex is %s, cost
12430 3d 25 2e 39 67 2c 20 6e 72 6f 77 3d 25 2e 39 67  =%.9g, nrow=%.9g
12440 2c 20 77 73 46 6c 61 67 73 3d 25 78 2c 20 6e 45  , wsFlags=%x, nE
12450 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  q=%d\n",.       
12460 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73   (pCost->plan.ws
12470 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
12480 44 45 58 45 44 29 21 3d 30 20 3f 0a 20 20 20 20  DEXED)!=0 ?.    
12490 20 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e           pCost->
124a0 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61  plan.u.pIdx->zNa
124b0 6d 65 20 3a 20 22 28 6e 6f 6e 65 29 22 2c 20 70  me : "(none)", p
124c0 43 6f 73 74 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20  Cost->nRow,.    
124d0 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
124e0 2c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73  , pCost->plan.ws
124f0 46 6c 61 67 73 2c 20 70 43 6f 73 74 2d 3e 70 6c  Flags, pCost->pl
12500 61 6e 2e 6e 45 71 29 29 3b 0a 7d 0a 0a 0a 2f 2a  an.nEq));.}.../*
12510 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65  .** Disable a te
12520 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
12530 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c  clause.  Except,
12540 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20   do not disable 
12550 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69  the term.** if i
12560 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46  t controls a LEF
12570 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64  T OUTER JOIN and
12580 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67   it did not orig
12590 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a  inate in the ON.
125a0 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ** or USING clau
125b0 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e  se of that join.
125c0 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20  .**.** Consider 
125d0 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f  the term t2.z='o
125e0 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  k' in the follow
125f0 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a  ing queries:.**.
12600 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54  **   (1)  SELECT
12610 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
12620 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
12630 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d  t2.x WHERE t2.z=
12640 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53  'ok'.**   (2)  S
12650 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
12660 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
12670 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
12680 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29  .z='ok'.**   (3)
12690 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
126a0 74 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e  t1, t2 WHERE t1.
126b0 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
126c0 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  'ok'.**.** The t
126d0 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61  2.z='ok' is disa
126e0 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28  bled in the in (
126f0 32 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72  2) because it or
12700 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74  iginates.** in t
12710 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54  he ON clause.  T
12720 68 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62  he term is disab
12730 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75  led in (3) becau
12740 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72  se it is not par
12750 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f  t.** of a LEFT O
12760 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28  UTER JOIN.  In (
12770 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20  1), the term is 
12780 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a  not disabled..**
12790 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20  .** Disabling a 
127a0 74 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74  term causes that
127b0 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20   term to not be 
127c0 74 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e  tested in the in
127d0 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74  ner loop.** of t
127e0 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c  he join.  Disabl
127f0 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ing is an optimi
12800 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65  zation.  When te
12810 72 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65  rms are satisfie
12820 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c  d.** by indices,
12830 20 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d   we disable them
12840 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75   to prevent redu
12850 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74  ndant tests in t
12860 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70  he inner.** loop
12870 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20  .  We would get 
12880 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75  the correct resu
12890 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77  lts if nothing w
128a0 65 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65  ere ever disable
128b0 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20  d,.** but joins 
128c0 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74  might run a litt
128d0 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20  le slower.  The 
128e0 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61  trick is to disa
128f0 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61  ble as much.** a
12900 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74  s we can without
12910 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d   disabling too m
12920 75 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61  uch.  If we disa
12930 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27  bled in (1), we'
12940 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f  d get.** the wro
12950 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20  ng answer.  See 
12960 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a  ticket #813..*/.
12970 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61  static void disa
12980 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76  bleTerm(WhereLev
12990 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72  el *pLevel, Wher
129a0 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20  eTerm *pTerm){. 
129b0 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20   if( pTerm.     
129c0 20 26 26 20 41 4c 57 41 59 53 28 28 70 54 65 72   && ALWAYS((pTer
129d0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
129e0 4d 5f 43 4f 44 45 44 29 3d 3d 30 29 0a 20 20 20  M_CODED)==0).   
129f0 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69     && (pLevel->i
12a00 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45  LeftJoin==0 || E
12a10 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
12a20 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
12a30 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a  FromJoin)).  ){.
12a40 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
12a50 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
12a60 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
12a70 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
12a80 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
12a90 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
12aa0 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
12ab0 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
12ac0 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
12ad0 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
12ae0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
12af0 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
12b00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12b10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c   }.}../*.** Appl
12b20 79 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73  y the affinities
12b30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12b40 20 74 68 65 20 66 69 72 73 74 20 6e 20 63 6f 6c   the first n col
12b50 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 0a 2a 2a  umns of index.**
12b60 20 70 49 64 78 20 74 6f 20 74 68 65 20 76 61 6c   pIdx to the val
12b70 75 65 73 20 69 6e 20 74 68 65 20 6e 20 72 65 67  ues in the n reg
12b80 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
12b90 61 74 20 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  at base..*/.stat
12ba0 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c  ic void codeAppl
12bb0 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20  yAffinity(Parse 
12bc0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73  *pParse, int bas
12bd0 65 2c 20 69 6e 74 20 6e 2c 20 49 6e 64 65 78 20  e, int n, Index 
12be0 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20 6e 3e  *pIdx){.  if( n>
12bf0 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  0 ){.    Vdbe *v
12c00 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
12c10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21  ;.    assert( v!
12c20 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
12c30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12c40 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65  P_Affinity, base
12c50 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
12c60 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
12c70 72 28 76 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  r(v, pIdx);.    
12c80 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12c90 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
12ca0 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b  Parse, base, n);
12cb0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
12cc0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
12cd0 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
12ce0 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
12cf0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
12d00 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
12d10 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
12d20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
12d30 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
12d40 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
12d50 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
12d60 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
12d70 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
12d80 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e  raint is left in
12d90 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a   register iReg..
12da0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73  **.** For a cons
12db0 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f  traint of the fo
12dc0 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65  rm X=expr, the e
12dd0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
12de0 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a  luated and its.*
12df0 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74  * result is left
12e00 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
12e10 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  For constraints 
12e20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e  of the form X IN
12e30 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72   (...).** this r
12e40 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
12e50 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
12e60 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c  iterate over all
12e70 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f   values of X..*/
12e80 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
12e90 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20  EqualityTerm(.  
12ea0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12eb0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
12ec0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
12ed0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
12ee0 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20  ,   /* The term 
12ef0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
12f00 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20  use to be coded 
12f10 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
12f20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e  *pLevel, /* When
12f30 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52   level of the FR
12f40 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65  OM clause we are
12f50 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
12f60 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20   int iTarget    
12f70 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
12f80 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73  to leave results
12f90 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
12fa0 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  r */.){.  Expr *
12fb0 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
12fc0 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  r;.  Vdbe *v = p
12fd0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
12fe0 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20  int iReg;       
12ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13000 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
13010 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73  esults */..  ass
13020 65 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29  ert( iTarget>0 )
13030 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  ;.  if( pX->op==
13040 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65  TK_EQ ){.    iRe
13050 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
13060 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
13070 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pX->pRight, iT
13080 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20  arget);.  }else 
13090 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  if( pX->op==TK_I
130a0 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65  SNULL ){.    iRe
130b0 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20  g = iTarget;.   
130c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
130d0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
130e0 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66  , iReg);.#ifndef
130f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
13100 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20  QUERY.  }else{. 
13110 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20     int eType;.  
13120 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20    int iTab;.    
13130 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
13140 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  In;..    assert(
13150 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
13160 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  ;.    iReg = iTa
13170 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20  rget;.    eType 
13180 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  = sqlite3FindInI
13190 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c  ndex(pParse, pX,
131a0 20 30 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20   0);.    iTab = 
131b0 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
131c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
131d0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
131e0 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 56 64  iTab, 0);.    Vd
131f0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
13200 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e 2e 6e  .*s", pX->span.n
13210 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29 3b 0a  , pX->span.z));.
13220 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
13230 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
13240 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
13250 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
13260 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20  el->u.in.nIn==0 
13270 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
13280 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
13290 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
132a0 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  v);.    }.    pL
132b0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b  evel->u.in.nIn++
132c0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  ;.    pLevel->u.
132d0 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20  in.aInLoop =.   
132e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61      sqlite3DbRea
132f0 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
13300 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  e->db, pLevel->u
13310 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20  .in.aInLoop,.   
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13330 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
13340 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  f(pLevel->u.in.a
13350 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65  InLoop[0])*pLeve
13360 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20  l->u.in.nIn);.  
13370 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    pIn = pLevel->
13380 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20  u.in.aInLoop;.  
13390 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20    if( pIn ){.   
133a0 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c     pIn += pLevel
133b0 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a  ->u.in.nIn - 1;.
133c0 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
133d0 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66  = iTab;.      if
133e0 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
133f0 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
13400 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
13410 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
13420 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
13430 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a  d, iTab, iReg);.
13440 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13450 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
13460 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
13470 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
13480 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69  lumn, iTab, 0, i
13490 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
134a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
134b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
134c0 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d  ll, iReg);.    }
134d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
134e0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30  el->u.in.nIn = 0
134f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
13500 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
13510 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
13520 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
13530 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
13540 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
13550 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
13560 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
13570 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
13580 64 65 78 2e 20 20 54 68 65 20 76 61 6c 75 65 73  dex.  The values
13590 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61   for all constra
135a0 69 6e 74 73 20 61 72 65 20 6c 65 66 74 20 6f 6e  ints are left on
135b0 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
135c0 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63  * For example, c
135d0 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31  onsider table t1
135e0 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69  (a,b,c,d,e,f) wi
135f0 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c  th index i1(a,b,
13600 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  c)..** Suppose t
13610 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
13620 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41  is this:  a==5 A
13630 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20  ND b IN (1,2,3) 
13640 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30  AND c>5 AND c<10
13650 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61  .** The index ha
13660 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72  s as many as thr
13670 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ee equality cons
13680 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20  traints, but in 
13690 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c  this.** example,
136a0 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76   the third "c" v
136b0 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75  alue is an inequ
136c0 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20  ality.  So only 
136d0 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  two .** constrai
136e0 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20  nts are coded.  
136f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
13700 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  l generate code 
13710 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61  to evaluate.** a
13720 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c  ==5 and b IN (1,
13730 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65  2,3).  The curre
13740 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20  nt values for a 
13750 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74  and b will be st
13760 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65  ored.** in conse
13770 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
13780 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f   and the index o
13790 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  f the first regi
137a0 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
137b0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
137c0 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
137d0 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
137e0 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
137f0 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
13800 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
13810 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
13820 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13830 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
13840 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
13850 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
13860 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
13870 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
13880 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ell..**.** This 
13890 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61  routine always a
138a0 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73  llocates at leas
138b0 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t one memory cel
138c0 6c 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  l and returns.**
138d0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
138e0 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20  at memory cell. 
138f0 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  The code that.**
13900 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
13910 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61  ine will use tha
13920 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  t memory cell to
13930 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69   store the termi
13940 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61  nation.** key va
13950 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  lue of the loop.
13960 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    If one or more
13970 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70   IN operators ap
13980 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  pear, then.** th
13990 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
139a0 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e  ates an addition
139b0 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65  al nEq memory ce
139c0 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  lls for internal
139d0 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74  .** use..*/.stat
139e0 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71  ic int codeAllEq
139f0 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50  ualityTerms(.  P
13a00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13a10 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
13a20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
13a30 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
13a40 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74     /* Which nest
13a50 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46  ed loop of the F
13a60 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e  ROM we are codin
13a70 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  g */.  WhereClau
13a80 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
13a90 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
13aa0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
13ab0 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 57  tReady,     /* W
13ac0 68 69 63 68 20 70 61 72 74 73 20 6f 66 20 46 52  hich parts of FR
13ad0 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  OM have not yet 
13ae0 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20  been coded */.  
13af0 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 20 20  int nExtraReg   
13b00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13b10 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65  of extra registe
13b20 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
13b30 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  /.){.  int nEq =
13b40 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45   pLevel->plan.nE
13b50 71 3b 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  q;   /* The numb
13b60 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
13b70 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f  onstraints to co
13b80 64 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  de */.  Vdbe *v 
13b90 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
13ba0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20        /* The vm 
13bb0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
13bc0 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
13bd0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
13be0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
13bf0 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  ex being used fo
13c00 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  r this loop */. 
13c10 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76   int iCur = pLev
13c20 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f  el->iTabCur;   /
13c30 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20  * The cursor of 
13c40 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
13c50 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
13c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c70 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61  A single constra
13c80 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  int term */.  in
13c90 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
13cb0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
13cc0 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20   int regBase;   
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ce0 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20  * Base register 
13cf0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20  */.  int nReg;  
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13d20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
13d30 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ocate */..  /* T
13d40 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e  his module is on
13d50 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65  ly called on que
13d60 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73  ry plans that us
13d70 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  e an index. */. 
13d80 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
13d90 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
13da0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b  WHERE_INDEXED );
13db0 0a 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c  .  pIdx = pLevel
13dc0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a  ->plan.u.pIdx;..
13dd0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
13de0 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20  how many memory 
13df0 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65  cells we will ne
13e00 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  ed then allocate
13e10 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65   them..  */.  re
13e20 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  gBase = pParse->
13e30 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67  nMem + 1;.  nReg
13e40 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
13e50 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b  nEq + nExtraReg;
13e60 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
13e70 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 2f 2a 20 45  += nReg;..  /* E
13e80 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61  valuate the equa
13e90 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
13ea0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13eb0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e  pIdx->nColumn>=n
13ec0 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  Eq );.  for(j=0;
13ed0 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20   j<nEq; j++){.  
13ee0 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e    int r1;.    in
13ef0 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t k = pIdx->aiCo
13f00 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65  lumn[j];.    pTe
13f10 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
13f20 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
13f30 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c  eady, pLevel->pl
13f40 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70 49 64 78  an.wsFlags, pIdx
13f50 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
13f60 28 70 54 65 72 6d 3d 3d 30 29 20 29 20 62 72 65  (pTerm==0) ) bre
13f70 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
13f80 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
13f90 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
13fa0 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64   );.    r1 = cod
13fb0 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
13fc0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
13fd0 76 65 6c 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b  vel, regBase+j);
13fe0 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67  .    if( r1!=reg
13ff0 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20  Base+j ){.      
14000 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
14010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
14020 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
14030 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20  rse, regBase);. 
14040 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
14050 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   r1;.      }else
14060 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14070 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14080 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67  P_SCopy, r1, reg
14090 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  Base+j);.      }
140a0 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
140b0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
140c0 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
140d0 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
140e0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
140f0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
14100 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
14110 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
14120 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30  SNULL|WO_IN))==0
14130 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14140 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14150 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
14160 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e+j, pLevel->add
14170 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rBrk);.    }.  }
14180 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73  .  return regBas
14190 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
141a0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57  rn TRUE if the W
141b0 68 65 72 65 43 6c 61 75 73 65 20 70 57 43 20 63  hereClause pWC c
141c0 6f 6e 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73  ontains no terms
141d0 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 6e 6f 74   that.** are not
141e0 20 76 69 72 74 75 61 6c 20 61 6e 64 20 77 68 69   virtual and whi
141f0 63 68 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e  ch have not been
14200 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f   coded..**.** To
14210 20 70 75 74 20 69 74 20 61 6e 6f 74 68 65 72 20   put it another 
14220 77 61 79 2c 20 72 65 74 75 72 6e 20 54 52 55 45  way, return TRUE
14230 20 69 66 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61   if no additiona
14240 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 0a  l WHERE clauses.
14250 2a 2a 20 74 65 73 74 73 20 61 72 65 20 72 65 71  ** tests are req
14260 75 69 72 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uired in order t
14270 6f 20 65 73 74 61 62 6c 69 73 68 20 74 68 61 74  o establish that
14280 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
14290 0a 2a 2a 20 73 68 6f 75 6c 64 20 67 6f 20 74 6f  .** should go to
142a0 20 6f 75 74 70 75 74 20 61 6e 64 20 72 65 74 75   output and retu
142b0 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72  rn FALSE if ther
142c0 65 20 61 72 65 20 73 6f 6d 65 20 74 65 72 6d 73  e are some terms
142d0 20 6f 66 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   of.** the WHERE
142e0 20 63 6c 61 75 73 65 20 74 68 61 74 20 6e 65 65   clause that nee
142f0 64 20 74 6f 20 62 65 20 76 61 6c 69 64 61 74 65  d to be validate
14300 64 20 62 65 66 6f 72 65 20 6f 75 74 70 75 74 69  d before outputi
14310 6e 67 20 74 68 65 20 72 6f 77 2e 0a 2a 2f 0a 73  ng the row..*/.s
14320 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
14330 6f 77 52 65 61 64 79 46 6f 72 4f 75 74 70 75 74  owReadyForOutput
14340 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
14350 43 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  C){.  WhereTerm 
14360 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6a 3b  *pTerm;.  int j;
14370 0a 20 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  . .  for(pTerm=p
14380 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54  WC->a, j=pWC->nT
14390 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
143a0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
143b0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
143c0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
143d0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 29 3d 3d 30  |TERM_CODED))==0
143e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
143f0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
14400 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
14410 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61 72  ode for the star
14420 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d  t of the iLevel-
14430 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57  th loop in the W
14440 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69  HERE clause.** i
14450 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65  mplementation de
14460 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e 66  scribed by pWInf
14470 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  o..*/.static Bit
14480 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70  mask codeOneLoop
14490 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e  Start(.  WhereIn
144a0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a  fo *pWInfo,   /*
144b0 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d   Complete inform
144c0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
144d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
144e0 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
144f0 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
14500 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d  level of pWInfo-
14510 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63  >a[] should be c
14520 6f 64 65 64 20 2a 2f 0a 20 20 75 38 20 77 63 74  oded */.  u8 wct
14530 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
14540 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
14550 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
14560 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
14570 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
14580 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57  otReady     /* W
14590 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
145a0 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
145b0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
145c0 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
145d0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
145e0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
145f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14600 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
14610 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
14620 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20    int addrNxt;  
14630 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
14640 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69  to jump to conti
14650 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
14660 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69  t IN case */.  i
14670 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20  nt omitTable;   
14680 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
14690 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  e use the index 
146a0 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  only */.  int bR
146b0 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
146c0 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65  * True if we nee
146d0 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  d to scan in rev
146e0 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
146f0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
14700 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72  el;  /* The wher
14710 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f  e level to be co
14720 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ded */.  WhereCl
14730 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a  ause *pWC;    /*
14740 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f   Decomposition o
14750 66 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45  f the entire WHE
14760 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
14770 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14790 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65  * A WHERE clause
147a0 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65   term */.  Parse
147b0 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
147c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
147d0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
147e0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14800 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
14810 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f  ed stmt under co
14820 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20  nstructions */. 
14830 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
14840 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
14850 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
14860 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64  term being coded
14870 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
14880 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
14890 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
148a0 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
148b0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
148c0 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20   int addrCont;  
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
148f0 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
14900 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
14910 6e 74 20 72 65 67 52 6f 77 53 65 74 3b 20 20 20  nt regRowSet;   
14920 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 6f 77      /* Write row
14930 69 64 73 20 74 6f 20 74 68 69 73 20 52 6f 77 53  ids to this RowS
14940 65 74 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69  et if non-negati
14950 76 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 64 65  ve */.  int code
14960 52 6f 77 53 65 74 45 61 72 6c 79 3b 20 2f 2a 20  RowSetEarly; /* 
14970 54 72 75 65 20 69 66 20 69 6e 64 65 78 20 66 75  True if index fu
14980 6c 6c 79 20 63 6f 6e 73 74 72 61 69 6e 73 20 74  lly constrains t
14990 68 65 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 0a  he search */.  .
149a0 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
149b0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20  fo->pParse;.  v 
149c0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
149d0 0a 20 20 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d  .  pWC = pWInfo-
149e0 3e 70 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d  >pWC;.  pLevel =
149f0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76   &pWInfo->a[iLev
14a00 65 6c 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  el];.  pTabItem 
14a10 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  = &pWInfo->pTabL
14a20 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
14a30 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20  From];.  iCur = 
14a40 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
14a50 72 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 4c 65  r;.  bRev = (pLe
14a60 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
14a70 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53  s & WHERE_REVERS
14a80 45 29 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61 62  E)!=0;.  omitTab
14a90 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  le = (pLevel->pl
14aa0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
14ab0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 3b  RE_IDX_ONLY)!=0;
14ac0 0a 20 20 72 65 67 52 6f 77 53 65 74 20 3d 20 70  .  regRowSet = p
14ad0 57 49 6e 66 6f 2d 3e 72 65 67 52 6f 77 53 65 74  WInfo->regRowSet
14ae0 3b 0a 20 20 63 6f 64 65 52 6f 77 53 65 74 45 61  ;.  codeRowSetEa
14af0 72 6c 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  rly = 0;..  /* C
14b00 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72  reate labels for
14b10 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64   the "break" and
14b20 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74   "continue" inst
14b30 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f  ructions.  ** fo
14b40 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  r the current lo
14b50 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64  op.  Jump to add
14b60 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75  rBrk to break ou
14b70 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a  t of a loop..  *
14b80 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74  * Jump to cont t
14b90 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79  o go immediately
14ba0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
14bb0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  ration of the.  
14bc0 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20  ** loop..  **.  
14bd0 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73  ** When there is
14be0 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c   an IN operator,
14bf0 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20   we also have a 
14c00 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20  "addrNxt" label 
14c10 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20  that.  ** means 
14c20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
14c30 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c   the next IN val
14c40 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20  ue combination. 
14c50 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65   When.  ** there
14c60 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61   are no IN opera
14c70 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  tors in the cons
14c80 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64  traints, the "ad
14c90 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a  drNxt" label.  *
14ca0 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  * is the same as
14cb0 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f   "addrBrk"..  */
14cc0 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65  .  addrBrk = pLe
14cd0 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70  vel->addrBrk = p
14ce0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
14cf0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14d00 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72  Label(v);.  addr
14d10 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  Cont = pLevel->a
14d20 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65  ddrCont = sqlite
14d30 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
14d40 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
14d50 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61   is the right ta
14d60 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  ble of a LEFT OU
14d70 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61  TER JOIN, alloca
14d80 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74  te and.  ** init
14d90 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20  ialize a memory 
14da0 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64  cell that record
14db0 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  s if this table 
14dc0 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a  matches any.  **
14dd0 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74   row of the left
14de0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
14df0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
14e00 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26  Level->iFrom>0 &
14e10 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a  & (pTabItem[0].j
14e20 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
14e30 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65  T)!=0 ){.    pLe
14e40 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d  vel->iLeftJoin =
14e50 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
14e60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14e70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
14e80 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  eger, 0, pLevel-
14e90 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
14ea0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
14eb0 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e   "init LEFT JOIN
14ec0 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29   no-match flag")
14ed0 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
14ee0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
14ef0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20  UALTABLE.  if(  
14f00 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
14f10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
14f20 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
14f30 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 30 3a  {.    /* Case 0:
14f40 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61    The table is a
14f50 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20   virtual-table. 
14f60 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65 72   Use the VFilter
14f70 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a   and VNext.    *
14f80 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63  *          to ac
14f90 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20  cess the data.. 
14fa0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52     */.    int iR
14fb0 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75  eg;   /* P3 Valu
14fc0 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72  e for OP_VFilter
14fd0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
14fe0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61  index_info *pVta
14ff0 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  bIdx = pLevel->p
15000 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a  lan.u.pVtabIdx;.
15010 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
15020 69 6e 74 20 3d 20 70 56 74 61 62 49 64 78 2d 3e  int = pVtabIdx->
15030 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  nConstraint;.   
15040 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
15050 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
15060 5f 75 73 61 67 65 20 2a 61 55 73 61 67 65 20 3d  _usage *aUsage =
15070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150a0 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73   pVtabIdx->aCons
150b0 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 20  traintUsage;.   
150c0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
150d0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
150e0 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61  traint *aConstra
150f0 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  int =.          
15100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15120 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
15130 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20  aConstraint;..  
15140 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
15150 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
15160 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  rse, nConstraint
15170 2b 32 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  +2);.    pParse-
15180 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
15190 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b  ++;.    for(j=1;
151a0 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b   j<=nConstraint;
151b0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   j++){.      for
151c0 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61  (k=0; k<nConstra
151d0 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  int; k++){.     
151e0 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b 5d     if( aUsage[k]
151f0 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b  .argvIndex==j ){
15200 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
15210 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69  Term = aConstrai
15220 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[k].iTermOffse
15230 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  t;.          ass
15240 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73  ert( pParse->dis
15250 61 62 6c 65 43 6f 6c 43 61 63 68 65 20 29 3b 0a  ableColCache );.
15260 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15270 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
15280 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  , pWC->a[iTerm].
15290 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
152a0 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20 20 20 20  Reg+j+1);.      
152b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
152c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
152d0 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74     if( k==nConst
152e0 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20  raint ) break;. 
152f0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
15300 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
15310 43 6f 6c 43 61 63 68 65 20 29 3b 0a 20 20 20 20  ColCache );.    
15320 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
15330 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 73  olCache--;.    s
15340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15350 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
15360 70 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d  pVtabIdx->idxNum
15370 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c  , iReg);.    sql
15380 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15390 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d  , OP_Integer, j-
153a0 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20  1, iReg+1);.    
153b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
153c0 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c  4(v, OP_VFilter,
153d0 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20   iCur, addrBrk, 
153e0 69 52 65 67 2c 20 70 56 74 61 62 49 64 78 2d 3e  iReg, pVtabIdx->
153f0 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20  idxStr,.        
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
15410 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72  tabIdx->needToFr
15420 65 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d 50  eeIdxStr ? P4_MP
15430 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49  RINTF : P4_STATI
15440 43 29 3b 0a 20 20 20 20 70 56 74 61 62 49 64 78  C);.    pVtabIdx
15450 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
15460 74 72 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  tr = 0;.    for(
15470 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69  j=0; j<nConstrai
15480 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
15490 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d  if( aUsage[j].om
154a0 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  it ){.        in
154b0 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74  t iTerm = aConst
154c0 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66  raint[j].iTermOf
154d0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 64 69  fset;.        di
154e0 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
154f0 2c 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  , &pWC->a[iTerm]
15500 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15510 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
15520 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20  = OP_VNext;.    
15530 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
15540 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
15550 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
15560 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
15570 20 20 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72     codeRowSetEar
15580 6c 79 20 3d 20 72 65 67 52 6f 77 53 65 74 3e 3d  ly = regRowSet>=
15590 30 20 3f 20 77 68 65 72 65 52 6f 77 52 65 61 64  0 ? whereRowRead
155a0 79 46 6f 72 4f 75 74 70 75 74 28 70 57 43 29 20  yForOutput(pWC) 
155b0 3a 20 30 3b 0a 20 20 20 20 69 66 28 20 63 6f 64  : 0;.    if( cod
155c0 65 52 6f 77 53 65 74 45 61 72 6c 79 20 29 7b 0a  eRowSetEarly ){.
155d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
155e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 52  eAddOp2(v, OP_VR
155f0 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52 65 67  owid, iCur, iReg
15600 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15610 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15620 5f 52 6f 77 53 65 74 41 64 64 2c 20 72 65 67 52  _RowSetAdd, regR
15630 6f 77 53 65 74 2c 20 69 52 65 67 29 3b 0a 20 20  owSet, iReg);.  
15640 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52    }.    sqlite3R
15650 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
15660 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43  pParse, iReg, nC
15670 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
15680 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
15690 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
156a0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69  UALTABLE */..  i
156b0 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
156c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
156d0 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20  ROWID_EQ ){.    
156e0 2f 2a 20 43 61 73 65 20 31 3a 20 20 57 65 20 63  /* Case 1:  We c
156f0 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65  an directly refe
15700 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72  rence a single r
15710 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ow using an.    
15720 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61  **          equa
15730 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
15740 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49  against the ROWI
15750 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20  D field.  Or.   
15760 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65 20   **          we 
15770 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70  reference multip
15780 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20  le rows using a 
15790 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22  "rowid IN (...)"
157a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
157b0 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20   construct..    
157c0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  */.    int r1;. 
157d0 20 20 20 69 6e 74 20 72 74 6d 70 20 3d 20 73 71     int rtmp = sq
157e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
157f0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65  pParse);.    pTe
15800 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
15810 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
15820 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  Ready, WO_EQ|WO_
15830 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  IN, 0);.    asse
15840 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
15850 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
15860 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
15870 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
15880 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
15890 75 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ur );.    assert
158a0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
158b0 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45  ;.    r1 = codeE
158c0 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
158d0 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
158e0 6c 2c 20 72 74 6d 70 29 3b 0a 20 20 20 20 61 64  l, rtmp);.    ad
158f0 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
15900 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c  addrNxt;.    sql
15910 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15920 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
15930 72 31 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  r1, addrNxt);.  
15940 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15950 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
15960 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e  sts, iCur, addrN
15970 78 74 2c 20 72 31 29 3b 0a 20 20 20 20 63 6f 64  xt, r1);.    cod
15980 65 52 6f 77 53 65 74 45 61 72 6c 79 20 3d 20 28  eRowSetEarly = (
15990 70 57 43 2d 3e 6e 54 65 72 6d 3d 3d 31 20 26 26  pWC->nTerm==1 &&
159a0 20 72 65 67 52 6f 77 53 65 74 3e 3d 30 29 20 3f   regRowSet>=0) ?
159b0 31 3a 30 3b 0a 20 20 20 20 69 66 28 20 63 6f 64  1:0;.    if( cod
159c0 65 52 6f 77 53 65 74 45 61 72 6c 79 20 29 7b 0a  eRowSetEarly ){.
159d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
159e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
159f0 77 53 65 74 41 64 64 2c 20 72 65 67 52 6f 77 53  wSetAdd, regRowS
15a00 65 74 2c 20 72 31 29 3b 0a 20 20 20 20 7d 0a 20  et, r1);.    }. 
15a10 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
15a20 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15a30 20 72 74 6d 70 29 3b 0a 20 20 20 20 56 64 62 65   rtmp);.    Vdbe
15a40 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
15a50 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ));.    pLevel->
15a60 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
15a70 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
15a80 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
15a90 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
15aa0 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  GE ){.    /* Cas
15ab0 65 20 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e  e 2:  We have an
15ac0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70   inequality comp
15ad0 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
15ae0 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a  he ROWID field..
15af0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74      */.    int t
15b00 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
15b10 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a  .    int start;.
15b20 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61      int memEndVa
15b30 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65  lue = 0;.    Whe
15b40 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20  reTerm *pStart, 
15b50 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65  *pEnd;..    asse
15b60 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
15b70 20 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   );.    pStart =
15b80 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
15b90 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
15ba0 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  y, WO_GT|WO_GE, 
15bb0 30 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 66  0);.    pEnd = f
15bc0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
15bd0 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
15be0 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29   WO_LT|WO_LE, 0)
15bf0 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29  ;.    if( bRev )
15c00 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
15c10 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53  pStart;.      pS
15c20 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
15c30 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b     pEnd = pTerm;
15c40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
15c50 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
15c60 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
15c70 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
15c80 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69  ession that defi
15c90 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f  nes the start bo
15ca0 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
15cb0 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20   r1, rTemp;     
15cc0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
15cd0 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  for holding the 
15ce0 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a  start boundary *
15cf0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
15d00 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61  following consta
15d10 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f  nt maps TK_xx co
15d20 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70  des into corresp
15d30 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  onding .      **
15d40 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20   seek opcodes.  
15d50 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20  It depends on a 
15d60 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
15d70 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20  ing of TK_xx.   
15d80 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73     */.      cons
15d90 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d  t u8 aMoveOp[] =
15da0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {.           /*
15db0 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65   TK_GT */  OP_Se
15dc0 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20  ekGt,.          
15dd0 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50   /* TK_LE */  OP
15de0 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20  _SeekLe,.       
15df0 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20      /* TK_LT */ 
15e00 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20   OP_SeekLt,.    
15e10 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20         /* TK_GE 
15e20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20  */  OP_SeekGe.  
15e30 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73      };.      ass
15e40 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47  ert( TK_LE==TK_G
15e50 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d  T+1 );      /* M
15e60 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64  ake sure the ord
15e70 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20  ering.. */.     
15e80 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
15e90 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20  TK_GT+2 );      
15ea0 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54  /*  ... of the T
15eb0 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a  K_xx values... *
15ec0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
15ed0 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29  TK_GE==TK_GT+3 )
15ee0 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69  ;      /*  ... i
15ef0 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a  s correcct. */..
15f00 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72        pX = pStar
15f10 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
15f20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
15f30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15f40 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f  Start->leftCurso
15f50 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
15f60 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
15f70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
15f80 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72  , pX->pRight, &r
15f90 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
15fa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15fb0 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70  , aMoveOp[pX->op
15fc0 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61  -TK_GT], iCur, a
15fd0 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
15fe0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
15ff0 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
16000 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
16010 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
16020 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a  pParse, r1, 1);.
16030 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
16040 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
16050 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20  se, rTemp);.    
16060 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
16070 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20  evel, pStart);. 
16080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16090 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
160a0 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
160b0 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
160c0 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
160d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
160e0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
160f0 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20  r *pX;.      pX 
16100 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20  = pEnd->pExpr;. 
16110 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
16120 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
16130 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  rt( pEnd->leftCu
16140 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
16150 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20      memEndValue 
16160 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
16170 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16180 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
16190 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45  pX->pRight, memE
161a0 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  ndValue);.      
161b0 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  if( pX->op==TK_L
161c0 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  T || pX->op==TK_
161d0 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  GT ){.        te
161e0 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
161f0 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20  _Le : OP_Ge;.   
16200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16210 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
16220 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
16230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
16240 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
16250 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a  l, pEnd);.    }.
16260 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
16270 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16280 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65  dr(v);.    pLeve
16290 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
162a0 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
162b0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
162c0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
162d0 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
162e0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20  .    pLevel->p5 
162f0 3d 20 28 70 53 74 61 72 74 3d 3d 30 20 26 26 20  = (pStart==0 && 
16300 70 45 6e 64 3d 3d 30 29 20 3f 31 3a 30 3b 0a 20  pEnd==0) ?1:0;. 
16310 20 20 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72     codeRowSetEar
16320 6c 79 20 3d 20 72 65 67 52 6f 77 53 65 74 3e 3d  ly = regRowSet>=
16330 30 20 3f 20 77 68 65 72 65 52 6f 77 52 65 61 64  0 ? whereRowRead
16340 79 46 6f 72 4f 75 74 70 75 74 28 70 57 43 29 20  yForOutput(pWC) 
16350 3a 20 30 3b 0a 20 20 20 20 69 66 28 20 63 6f 64  : 0;.    if( cod
16360 65 52 6f 77 53 65 74 45 61 72 6c 79 20 7c 7c 20  eRowSetEarly || 
16370 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
16380 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20  ){.      int r1 
16390 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
163a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
163b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
163c0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
163d0 2c 20 69 43 75 72 2c 20 72 31 29 3b 0a 20 20 20  , iCur, r1);.   
163e0 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
163f0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
16400 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16410 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d  Op3(v, testOp, m
16420 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72  emEndValue, addr
16430 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
16440 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
16450 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
16460 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51  AFF_NUMERIC | SQ
16470 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
16480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16490 69 66 28 20 63 6f 64 65 52 6f 77 53 65 74 45 61  if( codeRowSetEa
164a0 72 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rly ){.        s
164b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
164c0 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 41 64 64  (v, OP_RowSetAdd
164d0 2c 20 72 65 67 52 6f 77 53 65 74 2c 20 72 31 29  , regRowSet, r1)
164e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
164f0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16500 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
16510 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
16520 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
16530 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  n.wsFlags & (WHE
16540 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
16550 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
16560 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
16570 33 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20  3: A scan using 
16580 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  an index..    **
16590 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
165a0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
165b0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72   may contain zer
165c0 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69  o or more equali
165d0 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ty .    **      
165e0 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f     terms ("==" o
165f0 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  r "IN" operators
16600 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  ) that refer to 
16610 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20  the N.    **    
16620 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63       left-most c
16630 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
16640 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f  dex. It may also
16650 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
16660 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69          inequali
16670 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  ty constraints (
16680 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20  >, <, >= or <=) 
16690 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20  on the indexed. 
166a0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
166b0 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69  lumn that immedi
166c0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
166d0 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20  e N equalities. 
166e0 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  Only .    **    
166f0 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d       the right-m
16700 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
16710 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
16720 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
16730 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
16740 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
16750 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20  "IN" operators. 
16760 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
16770 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  the .    **     
16780 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20      index is on 
16790 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68  (x,y,z), then th
167a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75  e following clau
167b0 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20  ses are all .   
167c0 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69   **         opti
167d0 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mized:.    **.  
167e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
167f0 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  x=5.    **      
16800 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
16810 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
16820 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31       x=5 AND y<1
16830 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
16840 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20      x=5 AND y>5 
16850 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
16860 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
16870 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30  ND y=5 AND z<=10
16880 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
16890 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20         The z<10 
168a0 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c  term of the foll
168b0 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20  owing cannot be 
168c0 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a  used, only.    *
168d0 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d  *         the x=
168e0 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20  5 term:.    **. 
168f0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
16900 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20   x=5 AND z<10.  
16910 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
16920 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72      N may be zer
16930 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  o if there are i
16940 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
16950 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20  aints..    **   
16960 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61        If there a
16970 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79  re no inequality
16980 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
16990 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a  en N is at.    *
169a0 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20  *         least 
169b0 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
169c0 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20  **         This 
169d0 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65  case is also use
169e0 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
169f0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
16a00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
16a10 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20  constraints but 
16a20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65  an index is sele
16a30 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20  cted anyway, in 
16a40 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20  order.    **    
16a50 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68       to force th
16a60 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74  e output order t
16a70 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20  o conform to an 
16a80 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f  ORDER BY..    */
16a90 20 20 0a 20 20 20 20 69 6e 74 20 61 53 74 61 72    .    int aStar
16aa0 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  tOp[] = {.      
16ab0 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20  0,.      0,.    
16ac0 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20    OP_Rewind,    
16ad0 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73         /* 2: (!s
16ae0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
16af0 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
16b00 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
16b10 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20  OP_Last,        
16b20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61       /* 3: (!sta
16b30 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
16b40 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20 62  & startEq &&   b
16b50 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
16b60 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20 20 20  _SeekGt,        
16b70 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f     /* 4: (start_
16b80 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
16b90 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65  !startEq && !bRe
16ba0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
16bb0 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20 20 20  eekLt,          
16bc0 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f   /* 5: (start_co
16bd0 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
16be0 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
16bf0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
16c00 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGe,           /
16c10 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 6: (start_cons
16c20 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
16c30 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
16c40 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
16c50 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
16c60 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  7: (start_constr
16c70 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
16c80 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
16c90 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 61      };.    int a
16ca0 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  EndOp[] = {.    
16cb0 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20    OP_Noop,      
16cc0 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65         /* 0: (!e
16cd0 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20  nd_constraints) 
16ce0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47  */.      OP_IdxG
16cf0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
16d00 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   1: (end_constra
16d10 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a  ints && !bRev) *
16d20 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54  /.      OP_IdxLT
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16d40 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  2: (end_constrai
16d50 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a  nts && bRev) */.
16d60 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e      };.    int n
16d70 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  Eq = pLevel->pla
16d80 6e 2e 6e 45 71 3b 0a 20 20 20 20 69 6e 74 20 69  n.nEq;.    int i
16d90 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20  sMinQuery = 0;  
16da0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
16db0 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
16dc0 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  ed SELECT min(x)
16dd0 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  .. */.    int re
16de0 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
16df0 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
16e00 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
16e10 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
16e20 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b  s */.    int r1;
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e40 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
16e50 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68  gister */.    Wh
16e60 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53  ereTerm *pRangeS
16e70 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e  tart = 0;  /* In
16e80 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
16e90 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74 61  int at range sta
16ea0 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  rt */.    WhereT
16eb0 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d  erm *pRangeEnd =
16ec0 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61   0;    /* Inequa
16ed0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
16ee0 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a  at range end */.
16ef0 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b      int startEq;
16f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f10 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
16f20 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c  e start uses ==,
16f30 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
16f40 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20   int endEq;     
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16f60 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65   True if range e
16f70 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  nd uses ==, >= o
16f80 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
16f90 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
16fa0 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  s;       /* Star
16fb0 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f  t of range is co
16fc0 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20  nstrained */.   
16fd0 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
16fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16ff0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
17000 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20  raint terms */. 
17010 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
17020 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
17030 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
17040 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
17050 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
17060 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
17070 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
17080 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45  ex */.    int nE
17090 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20 2f  xtraReg = 0;   /
170a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
170b0 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64  a registers need
170c0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  ed */.    int op
170d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
170e0 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70  * Instruction op
170f0 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 70 49 64  code */..    pId
17100 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
17110 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 69 49 64  .u.pIdx;.    iId
17120 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
17130 49 64 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20  IdxCur;.    k = 
17140 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
17150 45 71 5d 3b 20 20 20 20 20 2f 2a 20 43 6f 6c 75  Eq];     /* Colu
17160 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61 6c 69 74  mn for inequalit
17170 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  y constraints */
17180 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
17190 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20   loop satisfies 
171a0 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f  a sort order (pO
171b0 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20  rderBy) request 
171c0 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73  that .    ** was
171d0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
171e0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
171f0 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
17200 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
17210 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
17220 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
17230 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
17240 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
17250 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
17260 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
17270 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
17280 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
17290 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  .    ** should n
172a0 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
172b0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
172c0 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
172d0 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ' is.    ** the 
172e0 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20  first one after 
172f0 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
17300 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
17310 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
17320 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20  * this requires 
17330 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e  some special han
17340 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  dling..    */.  
17350 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
17360 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  s&WHERE_ORDERBY_
17370 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20  MIN)!=0.     && 
17380 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
17390 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
173a0 52 42 59 29 0a 20 20 20 20 20 26 26 20 28 70 49  RBY).     && (pI
173b0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29  dx->nColumn>nEq)
173c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
173d0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
173e0 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a  y->nExpr==1 ); *
173f0 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  /.      /* asser
17400 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30  t( pOrderBy->a[0
17410 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
17420 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
17430 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20  [nEq] ); */.    
17440 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31    isMinQuery = 1
17450 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
17460 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
17470 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e    /* Find any in
17480 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
17490 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68  int terms for th
174a0 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
174b0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72  .    ** of the r
174c0 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ange. .    */.  
174d0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
174e0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
174f0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
17500 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20        pRangeEnd 
17510 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
17520 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
17530 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  y, (WO_LT|WO_LE)
17540 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e  , pIdx);.      n
17550 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
17560 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
17570 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
17580 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
17590 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
175a0 67 65 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65  geStart = findTe
175b0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
175c0 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47   notReady, (WO_G
175d0 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b  T|WO_GE), pIdx);
175e0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
175f0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
17600 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
17610 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
17620 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
17630 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
17640 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f  N.    ** and sto
17650 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  re the values of
17660 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20   those terms in 
17670 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
17680 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
17690 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65  rting at regBase
176a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  ..    */.    reg
176b0 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71  Base = codeAllEq
176c0 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72  ualityTerms(pPar
176d0 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43 2c  se, pLevel, pWC,
176e0 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45 78 74 72   notReady, nExtr
176f0 61 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e  aReg);.    addrN
17700 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  xt = pLevel->add
17710 72 4e 78 74 3b 0a 0a 0a 20 20 20 20 2f 2a 20 49  rNxt;...    /* I
17720 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
17730 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73   reverse order s
17740 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  can on an ascend
17750 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20  ing index, or.  
17760 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f    ** a forward o
17770 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64  rder scan on a d
17780 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  escending index,
17790 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65   interchange the
177a0 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61   .    ** start a
177b0 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52  nd end terms (pR
177c0 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70 52  angeStart and pR
177d0 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f  angeEnd)..    */
177e0 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 28  .    if( bRev==(
177f0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
17800 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
17810 5f 41 53 43 29 20 29 7b 0a 20 20 20 20 20 20 53  _ASC) ){.      S
17820 57 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c  WAP(WhereTerm *,
17830 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e   pRangeEnd, pRan
17840 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a  geStart);.    }.
17850 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
17860 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 70 52  RangeStart && pR
17870 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72  angeStart->eOper
17880 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a  ator & WO_LE );.
17890 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
178a0 61 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61  angeStart && pRa
178b0 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
178c0 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  tor & WO_GE );. 
178d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
178e0 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65  ngeEnd && pRange
178f0 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
17900 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65   WO_LE );.    te
17910 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
17920 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e  d && pRangeEnd->
17930 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
17940 45 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71  E );.    startEq
17950 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20   = !pRangeStart 
17960 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  || pRangeStart->
17970 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
17980 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65  LE|WO_GE);.    e
17990 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65  ndEq =   !pRange
179a0 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64  End || pRangeEnd
179b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
179c0 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
179d0 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
179e0 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74  ts = pRangeStart
179f0 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20   || nEq>0;..    
17a00 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65  /* Seek the inde
17a10 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  x cursor to the 
17a20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e  start of the ran
17a30 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73  ge. */.    nCons
17a40 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
17a50 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
17a60 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  t ){.      int d
17a70 63 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 69 73  cc = pParse->dis
17a80 61 62 6c 65 43 6f 6c 43 61 63 68 65 3b 0a 20 20  ableColCache;.  
17a90 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e      if( pRangeEn
17aa0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  d ){.        pPa
17ab0 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
17ac0 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ache++;.      }.
17ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17ae0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
17af0 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72  angeStart->pExpr
17b00 2d 3e 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  ->pRight, regBas
17b10 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 70 50  e+nEq);.      pP
17b20 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
17b30 43 61 63 68 65 20 3d 20 64 63 63 3b 0a 20 20 20  Cache = dcc;.   
17b40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17b50 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
17b60 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  l, regBase+nEq, 
17b70 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
17b80 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
17b90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d     }else if( isM
17ba0 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20  inQuery ){.     
17bb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17bc0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
17bd0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
17be0 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
17bf0 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74  t++;.      start
17c00 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  Eq = 0;.      st
17c10 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
17c20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  = 1;.    }.    c
17c30 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
17c40 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
17c50 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 70  , nConstraint, p
17c60 49 64 78 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61  Idx);.    op = a
17c70 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63  StartOp[(start_c
17c80 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b  onstraints<<2) +
17c90 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20   (startEq<<1) + 
17ca0 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72  bRev];.    asser
17cb0 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20  t( op!=0 );.    
17cc0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
17cd0 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74  _Rewind );.    t
17ce0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
17cf0 4c 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  Last );.    test
17d00 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
17d10 6b 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  kGt );.    testc
17d20 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
17d30 47 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Ge );.    testca
17d40 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
17d50 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
17d60 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74  e( op==OP_SeekLt
17d70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
17d80 64 62 65 41 64 64 4f 70 34 28 76 2c 20 6f 70 2c  dbeAddOp4(v, op,
17d90 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
17da0 74 2c 20 72 65 67 42 61 73 65 2c 20 0a 20 20 20  t, regBase, .   
17db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17dc0 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
17dd0 5f 50 54 52 28 6e 43 6f 6e 73 74 72 61 69 6e 74  _PTR(nConstraint
17de0 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 0a 20  ), P4_INT32);.. 
17df0 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76     /* Load the v
17e00 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65  alue for the ine
17e10 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
17e20 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
17e30 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67   the.    ** rang
17e40 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  e (if any)..    
17e50 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
17e60 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
17e70 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20  ( pRangeEnd ){. 
17e80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17e90 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 61  Code(pParse, pRa
17ea0 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70  ngeEnd->pExpr->p
17eb0 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
17ec0 45 71 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Eq);.      sqlit
17ed0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17ee0 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61  OP_IsNull, regBa
17ef0 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
17f00 3b 0a 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c  ;.      codeAppl
17f10 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
17f20 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31  , regBase, nEq+1
17f30 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e  , pIdx);.      n
17f40 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
17f50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20    }..    /* Top 
17f60 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79  of the loop body
17f70 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   */.    pLevel->
17f80 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
17f90 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
17fa0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
17fb0 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
17fc0 72 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e  r is past the en
17fd0 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  d of the range. 
17fe0 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64  */.    op = aEnd
17ff0 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c  Op[(pRangeEnd ||
18000 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65   nEq) * (1 + bRe
18010 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73  v)];.    testcas
18020 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29  e( op==OP_Noop )
18030 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
18040 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a  op==OP_IdxGE );.
18050 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
18060 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20  ==OP_IdxLT );.  
18070 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f    if( op!=OP_Noo
18080 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
18090 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
180a0 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
180b0 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 0a 20  rNxt, regBase,. 
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e         SQLITE_IN
180e0 54 5f 54 4f 5f 50 54 52 28 6e 43 6f 6e 73 74 72  T_TO_PTR(nConstr
180f0 61 69 6e 74 29 2c 20 50 34 5f 49 4e 54 33 32 29  aint), P4_INT32)
18100 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18110 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65  dbeChangeP5(v, e
18120 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29  ndEq!=bRev ?1:0)
18130 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18140 49 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65  If there are ine
18150 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
18160 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20  nts, check that 
18170 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  the value.    **
18180 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
18190 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e  lumn that the in
181a0 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69  equality contrai
181b0 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a  ns is not NULL..
181c0 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c      ** If it is,
181d0 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78   jump to the nex
181e0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
181f0 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  he loop..    */.
18200 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
18210 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
18220 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  e);.    testcase
18230 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
18240 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
18250 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20  TM_LIMIT );.    
18260 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c  testcase( pLevel
18270 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
18280 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
18290 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
182a0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
182b0 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49   & (WHERE_BTM_LI
182c0 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
182d0 4d 49 54 29 20 29 7b 0a 20 20 20 20 20 20 73 71  MIT) ){.      sq
182e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
182f0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
18300 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b  dxCur, nEq, r1);
18310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18320 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
18330 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43  sNull, r1, addrC
18340 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ont);.    }..   
18350 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
18360 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
18370 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69  quired */.    di
18380 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
18390 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
183a0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
183b0 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
183c0 64 29 3b 0a 20 20 20 20 63 6f 64 65 52 6f 77 53  d);.    codeRowS
183d0 65 74 45 61 72 6c 79 20 3d 20 72 65 67 52 6f 77  etEarly = regRow
183e0 53 65 74 3e 3d 30 20 3f 20 77 68 65 72 65 52 6f  Set>=0 ? whereRo
183f0 77 52 65 61 64 79 46 6f 72 4f 75 74 70 75 74 28  wReadyForOutput(
18400 70 57 43 29 20 3a 20 30 3b 0a 20 20 20 20 69 66  pWC) : 0;.    if
18410 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 7c 7c 20  ( !omitTable || 
18420 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20  codeRowSetEarly 
18430 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18440 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18450 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43  _IdxRowid, iIdxC
18460 75 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69  ur, r1);.      i
18470 66 28 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72  f( codeRowSetEar
18480 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ly ){.        sq
18490 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
184a0 76 2c 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 2c  v, OP_RowSetAdd,
184b0 20 72 65 67 52 6f 77 53 65 74 2c 20 72 31 29 3b   regRowSet, r1);
184c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
184d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
184e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
184f0 65 6b 2c 20 69 43 75 72 2c 20 72 31 29 3b 20 20  ek, iCur, r1);  
18500 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65 65 6b  /* Deferred seek
18510 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
18520 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  }.    sqlite3Rel
18530 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18540 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a  se, r1);..    /*
18550 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74   Record the inst
18560 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  ruction used to 
18570 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
18580 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20  op. Disable .   
18590 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   ** WHERE clause
185a0 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75   terms made redu
185b0 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64  ndant by the ind
185c0 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20  ex range scan.. 
185d0 20 20 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c     */.    pLevel
185e0 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
185f0 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
18600 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
18610 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 7d 65 6c  = iIdxCur;.  }el
18620 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
18630 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
18640 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c  IZATION.  if( pL
18650 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
18660 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
18670 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _OR ){.    /* Ca
18680 73 65 20 34 3a 20 20 54 77 6f 20 6f 72 20 6d 6f  se 4:  Two or mo
18690 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e  re separately in
186a0 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
186b0 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20  ected by OR.    
186c0 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
186d0 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
186e0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
186f0 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20  t1(a,b,c,d);.   
18700 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
18710 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
18720 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
18730 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62  INDEX i2 ON t1(b
18740 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
18750 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74  TE INDEX i3 ON t
18760 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  1(c);.    **.   
18770 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
18780 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
18790 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31   OR b=7 OR (c=11
187a0 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a   AND d=13).    *
187b0 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20  *.    ** In the 
187c0 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61  example, there a
187d0 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64  re three indexed
187e0 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
187f0 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54   by OR..    ** T
18800 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
18810 6f 70 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65  op is constructe
18820 64 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20  d by creating a 
18830 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 0a 20 20  RowSet object.  
18840 20 20 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74    ** and populat
18850 69 6e 67 20 69 74 2e 20 20 54 68 65 6e 20 6c 6f  ing it.  Then lo
18860 6f 70 69 6e 67 20 6f 76 65 72 20 65 6c 65 6d 65  oping over eleme
18870 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 77 73 65  nts of the rowse
18880 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
18890 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 31 0a 20          Null 1. 
188a0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 23 20 66     **        # f
188b0 69 6c 6c 20 52 6f 77 53 65 74 20 31 20 77 69 74  ill RowSet 1 wit
188c0 68 20 65 6e 74 72 69 65 73 20 77 68 65 72 65 20  h entries where 
188d0 61 3d 35 20 75 73 69 6e 67 20 69 31 0a 20 20 20  a=5 using i1.   
188e0 20 2a 2a 20 20 20 20 20 20 20 20 23 20 66 69 6c   **        # fil
188f0 6c 20 52 6f 77 73 65 74 20 31 20 77 69 74 68 20  l Rowset 1 with 
18900 65 6e 74 72 69 65 73 20 77 68 65 72 65 20 62 3d  entries where b=
18910 37 20 75 73 69 6e 67 20 69 32 0a 20 20 20 20 2a  7 using i2.    *
18920 2a 20 20 20 20 20 20 20 20 23 20 66 69 6c 6c 20  *        # fill 
18930 52 6f 77 73 65 74 20 31 20 77 69 74 68 20 65 6e  Rowset 1 with en
18940 74 72 69 65 73 20 77 68 65 72 65 20 63 3d 31 31  tries where c=11
18950 20 61 6e 64 20 64 3d 31 33 20 69 33 20 61 6e 64   and d=13 i3 and
18960 20 74 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 41   t1.    **     A
18970 3a 20 52 6f 77 53 65 74 52 65 61 64 20 31 2c 20  : RowSetRead 1, 
18980 42 2c 20 32 0a 20 20 20 20 2a 2a 20 20 20 20 20  B, 2.    **     
18990 20 20 20 53 65 65 6b 20 20 20 20 20 20 20 69 2c     Seek       i,
189a0 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   2.    **.    **
189b0 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
189c0 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69  he loop looks li
189d0 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a  ke this:.    **.
189e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 47 6f      **        Go
189f0 74 6f 20 20 20 20 20 20 20 30 2c 20 41 0a 20 20  to       0, A.  
18a00 20 20 2a 2a 20 20 20 20 20 42 3a 0a 20 20 20 20    **     B:.    
18a10 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4f 72  */.    int regOr
18a20 52 6f 77 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  Rowset;       /*
18a30 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
18a40 67 20 74 68 65 20 52 6f 77 53 65 74 20 6f 62 6a  g the RowSet obj
18a50 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ect */.    int r
18a60 65 67 4e 65 78 74 52 6f 77 69 64 3b 20 20 20 20  egNextRowid;    
18a70 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
18a80 6c 64 69 6e 67 20 6e 65 78 74 20 72 6f 77 69 64  lding next rowid
18a90 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61   */.    WhereCla
18aa0 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f  use *pOrWc;    /
18ab0 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20  * The OR-clause 
18ac0 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20  broken out into 
18ad0 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  subterms */.    
18ae0 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
18af0 72 6d 3b 20 20 20 20 2f 2a 20 41 20 73 69 6e 67  rm;    /* A sing
18b00 6c 65 20 73 75 62 74 65 72 6d 20 77 69 74 68 69  le subterm withi
18b10 6e 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 20  n the OR-clause 
18b20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 6f  */.    SrcList o
18b30 6e 65 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a  neTab;        /*
18b40 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65   Shortened table
18b50 20 6c 69 73 74 20 2a 2f 0a 20 20 20 0a 20 20 20   list */.   .   
18b60 20 70 54 65 72 6d 20 3d 20 70 4c 65 76 65 6c 2d   pTerm = pLevel-
18b70 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a 20  >plan.u.pTerm;. 
18b80 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
18b90 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
18ba0 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
18bb0 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20 20  tor==WO_OR );.  
18bc0 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
18bd0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
18be0 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20  _ORINFO)!=0 );. 
18bf0 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72     pOrWc = &pTer
18c00 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
18c10 3b 0a 20 20 20 20 63 6f 64 65 52 6f 77 53 65 74  ;.    codeRowSet
18c20 45 61 72 6c 79 20 3d 20 28 72 65 67 52 6f 77 53  Early = (regRowS
18c30 65 74 3e 3d 30 20 26 26 20 70 57 43 2d 3e 6e 54  et>=0 && pWC->nT
18c40 65 72 6d 3d 3d 31 29 20 3f 31 3a 30 3b 0a 0a 20  erm==1) ?1:0;.. 
18c50 20 20 20 69 66 28 20 63 6f 64 65 52 6f 77 53 65     if( codeRowSe
18c60 74 45 61 72 6c 79 20 29 7b 0a 20 20 20 20 20 20  tEarly ){.      
18c70 72 65 67 4f 72 52 6f 77 73 65 74 20 3d 20 72 65  regOrRowset = re
18c80 67 52 6f 77 53 65 74 3b 0a 20 20 20 20 7d 65 6c  gRowSet;.    }el
18c90 73 65 7b 0a 20 20 20 20 20 20 72 65 67 4f 72 52  se{.      regOrR
18ca0 6f 77 73 65 74 20 3d 20 73 71 6c 69 74 65 33 47  owset = sqlite3G
18cb0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
18cc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18cd0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18ce0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 4f 72 52  _Null, 0, regOrR
18cf0 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20  owset);.    }.  
18d00 20 20 6f 6e 65 54 61 62 2e 6e 53 72 63 20 3d 20    oneTab.nSrc = 
18d10 31 3b 0a 20 20 20 20 6f 6e 65 54 61 62 2e 6e 41  1;.    oneTab.nA
18d20 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20 6f 6e  lloc = 1;.    on
18d30 65 54 61 62 2e 61 5b 30 5d 20 3d 20 2a 70 54 61  eTab.a[0] = *pTa
18d40 62 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 6a  bItem;.    for(j
18d50 3d 30 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  =0, pOrTerm=pOrW
18d60 63 2d 3e 61 3b 20 6a 3c 70 4f 72 57 63 2d 3e 6e  c->a; j<pOrWc->n
18d70 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 4f 72 54 65  Term; j++, pOrTe
18d80 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65  rm++){.      Whe
18d90 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66  reInfo *pSubWInf
18da0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  o;.      if( pOr
18db0 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
18dc0 21 3d 69 43 75 72 20 26 26 20 70 4f 72 54 65 72  !=iCur && pOrTer
18dd0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f  m->eOperator!=WO
18de0 5f 41 4e 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b  _AND ) continue;
18df0 0a 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f  .      pSubWInfo
18e00 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
18e10 65 67 69 6e 28 70 50 61 72 73 65 2c 20 26 6f 6e  egin(pParse, &on
18e20 65 54 61 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  eTab, pOrTerm->p
18e30 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  Expr, 0,.       
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e50 20 57 48 45 52 45 5f 46 49 4c 4c 5f 52 4f 57 53   WHERE_FILL_ROWS
18e60 45 54 20 7c 20 57 48 45 52 45 5f 4f 4d 49 54 5f  ET | WHERE_OMIT_
18e70 4f 50 45 4e 20 7c 20 57 48 45 52 45 5f 4f 4d 49  OPEN | WHERE_OMI
18e80 54 5f 43 4c 4f 53 45 2c 0a 20 20 20 20 20 20 20  T_CLOSE,.       
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ea0 20 72 65 67 4f 72 52 6f 77 73 65 74 29 3b 0a 20   regOrRowset);. 
18eb0 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
18ec0 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  fo ){.        sq
18ed0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53  lite3WhereEnd(pS
18ee0 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  ubWInfo);.      
18ef0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
18f00 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18f10 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29  bel(v, addrCont)
18f20 3b 0a 20 20 20 20 69 66 28 20 21 63 6f 64 65 52  ;.    if( !codeR
18f30 6f 77 53 65 74 45 61 72 6c 79 20 29 7b 0a 20 20  owSetEarly ){.  
18f40 20 20 20 20 72 65 67 4e 65 78 74 52 6f 77 69 64      regNextRowid
18f50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
18f60 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
18f70 20 20 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 0a      addrCont = .
18f80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18f90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18fa0 5f 52 6f 77 53 65 74 52 65 61 64 2c 20 72 65 67  _RowSetRead, reg
18fb0 4f 72 52 6f 77 73 65 74 2c 61 64 64 72 42 72 6b  OrRowset,addrBrk
18fc0 2c 72 65 67 4e 65 78 74 52 6f 77 69 64 29 3b 0a  ,regNextRowid);.
18fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18fe0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
18ff0 65 6b 2c 20 69 43 75 72 2c 20 72 65 67 4e 65 78  ek, iCur, regNex
19000 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  tRowid);.      s
19010 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
19020 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
19030 4e 65 78 74 52 6f 77 69 64 29 3b 0a 20 20 20 20  NextRowid);.    
19040 20 20 2f 2a 20 73 71 6c 69 74 65 33 52 65 6c 65    /* sqlite3Rele
19050 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
19060 65 2c 20 72 65 67 4f 72 52 6f 77 73 65 74 29 3b  e, regOrRowset);
19070 20 2f 2f 20 50 72 65 73 65 72 76 65 20 74 68 65   // Preserve the
19080 20 52 6f 77 53 65 74 20 2a 2f 0a 20 20 20 20 20   RowSet */.     
19090 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
190a0 5f 47 6f 74 6f 3b 0a 20 20 20 20 20 20 70 4c 65  _Goto;.      pLe
190b0 76 65 6c 2d 3e 70 32 20 3d 20 61 64 64 72 43 6f  vel->p2 = addrCo
190c0 6e 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  nt;.    }else{. 
190d0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
190e0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d  = OP_Noop;.    }
190f0 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d  .    disableTerm
19100 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
19110 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
19120 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
19130 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
19140 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61  /..  {.    /* Ca
19150 73 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20  se 5:  There is 
19160 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
19170 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
19180 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20  omplete.    **  
19190 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
191a0 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
191b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
191c0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
191d0 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74  ep[] = { OP_Next
191e0 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20  , OP_Prev };.   
191f0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
19200 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50   aStart[] = { OP
19210 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74  _Rewind, OP_Last
19220 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
19230 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d  bRev==0 || bRev=
19240 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
19250 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
19260 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
19270 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
19280 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
19290 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
192a0 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
192b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
192c0 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69   aStart[bRev], i
192d0 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  Cur, addrBrk);. 
192e0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
192f0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
19300 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
19310 0a 20 20 20 20 63 6f 64 65 52 6f 77 53 65 74 45  .    codeRowSetE
19320 61 72 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  arly = 0;.  }.  
19330 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
19340 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53  Mask(pWC->pMaskS
19350 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a  et, iCur);..  /*
19360 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
19370 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78  test every subex
19380 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61  pression that ca
19390 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  n be completely.
193a0 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73    ** computed us
193b0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
193c0 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20  set of tables.. 
193d0 20 2a 2f 0a 20 20 6b 20 3d 20 30 3b 0a 20 20 66   */.  k = 0;.  f
193e0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
193f0 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j=pWC->nTerm; j
19400 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; j--, pTerm++
19410 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b  ){.    Expr *pE;
19420 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
19430 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
19440 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
19450 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
19460 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
19470 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
19480 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
19490 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
194a0 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
194b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
194c0 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
194d0 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79  eqAll & notReady
194e0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
194f0 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d  .    pE = pTerm-
19500 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >pExpr;.    asse
19510 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20  rt( pE!=0 );.   
19520 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
19530 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48  ftJoin && !ExprH
19540 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
19550 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
19560 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
19570 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
19580 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
19590 20 2b 3d 20 6b 3b 0a 20 20 20 20 73 71 6c 69 74   += k;.    sqlit
195a0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
195b0 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f  arse, pE, addrCo
195c0 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
195d0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 50 61 72  FNULL);.    pPar
195e0 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
195f0 63 68 65 20 2d 3d 20 6b 3b 0a 20 20 20 20 6b 20  che -= k;.    k 
19600 3d 20 31 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  = 1;.    pTerm->
19610 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
19620 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  CODED;.  }..  /*
19630 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45   For a LEFT OUTE
19640 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65  R JOIN, generate
19650 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
19660 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
19670 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61  that.  ** at lea
19680 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  st one row of th
19690 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61  e right table ha
196a0 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65  s matched the le
196b0 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f  ft table.  .  */
196c0 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69  .  if( pLevel->i
196d0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
196e0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
196f0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
19700 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
19710 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19720 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
19730 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69  er, 1, pLevel->i
19740 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56  LeftJoin);.    V
19750 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
19760 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e  record LEFT JOIN
19770 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c   hit"));.    sql
19780 69 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c  ite3ExprClearCol
19790 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
197a0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
197b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
197c0 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63  prClearColumnCac
197d0 68 65 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65  he(pParse, pLeve
197e0 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
197f0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
19800 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e  a, j=0; j<pWC->n
19810 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d  Term; j++, pTerm
19820 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ++){.      testc
19830 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
19840 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
19850 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  AL );.      test
19860 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
19870 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
19880 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  D );.      if( p
19890 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
198a0 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
198b0 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
198c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
198d0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
198e0 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  l & notReady)!=0
198f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
19900 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
19910 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
19920 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
19930 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  lse(pParse, pTer
19940 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f  m->pExpr, addrCo
19950 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
19960 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54  FNULL);.      pT
19970 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
19980 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
19990 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
199a0 20 49 66 20 69 74 20 77 61 73 20 72 65 71 75 65   If it was reque
199b0 73 74 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  sted to store th
199c0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 72  e results in a r
199d0 6f 77 73 65 74 20 61 6e 64 20 74 68 61 74 20 68  owset and that h
199e0 61 73 0a 20 20 2a 2a 20 6e 6f 74 20 61 6c 72 65  as.  ** not alre
199f0 61 64 79 20 62 65 65 6e 20 64 6f 2c 20 74 68 65  ady been do, the
19a00 6e 20 64 6f 20 73 6f 20 6e 6f 77 2e 0a 20 20 2a  n do so now..  *
19a10 2f 0a 20 20 69 66 28 20 72 65 67 52 6f 77 53 65  /.  if( regRowSe
19a20 74 3e 3d 30 20 26 26 20 21 63 6f 64 65 52 6f 77  t>=0 && !codeRow
19a30 53 65 74 45 61 72 6c 79 20 29 7b 0a 20 20 20 20  SetEarly ){.    
19a40 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
19a50 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19a60 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
19a70 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
19a80 41 42 4c 45 0a 20 20 20 20 69 66 28 20 20 28 70  ABLE.    if(  (p
19a90 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
19aa0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
19ab0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
19ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19ad0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 52  eAddOp2(v, OP_VR
19ae0 6f 77 69 64 2c 20 69 43 75 72 2c 20 72 31 29 3b  owid, iCur, r1);
19af0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
19b00 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71  f.    {.      sq
19b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19b20 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
19b30 72 2c 20 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20  r, r1);.    }.  
19b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19b50 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Op2(v, OP_RowSet
19b60 41 64 64 2c 20 72 65 67 52 6f 77 53 65 74 2c 20  Add, regRowSet, 
19b70 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
19b80 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
19b90 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 7d 0a  Parse, r1);.  }.
19ba0 0a 20 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61  .  return notRea
19bb0 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  dy;.}..#if defin
19bc0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
19bd0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
19be0 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c  ing variable hol
19bf0 64 73 20 61 20 74 65 78 74 20 64 65 73 63 72 69  ds a text descri
19c00 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70  ption of query p
19c10 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  lan generated.**
19c20 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
19c30 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
19c40 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
19c50 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57    Each call to W
19c60 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65  hereBegin.** ove
19c70 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65 76  rwrites the prev
19c80 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f  ious.  This info
19c90 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
19ca0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a  for testing and.
19cb0 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  ** analysis only
19cc0 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
19cd0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53  3_query_plan[BMS
19ce0 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74  *2*40];  /* Text
19cf0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
19d00 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61  static int nQPla
19d10 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
19d20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65      /* Next free
19d30 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f   slow in _query_
19d40 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69  plan[] */..#endi
19d50 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
19d60 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   */.../*.** Free
19d70 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72   a WhereInfo str
19d80 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63  ucture.*/.static
19d90 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46   void whereInfoF
19da0 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ree(sqlite3 *db,
19db0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
19dc0 66 6f 29 7b 0a 20 20 69 66 28 20 70 57 49 6e 66  fo){.  if( pWInf
19dd0 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  o ){.    int i;.
19de0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
19df0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
19e00 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
19e10 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
19e20 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  Info = pWInfo->a
19e30 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20  [i].pIdxInfo;.  
19e40 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b      if( pInfo ){
19e50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
19e60 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72   pInfo->needToFr
19e70 65 65 49 64 78 53 74 72 3d 3d 30 20 7c 7c 20 64  eeIdxStr==0 || d
19e80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19e90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
19ea0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
19eb0 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20  IdxStr ){.      
19ec0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
19ed0 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  (pInfo->idxStr);
19ee0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19ef0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
19f00 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20  (db, pInfo);.   
19f10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77     }.    }.    w
19f20 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
19f30 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20  pWInfo->pWC);.  
19f40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19f50 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
19f60 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
19f70 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
19f80 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
19f90 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
19fa0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
19fb0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
19fc0 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
19fd0 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
19fe0 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
19ff0 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
1a000 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
1a010 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
1a020 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
1a030 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
1a040 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
1a050 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1a060 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
1a070 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
1a080 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
1a090 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
1a0a0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1a0b0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
1a0c0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1a0d0 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
1a0e0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
1a0f0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
1a100 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
1a110 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
1a120 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
1a130 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
1a140 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1a150 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
1a160 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
1a170 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
1a180 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
1a190 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
1a1a0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
1a1b0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1a1c0 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
1a1d0 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
1a1e0 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
1a1f0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
1a200 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
1a210 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
1a220 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
1a230 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
1a240 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
1a250 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
1a260 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
1a270 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
1a280 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
1a290 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
1a2a0 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
1a2b0 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
1a2c0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
1a2d0 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
1a2e0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
1a2f0 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
1a300 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
1a310 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a330 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
1a340 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
1a350 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
1a360 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
1a370 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
1a380 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3a0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
1a3b0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
1a3c0 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
1a3d0 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
1a3e0 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
1a3f0 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
1a400 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1a410 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
1a420 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
1a430 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
1a440 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
1a450 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
1a460 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
1a470 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
1a480 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
1a490 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
1a4a0 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
1a4b0 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
1a4c0 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
1a4d0 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
1a4e0 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
1a4f0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
1a500 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
1a510 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
1a520 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1a530 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
1a540 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
1a550 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
1a560 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
1a570 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
1a580 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
1a590 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
1a5a0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
1a5b0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
1a5c0 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
1a5d0 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
1a5e0 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
1a5f0 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
1a600 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
1a610 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
1a620 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
1a630 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
1a640 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
1a650 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
1a660 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
1a670 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
1a680 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
1a690 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
1a6a0 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
1a6b0 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
1a6c0 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
1a6d0 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
1a6e0 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
1a6f0 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
1a700 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
1a710 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
1a720 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
1a730 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
1a740 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
1a750 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
1a760 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
1a770 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
1a780 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
1a790 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
1a7a0 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
1a7b0 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
1a7c0 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
1a7d0 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
1a7e0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
1a7f0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
1a800 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
1a810 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
1a820 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
1a830 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
1a840 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
1a850 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
1a860 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
1a870 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
1a880 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
1a890 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
1a8a0 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
1a8b0 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
1a8c0 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
1a8d0 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
1a8e0 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
1a8f0 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
1a900 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
1a910 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
1a920 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
1a930 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
1a940 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
1a950 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
1a960 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
1a970 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
1a980 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
1a990 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
1a9a0 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
1a9b0 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
1a9c0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
1a9d0 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
1a9e0 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
1a9f0 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
1aa00 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
1aa10 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
1aa20 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
1aa30 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
1aa40 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
1aa50 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
1aa60 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
1aa70 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
1aa80 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
1aa90 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
1aaa0 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
1aab0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
1aac0 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
1aad0 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
1aae0 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
1aaf0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
1ab00 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
1ab10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
1ab20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
1ab30 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
1ab40 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
1ab50 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
1ab60 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
1ab70 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
1ab80 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
1ab90 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
1aba0 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
1abb0 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
1abc0 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
1abd0 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72  G.**.** *ppOrder
1abe0 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
1abf0 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
1ac00 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
1ac10 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  CT statement,.**
1ac20 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1ac30 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
1ac40 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
1ac50 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
1ac60 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
1ac70 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
1ac80 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
1ac90 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64  ment, then ppOrd
1aca0 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
1acb0 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20  .** If an index 
1acc0 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74  can be used so t
1acd0 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20  hat the natural 
1ace0 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20  output order of 
1acf0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61  the table.** sca
1ad00 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72  n is correct for
1ad10 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1ad20 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20  ause, then that 
1ad30 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e  index is used an
1ad40 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20  d.** *ppOrderBy 
1ad50 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
1ad60 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
1ad70 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72  mization that pr
1ad80 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e  events an.** unn
1ad90 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66  ecessary sort of
1ada0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
1adb0 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72  if an index appr
1adc0 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a  opriate for the.
1add0 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
1ade0 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  se already exist
1adf0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
1ae00 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f  where clause loo
1ae10 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72  ps cannot be arr
1ae20 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65  anged to provide
1ae30 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
1ae40 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68  output order, th
1ae50 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42  en the *ppOrderB
1ae60 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  y is unchanged..
1ae70 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
1ae80 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1ae90 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1aea0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
1aeb0 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
1aec0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
1aed0 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c  bList,    /* A l
1aee0 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
1aef0 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
1af00 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
1af10 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
1af20 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1af30 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
1af40 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e 20  pOrderBy, /* An 
1af50 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
1af60 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 38   or NULL */.  u8
1af70 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
1af80 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
1af90 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
1afa0 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
1afb0 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20  eInt.h */.  int 
1afc0 72 65 67 52 6f 77 53 65 74 20 20 20 20 20 20 20  regRowSet       
1afd0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
1afe0 6c 64 20 52 6f 77 53 65 74 20 69 66 20 57 48 45  ld RowSet if WHE
1aff0 52 45 5f 46 49 4c 4c 5f 52 4f 57 53 45 54 20 69  RE_FILL_ROWSET i
1b000 73 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  s set */.){.  in
1b010 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1b020 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1b030 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
1b040 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20  t nByteWInfo;   
1b050 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e           /* Num.
1b060 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
1b070 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73   for WhereInfo s
1b080 74 72 75 63 74 20 2a 2f 0a 20 20 57 68 65 72 65  truct */.  Where
1b090 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
1b0a0 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
1b0b0 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
1b0c0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
1b0d0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
1b0e0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1b0f0 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
1b100 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
1b110 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61  ngine */.  Bitma
1b120 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
1b130 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
1b140 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
1b150 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
1b160 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
1b170 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20  pMaskSet;    /* 
1b180 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  The expression m
1b190 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65  ask set */.  Whe
1b1a0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b1c0 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66  Decomposition of
1b1d0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1b1e0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
1b1f0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
1b200 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67  Item;  /* A sing
1b210 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54  le entry from pT
1b220 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
1b230 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
1b240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1b250 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e   single level in
1b260 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74   the pWInfo list
1b270 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b   */.  int iFrom;
1b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b290 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
1b2a0 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73  nused FROM claus
1b2b0 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  e element */.  i
1b2c0 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20  nt andFlags;    
1b2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44            /* AND
1b2e0 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
1b2f0 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e  of all pWC->a[].
1b300 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  wtFlags */.  sql
1b310 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
1b320 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1b330 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1b340 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
1b350 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f  rderBy = 0;..  /
1b360 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
1b370 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
1b380 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
1b390 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
1b3a0 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
1b3b0 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
1b3c0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
1b3d0 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20  t->nSrc>BMS ){. 
1b3e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1b3f0 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d  sg(pParse, "at m
1b400 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e  ost %d tables in
1b410 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a   a join", BMS);.
1b420 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1b430 7d 0a 0a 20 20 69 66 28 20 70 70 4f 72 64 65 72  }..  if( ppOrder
1b440 42 79 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  By ){.    pOrder
1b450 42 79 20 3d 20 2a 70 70 4f 72 64 65 72 42 79 3b  By = *ppOrderBy;
1b460 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
1b470 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
1b480 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
1b490 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1b4a0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
1b4b0 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
1b4c0 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  e. A single allo
1b4d0 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  cation is used t
1b4e0 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72  o store the Wher
1b4f0 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63  eInfo.  ** struc
1b500 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
1b510 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d  of WhereInfo.a[]
1b520 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  , the WhereClaus
1b530 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
1b540 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61   and the WhereMa
1b550 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e  skSet structure.
1b560 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75   Since WhereClau
1b570 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38  se contains an 8
1b580 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64  -byte.  ** field
1b590 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20   (type Bitmask) 
1b5a0 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e  it must be align
1b5b0 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20  ed on an 8-byte 
1b5c0 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a  boundary on.  **
1b5d0 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75   some architectu
1b5e0 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52  res. Hence the R
1b5f0 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20  OUND8() below.. 
1b600 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
1b610 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57 49  e->db;.  nByteWI
1b620 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
1b630 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
1b640 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  pTabList->nSrc-1
1b650 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65  )*sizeof(WhereLe
1b660 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20  vel));.  pWInfo 
1b670 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1b680 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20  cZero(db, .     
1b690 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20   nByteWInfo + . 
1b6a0 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72       sizeof(Wher
1b6b0 65 43 6c 61 75 73 65 29 20 2b 0a 20 20 20 20 20  eClause) +.     
1b6c0 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4d 61 73   sizeof(WhereMas
1b6d0 6b 53 65 74 29 0a 20 20 29 3b 0a 20 20 69 66 28  kSet).  );.  if(
1b6e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1b6f0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  d ){.    goto wh
1b700 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
1b710 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   }.  pWInfo->nLe
1b720 76 65 6c 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  vel = pTabList->
1b730 6e 53 72 63 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  nSrc;.  pWInfo->
1b740 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
1b750 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  .  pWInfo->pTabL
1b760 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
1b770 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b    pWInfo->iBreak
1b780 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1b790 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57  keLabel(v);.  pW
1b7a0 49 6e 66 6f 2d 3e 72 65 67 52 6f 77 53 65 74 20  Info->regRowSet 
1b7b0 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
1b7c0 57 48 45 52 45 5f 46 49 4c 4c 5f 52 4f 57 53 45  WHERE_FILL_ROWSE
1b7d0 54 29 20 3f 20 72 65 67 52 6f 77 53 65 74 20 3a  T) ? regRowSet :
1b7e0 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70   -1;.  pWInfo->p
1b7f0 57 43 20 3d 20 70 57 43 20 3d 20 28 57 68 65 72  WC = pWC = (Wher
1b800 65 43 6c 61 75 73 65 20 2a 29 26 28 28 75 38 20  eClause *)&((u8 
1b810 2a 29 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57  *)pWInfo)[nByteW
1b820 49 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d  Info];.  pWInfo-
1b830 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63  >wctrlFlags = wc
1b840 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 4d 61 73  trlFlags;.  pMas
1b850 6b 53 65 74 20 3d 20 28 57 68 65 72 65 4d 61 73  kSet = (WhereMas
1b860 6b 53 65 74 2a 29 26 70 57 43 5b 31 5d 3b 0a 0a  kSet*)&pWC[1];..
1b870 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
1b880 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
1b890 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
1b8a0 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
1b8b0 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
1b8c0 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
1b8d0 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
1b8e0 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
1b8f0 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
1b900 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61  Set);.  whereCla
1b910 75 73 65 49 6e 69 74 28 70 57 43 2c 20 70 50 61  useInit(pWC, pPa
1b920 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a  rse, pMaskSet);.
1b930 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1b940 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73  eConstants(pPars
1b950 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68  e, pWhere);.  wh
1b960 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 57  ereSplit(pWC, pW
1b970 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  here, TK_AND);. 
1b980 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c     .  /* Special
1b990 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63   case: a WHERE c
1b9a0 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f  lause that is co
1b9b0 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74  nstant.  Evaluat
1b9c0 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65  e the.  ** expre
1b9d0 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72  ssion and either
1b9e0 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f   jump over all o
1b9f0 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61  f the code or fa
1ba00 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20  ll thru..  */.  
1ba10 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28 70  if( pWhere && (p
1ba20 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30  TabList->nSrc==0
1ba30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
1ba40 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
1ba50 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20  (pWhere)) ){.   
1ba60 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1ba70 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65  lse(pParse, pWhe
1ba80 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  re, pWInfo->iBre
1ba90 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ak, SQLITE_JUMPI
1baa0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65  FNULL);.    pWhe
1bab0 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  re = 0;.  }..  /
1bac0 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66  * Assign a bit f
1bad0 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20  rom the bitmask 
1bae0 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
1baf0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1bb00 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
1bb10 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61   assigning bitma
1bb20 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f  sk values to FRO
1bb30 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73  M clause cursors
1bb40 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a  , it must be.  *
1bb50 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  * the case that 
1bb60 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d  if X is the bitm
1bb70 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68  ask for the N-th
1bb80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1bb90 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  m then.  ** the 
1bba0 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
1bbb0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
1bbc0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
1bbd0 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20   the N-th term. 
1bbe0 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20   ** is (X-1).   
1bbf0 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
1bc00 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  om the ON clause
1bc10 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
1bc20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73  can use.  ** its
1bc30 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
1bc40 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66  Table value to f
1bc50 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ind the bitmask 
1bc60 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
1bc70 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a  le.  ** of the j
1bc80 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e  oin.  Subtractin
1bc90 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72  g one from the r
1bca0 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61  ight table bitma
1bcb0 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20  sk gives a.  ** 
1bcc0 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
1bcd0 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
1bce0 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ft of the join. 
1bcf0 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74   Knowing the bit
1bd00 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c  mask.  ** for al
1bd10 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
1bd20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a  left of a left j
1bd30 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  oin is important
1bd40 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e  .  Ticket #3015.
1bd50 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
1bd60 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1bd70 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65  c; i++){.    cre
1bd80 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  ateMask(pMaskSet
1bd90 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
1bda0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  .iCursor);.  }.#
1bdb0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1bdc0 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f  {.    Bitmask to
1bdd0 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  TheLeft = 0;.   
1bde0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1bdf0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
1be00 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
1be10 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  m = getMask(pMas
1be20 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
1be30 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  a[i].iCursor);. 
1be40 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d       assert( (m-
1be50 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b  1)==toTheLeft );
1be60 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74  .      toTheLeft
1be70 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d   |= m;.    }.  }
1be80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
1be90 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
1bea0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
1beb0 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72    Note that expr
1bec0 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a  Analyze() might.
1bed0 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72    ** add new vir
1bee0 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20  tual terms onto 
1bef0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
1bf00 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65  HERE clause.  We
1bf10 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e   do not.  ** wan
1bf20 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  t to analyze the
1bf30 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  se virtual terms
1bf40 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79  , so start analy
1bf50 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  zing at the end.
1bf60 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f    ** and work fo
1bf70 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68  rward so that th
1bf80 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20  e added virtual 
1bf90 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20  terms are never 
1bfa0 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a  processed..  */.
1bfb0 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
1bfc0 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 29 3b  (pTabList, pWC);
1bfd0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1bfe0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
1bff0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
1c000 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ror;.  }..  /* C
1c010 68 6f 73 65 20 74 68 65 20 62 65 73 74 20 69 6e  hose the best in
1c020 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65  dex to use for e
1c030 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ach table in the
1c040 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
1c050 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
1c060 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66  p fills in the f
1c070 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
1c080 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49  .  **.  **   pWI
1c090 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20  nfo->a[].pIdx   
1c0a0 20 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20     The index to 
1c0b0 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76  use for this lev
1c0c0 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  el of the loop..
1c0d0 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
1c0e0 5b 5d 2e 77 73 46 6c 61 67 73 20 20 20 57 48 45  [].wsFlags   WHE
1c0f0 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73  RE_xxx flags ass
1c100 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
1c110 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  x.  **   pWInfo-
1c120 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54  >a[].nEq       T
1c130 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
1c140 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
1c150 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ts.  **   pWInfo
1c160 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20  ->a[].iFrom     
1c170 57 68 69 63 68 20 74 65 72 6d 20 6f 66 20 74 68  Which term of th
1c180 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
1c190 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a   being coded.  *
1c1a0 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
1c1b0 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56 44  iTabCur   The VD
1c1c0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
1c1d0 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
1c1e0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
1c1f0 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68  a[].iIdxCur   Th
1c200 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
1c210 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  r the index.  **
1c220 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70     pWInfo->a[].p
1c230 54 65 72 6d 20 20 20 20 20 57 68 65 6e 20 77 73  Term     When ws
1c240 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20 74 68  Flags==WO_OR, th
1c250 65 20 4f 52 2d 63 6c 61 75 73 65 20 74 65 72 6d  e OR-clause term
1c260 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
1c270 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65  loop also figure
1c280 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e  s out the nestin
1c290 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65  g order of table
1c2a0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
1c2b0 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ** clause..  */.
1c2c0 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
1c2d0 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 54 61 62  itmask)0;.  pTab
1c2e0 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d  Item = pTabList-
1c2f0 3e 61 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70  >a;.  pLevel = p
1c300 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46  WInfo->a;.  andF
1c310 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48 45  lags = ~0;.  WHE
1c320 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70  RETRACE(("*** Op
1c330 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a  timizer Start **
1c340 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d  *\n"));.  for(i=
1c350 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d  iFrom=0, pLevel=
1c360 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61  pWInfo->a; i<pTa
1c370 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1c380 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
1c390 20 57 68 65 72 65 43 6f 73 74 20 62 65 73 74 50   WhereCost bestP
1c3a0 6c 61 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lan;         /* 
1c3b0 4d 6f 73 74 20 65 66 66 69 63 69 65 6e 74 20 70  Most efficient p
1c3c0 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66 61 72 20  lan seen so far 
1c3d0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
1c3e0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1c3f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20     /* Index for 
1c400 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54  FROM table at pT
1c410 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e  abItem */.    in
1c420 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
1c430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1c440 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52   looping over FR
1c450 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  OM tables */.   
1c460 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 30 3b 20   int bestJ = 0; 
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c480 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a  The value of j *
1c490 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b  /.    Bitmask m;
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c    /* Bitmask val
1c4c0 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74  ue for j or best
1c4d0 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6e 63  J */.    int onc
1c4e0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1c4f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 68 65       /* True whe
1c500 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 73  n first table is
1c510 20 73 65 65 6e 20 2a 2f 0a 0a 20 20 20 20 6d 65   seen */..    me
1c520 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20  mset(&bestPlan, 
1c530 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c  0, sizeof(bestPl
1c540 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c  an));.    bestPl
1c550 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54  an.rCost = SQLIT
1c560 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 66  E_BIG_DBL;.    f
1c570 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62  or(j=iFrom, pTab
1c580 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e  Item=&pTabList->
1c590 61 5b 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69 73 74  a[j]; j<pTabList
1c5a0 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70 54 61  ->nSrc; j++, pTa
1c5b0 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  bItem++){.      
1c5c0 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72  int doNotReorder
1c5d0 3b 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68  ;  /* True if th
1c5e0 69 73 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  is table should 
1c5f0 6e 6f 74 20 62 65 20 72 65 6f 72 64 65 72 65 64  not be reordered
1c600 20 2a 2f 0a 20 20 20 20 20 20 57 68 65 72 65 43   */.      WhereC
1c610 6f 73 74 20 73 43 6f 73 74 3b 20 20 20 2f 2a 20  ost sCost;   /* 
1c620 43 6f 73 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  Cost information
1c630 20 66 72 6f 6d 20 62 65 73 74 49 6e 64 65 78 28   from bestIndex(
1c640 29 20 2a 2f 0a 0a 20 20 20 20 20 20 64 6f 4e 6f  ) */..      doNo
1c650 74 52 65 6f 72 64 65 72 20 3d 20 20 28 70 54 61  tReorder =  (pTa
1c660 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bItem->jointype 
1c670 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
1c680 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20 20 20 20  OSS))!=0;.      
1c690 69 66 28 20 6f 6e 63 65 20 26 26 20 64 6f 4e 6f  if( once && doNo
1c6a0 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b  tReorder ) break
1c6b0 3b 0a 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d  ;.      m = getM
1c6c0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
1c6d0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
1c6e0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6d 20 26  ;.      if( (m &
1c6f0 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
1c700 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
1c710 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b  iFrom ) iFrom++;
1c720 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
1c730 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
1c740 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65   assert( pTabIte
1c750 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e 64  m->pTab );.#ifnd
1c760 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1c770 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1c780 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
1c790 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 29 20  pTabItem->pTab) 
1c7a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1c7b0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
1c7c0 56 74 61 62 49 64 78 3b 20 2f 2a 20 43 75 72 72  VtabIdx; /* Curr
1c7d0 65 6e 74 20 76 69 72 74 75 61 6c 20 69 6e 64 65  ent virtual inde
1c7e0 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  x */.        sql
1c7f0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1c800 2a 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20 26 70  **ppIdxInfo = &p
1c810 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78  WInfo->a[j].pIdx
1c820 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73 43  Info;.        sC
1c830 6f 73 74 2e 72 43 6f 73 74 20 3d 20 62 65 73 74  ost.rCost = best
1c840 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61  VirtualIndex(pPa
1c850 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74  rse, pWC, pTabIt
1c860 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20  em, notReady,.  
1c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c890 20 20 20 20 20 70 70 4f 72 64 65 72 42 79 20 3f       ppOrderBy ?
1c8a0 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20 30 2c   *ppOrderBy : 0,
1c8b0 20 69 3d 3d 30 2c 0a 20 20 20 20 20 20 20 20 20   i==0,.         
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 70                pp
1c8e0 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  IdxInfo);.      
1c8f0 20 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46    sCost.plan.wsF
1c900 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52  lags = WHERE_VIR
1c910 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 20 20 20  TUALTABLE;.     
1c920 20 20 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 75 2e     sCost.plan.u.
1c930 70 56 74 61 62 49 64 78 20 3d 20 70 56 74 61 62  pVtabIdx = pVtab
1c940 49 64 78 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f  Idx = *ppIdxInfo
1c950 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 56  ;.        if( pV
1c960 74 61 62 49 64 78 20 26 26 20 70 56 74 61 62 49  tabIdx && pVtabI
1c970 64 78 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  dx->orderByConsu
1c980 6d 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  med ){.         
1c990 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c   sCost.plan.wsFl
1c9a0 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
1c9b0 55 41 4c 54 41 42 4c 45 20 7c 20 57 48 45 52 45  UALTABLE | WHERE
1c9c0 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20  _ORDERBY;.      
1c9d0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 6f 73    }.        sCos
1c9e0 74 2e 70 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b 0a  t.plan.nEq = 0;.
1c9f0 20 20 20 20 20 20 20 20 2f 2a 20 28 64 6f 75 62          /* (doub
1ca00 6c 65 29 32 20 49 6e 20 63 61 73 65 20 6f 66 20  le)2 In case of 
1ca10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1ca20 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
1ca30 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 53 51  .        if( (SQ
1ca40 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64  LITE_BIG_DBL/((d
1ca50 6f 75 62 6c 65 29 32 29 29 3c 73 43 6f 73 74 2e  ouble)2))<sCost.
1ca60 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rCost ){.       
1ca70 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69     /* The cost i
1ca80 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
1ca90 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
1caa0 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28  SQLITE_BIG_DBL (
1cab0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1cac0 20 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f 66   inital value of
1cad0 20 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20 74   lowestCost in t
1cae0 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20  his loop. If it 
1caf0 69 73 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  is, then.       
1cb00 20 20 20 2a 2a 20 74 68 65 20 28 63 6f 73 74 3c     ** the (cost<
1cb10 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74  lowestCost) test
1cb20 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65   below will neve
1cb30 72 20 62 65 20 74 72 75 65 2e 0a 20 20 20 20 20  r be true..     
1cb40 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20       */ .       
1cb50 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 32 20     /* (double)2 
1cb60 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54  In case of SQLIT
1cb70 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1cb80 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20  POINT... */.    
1cb90 20 20 20 20 20 20 73 43 6f 73 74 2e 72 43 6f 73        sCost.rCos
1cba0 74 20 3d 20 28 53 51 4c 49 54 45 5f 42 49 47 5f  t = (SQLITE_BIG_
1cbb0 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29  DBL/((double)2))
1cbc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cbd0 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a    }else .#endif.
1cbe0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1cbf0 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  bestIndex(pParse
1cc00 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c  , pWC, pTabItem,
1cc10 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20   notReady,.     
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 3d               (i=
1cc30 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 29  =0 && ppOrderBy)
1cc40 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20   ? *ppOrderBy : 
1cc50 30 2c 20 26 73 43 6f 73 74 29 3b 0a 20 20 20 20  0, &sCost);.    
1cc60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 6e    }.      if( on
1cc70 63 65 3d 3d 30 20 7c 7c 20 73 43 6f 73 74 2e 72  ce==0 || sCost.r
1cc80 43 6f 73 74 3c 62 65 73 74 50 6c 61 6e 2e 72 43  Cost<bestPlan.rC
1cc90 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  ost ){.        o
1cca0 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nce = 1;.       
1ccb0 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 43 6f 73   bestPlan = sCos
1ccc0 74 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 4a  t;.        bestJ
1ccd0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
1cce0 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f      if( doNotReo
1ccf0 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rder ) break;.  
1cd00 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1cd10 6f 6e 63 65 20 29 3b 0a 20 20 20 20 61 73 73 65  once );.    asse
1cd20 72 74 28 20 6e 6f 74 52 65 61 64 79 20 26 20 67  rt( notReady & g
1cd30 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
1cd40 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
1cd50 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a  tJ].iCursor) );.
1cd60 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
1cd70 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73  "*** Optimizer s
1cd80 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25 64 20  elects table %d 
1cd90 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20  for loop %d\n", 
1cda0 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20  bestJ,.         
1cdb0 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d    pLevel-pWInfo-
1cdc0 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62  >a));.    if( (b
1cdd0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
1cde0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
1cdf0 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ERBY)!=0 ){.    
1ce00 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30    *ppOrderBy = 0
1ce10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46  ;.    }.    andF
1ce20 6c 61 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e  lags &= bestPlan
1ce30 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  .plan.wsFlags;. 
1ce40 20 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20     pLevel->plan 
1ce50 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b  = bestPlan.plan;
1ce60 0a 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61  .    if( bestPla
1ce70 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
1ce80 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
1ce90 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1cea0 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
1ceb0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65  ->nTab++;.    }e
1cec0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
1ced0 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b  l->iIdxCur = -1;
1cee0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65  .    }.    notRe
1cef0 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
1cf00 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
1cf10 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75  st->a[bestJ].iCu
1cf20 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65  rsor);.    pLeve
1cf30 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28 75 38 29 62  l->iFrom = (u8)b
1cf40 65 73 74 4a 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  estJ;..    /* Ch
1cf50 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 20  eck that if the 
1cf60 74 61 62 6c 65 20 73 63 61 6e 6e 65 64 20 62 79  table scanned by
1cf70 20 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61   this loop itera
1cf80 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20 20  tion had an.    
1cf90 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
1cfa0 61 75 73 65 20 61 74 74 61 63 68 65 64 20 74 6f  ause attached to
1cfb0 20 69 74 2c 20 74 68 61 74 20 74 68 65 20 6e 61   it, that the na
1cfc0 6d 65 64 20 69 6e 64 65 78 20 69 73 20 62 65 69  med index is bei
1cfd0 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 66  ng.    ** used f
1cfe0 6f 72 20 74 68 65 20 73 63 61 6e 2e 20 49 66 20  or the scan. If 
1cff0 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65 72 79 20  not, then query 
1d000 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73 20  compilation has 
1d010 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52  failed..    ** R
1d020 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  eturn an error..
1d030 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 20      */.    pIdx 
1d040 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65  = pTabList->a[be
1d050 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20  stJ].pIndex;.   
1d060 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
1d070 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e     if( (bestPlan
1d080 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
1d090 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
1d0a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1d0b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1d0c0 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65  rse, "cannot use
1d0d0 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 70 49 64   index: %s", pId
1d0e0 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
1d0f0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
1d100 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  inError;.      }
1d110 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1d120 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42   If an INDEXED B
1d130 59 20 63 6c 61 75 73 65 20 69 73 20 75 73 65 64  Y clause is used
1d140 2c 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28  , the bestIndex(
1d150 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20  ) function is.  
1d160 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
1d170 65 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20  eed to find the 
1d180 69 6e 64 65 78 20 73 70 65 63 69 66 69 65 64 20  index specified 
1d190 69 6e 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  in the INDEXED B
1d1a0 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  Y clause.       
1d1b0 20 2a 2a 20 69 66 20 69 74 20 66 69 6e 64 20 61   ** if it find a
1d1c0 6e 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20  n index at all. 
1d1d0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
1d1e0 74 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  t( bestPlan.plan
1d1f0 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78 20 29 3b  .u.pIdx==pIdx );
1d200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d210 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
1d220 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
1d230 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
1d240 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
1d250 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1d260 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
1d270 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Error;.  }..  /*
1d280 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   If the total qu
1d290 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73  ery only selects
1d2a0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74   a single row, t
1d2b0 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  hen the ORDER BY
1d2c0 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  .  ** clause is 
1d2d0 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f  irrelevant..  */
1d2e0 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73  .  if( (andFlags
1d2f0 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29   & WHERE_UNIQUE)
1d300 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79  !=0 && ppOrderBy
1d310 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72   ){.    *ppOrder
1d320 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
1d330 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
1d340 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
1d350 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
1d360 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74   that is request
1d370 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20  ing.  ** to use 
1d380 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  a one-pass algor
1d390 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  ithm, determine 
1d3a0 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f  if this is appro
1d3b0 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65  priate..  ** The
1d3c0 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
1d3d0 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  thm only works i
1d3e0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
1d3f0 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  se constraints. 
1d400 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
1d410 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73 69  t to update a si
1d420 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20  ngle row..  */. 
1d430 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46   assert( (wctrlF
1d440 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
1d450 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
1d460 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   || pWInfo->nLev
1d470 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28  el==1 );.  if( (
1d480 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1d490 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
1d4a0 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c  ED)!=0 && (andFl
1d4b0 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51  ags & WHERE_UNIQ
1d4c0 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57  UE)!=0 ){.    pW
1d4d0 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
1d4e0 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  = 1;.    pWInfo-
1d4f0 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61  >a[0].plan.wsFla
1d500 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58  gs &= ~WHERE_IDX
1d510 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _ONLY;.  }..  /*
1d520 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
1d530 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
1d540 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
1d550 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
1d560 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
1d570 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
1d580 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
1d590 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
1d5a0 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74  , -1); /* Insert
1d5b0 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
1d5c0 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66  fier Goto */.  f
1d5d0 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
1d5e0 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62  WInfo->a; i<pTab
1d5f0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1d600 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
1d610 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
1d620 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
1d630 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
1d640 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
1d650 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
1d660 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
1d670 69 6e 64 65 78 20 2a 2f 0a 0a 23 69 66 6e 64 65  index */..#ifnde
1d680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
1d690 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50  PLAIN.    if( pP
1d6a0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
1d6b0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
1d6c0 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72 75  zMsg;.      stru
1d6d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1d6e0 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
1d6f0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
1d700 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67  rom];.      zMsg
1d710 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1d720 66 28 64 62 2c 20 22 54 41 42 4c 45 20 25 73 22  f(db, "TABLE %s"
1d730 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
1d740 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1d750 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
1d760 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
1d770 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
1d780 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c  Msg, "%s AS %s",
1d790 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41   zMsg, pItem->zA
1d7a0 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
1d7b0 20 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c       if( (pLevel
1d7c0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
1d7d0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
1d7e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  =0 ){.        zM
1d7f0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1d800 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1d810 25 73 20 57 49 54 48 20 49 4e 44 45 58 20 25 73  %s WITH INDEX %s
1d820 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 4d  ",.           zM
1d830 73 67 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  sg, pLevel->plan
1d840 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  .u.pIdx->zName);
1d850 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1d860 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
1d870 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
1d880 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20  LTI_OR ){.      
1d890 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1d8a0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1d8b0 67 2c 20 22 25 73 20 56 49 41 20 4d 55 4c 54 49  g, "%s VIA MULTI
1d8c0 2d 49 4e 44 45 58 20 55 4e 49 4f 4e 22 2c 20 7a  -INDEX UNION", z
1d8d0 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
1d8e0 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  e if( pLevel->pl
1d8f0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48  an.wsFlags & (WH
1d900 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45  ERE_ROWID_EQ|WHE
1d910 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20  RE_ROWID_RANGE) 
1d920 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
1d930 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1d940 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1d950 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45  USING PRIMARY KE
1d960 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  Y", zMsg);.     
1d970 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1d980 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1d990 42 4c 45 0a 20 20 20 20 20 20 65 6c 73 65 20 69  BLE.      else i
1d9a0 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
1d9b0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1d9c0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
1d9d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1d9e0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1d9f0 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76  *pVtabIdx = pLev
1da00 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  el->plan.u.pVtab
1da10 49 64 78 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73  Idx;.        zMs
1da20 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1da30 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1da40 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  s VIRTUAL TABLE 
1da50 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d  INDEX %d:%s", zM
1da60 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
1da70 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78          pVtabIdx
1da80 2d 3e 69 64 78 4e 75 6d 2c 20 70 56 74 61 62 49  ->idxNum, pVtabI
1da90 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  dx->idxStr);.   
1daa0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1dab0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
1dac0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1dad0 52 45 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20 20  RE_ORDERBY ){.  
1dae0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1daf0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1db00 20 7a 4d 73 67 2c 20 22 25 73 20 4f 52 44 45 52   zMsg, "%s ORDER
1db10 20 42 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20   BY", zMsg);.   
1db20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1db30 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1db40 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70  OP_Explain, i, p
1db50 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c  Level->iFrom, 0,
1db60 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
1db70 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
1db80 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1db90 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70  EXPLAIN */.    p
1dba0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
1dbb0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
1dbc0 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
1dbd0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
1dbe0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
1dbf0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1dc00 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
1dc10 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
1dc20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
1dc30 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
1dc40 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d  ral)!=0 || pTab-
1dc50 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69  >pSelect ) conti
1dc60 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nue;.#ifndef SQL
1dc70 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1dc80 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
1dc90 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1dca0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
1dcb0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
1dcc0 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d        int iCur =
1dcd0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
1dce0 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
1dcf0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1dd00 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30  P_VOpen, iCur, 0
1dd10 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f               (co
1dd30 6e 73 74 20 63 68 61 72 2a 29 70 54 61 62 2d 3e  nst char*)pTab->
1dd40 70 56 74 61 62 2c 20 50 34 5f 56 54 41 42 29 3b  pVtab, P4_VTAB);
1dd50 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
1dd60 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  f.    if( (pLeve
1dd70 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1dd80 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
1dd90 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
1dda0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
1ddb0 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 29 3d  HERE_OMIT_OPEN)=
1ddc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1ddd0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  op = pWInfo->okO
1dde0 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e  nePass ? OP_Open
1ddf0 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52  Write : OP_OpenR
1de00 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ead;.      sqlit
1de10 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
1de20 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
1de30 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
1de40 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  , op);.      if(
1de50 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
1de60 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
1de70 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20  l<BMS ){.       
1de80 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
1de90 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
1dea0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
1deb0 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
1dec0 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
1ded0 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
1dee0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
1def0 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
1df00 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 53  rentAddr(v)-1, S
1df10 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
1df20 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  (n), P4_INT32);.
1df30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1df40 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  n<=pTab->nCol );
1df50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1df60 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1df70 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
1df80 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
1df90 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
1dfa0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
1dfb0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
1dfc0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
1dfd0 6f 72 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65  or;.    if( (pLe
1dfe0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1dff0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1e000 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49  D)!=0 ){.      I
1e010 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76  ndex *pIx = pLev
1e020 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
1e030 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
1e040 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
1e050 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
1e060 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69  e, pIx);.      i
1e070 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65  nt iIdxCur = pLe
1e080 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
1e090 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
1e0a0 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
1e0b0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
1e0c0 20 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72   assert( iIdxCur
1e0d0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  >=0 );.      sql
1e0e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1e0f0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
1e100 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  IdxCur, pIx->tnu
1e110 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  m, iDb,.        
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e130 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f  (char*)pKey, P4_
1e140 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
1e150 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1e160 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
1e170 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
1e180 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
1e190 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
1e1a0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  arse, iDb);.  }.
1e1b0 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d    pWInfo->iTop =
1e1c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1e1d0 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f  entAddr(v);..  /
1e1e0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
1e1f0 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
1e200 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
1e210 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
1e220 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
1e230 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
1e240 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
1e250 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
1e260 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
1e270 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
1e280 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
1e290 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
1e2a0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1e2b0 29 7b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  ){.    notReady 
1e2c0 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  = codeOneLoopSta
1e2d0 72 74 28 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63  rt(pWInfo, i, wc
1e2e0 74 72 6c 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61  trlFlags, notRea
1e2f0 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  dy);.    pWInfo-
1e300 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 57 49  >iContinue = pWI
1e310 6e 66 6f 2d 3e 61 5b 69 5d 2e 61 64 64 72 43 6f  nfo->a[i].addrCo
1e320 6e 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  nt;.  }..#ifdef 
1e330 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20  SQLITE_TEST  /* 
1e340 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  For testing and 
1e350 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
1e360 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72  ly */.  /* Recor
1e370 64 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70  d in the query p
1e380 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lan information 
1e390 61 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e  about the curren
1e3a0 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64  t table.  ** and
1e3b0 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
1e3c0 74 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66  to access it (if
1e3d0 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74   any).  If the t
1e3e0 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a  able itself.  **
1e3f0 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74   is not used, it
1e400 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27  s name is just '
1e410 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65  {}'.  If no inde
1e420 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74  x is used.  ** t
1e430 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74  he index is list
1e440 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20  ed as "{}".  If 
1e450 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
1e460 69 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a  is used the.  **
1e470 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27   index name is '
1e480 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  *'..  */.  for(i
1e490 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
1e4a0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
1e4b0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74  char *z;.    int
1e4c0 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d   n;.    pLevel =
1e4d0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
1e4e0 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
1e4f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
1e500 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
1e510 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41  z = pTabItem->zA
1e520 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d  lias;.    if( z=
1e530 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65  =0 ) z = pTabIte
1e540 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a  m->pTab->zName;.
1e550 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
1e560 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
1e570 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
1e580 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
1e590 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a  ery_plan)-10 ){.
1e5a0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
1e5b0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
1e5c0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
1e5d0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1e5e0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
1e5f0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
1e600 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  {}", 2);.       
1e610 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
1e620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e630 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
1e640 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
1e650 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Plan], z, n);.  
1e660 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
1e670 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1e680 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
1e690 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
1e6a0 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  ' ';.    }.    t
1e6b0 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
1e6c0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
1e6d0 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
1e6e0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1e6f0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1e700 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
1e710 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20  ID_RANGE );.    
1e720 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
1e730 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
1e740 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
1e750 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
1e760 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73  .      memcpy(&s
1e770 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
1e780 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c  n[nQPlan], "* ",
1e790 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   2);.      nQPla
1e7a0 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  n += 2;.    }els
1e7b0 65 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70  e if( (pLevel->p
1e7c0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1e7d0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
1e7e0 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ){.      n = sql
1e7f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65  ite3Strlen30(pLe
1e800 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
1e810 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1e820 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
1e830 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
1e840 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20  ery_plan)-2 ){. 
1e850 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
1e860 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
1e870 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65  n[nQPlan], pLeve
1e880 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
1e890 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
1e8a0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
1e8b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1e8c0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
1e8d0 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  n++] = ' ';.    
1e8e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1e8f0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
1e900 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
1e910 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20  nQPlan], "{} ", 
1e920 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  3);.      nQPlan
1e930 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 3;.    }.  }
1e940 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e  .  while( nQPlan
1e950 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75  >0 && sqlite3_qu
1e960 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d  ery_plan[nQPlan-
1e970 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73  1]==' ' ){.    s
1e980 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
1e990 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  n[--nQPlan] = 0;
1e9a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71  .  }.  sqlite3_q
1e9b0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
1e9c0 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20  ] = 0;.  nQPlan 
1e9d0 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  = 0;.#endif /* S
1e9e0 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65  QLITE_TEST // Te
1e9f0 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
1ea00 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a  ing use only */.
1ea10 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
1ea20 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64   continuation ad
1ea30 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65  dress in the Whe
1ea40 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
1ea50 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65  .  Then.  ** cle
1ea60 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
1ea70 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
1ea80 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
1ea90 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
1eaa0 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
1eab0 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 77 68  BeginError:.  wh
1eac0 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
1ead0 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
1eae0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
1eaf0 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f  nerate the end o
1eb00 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
1eb10 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  .  See comments 
1eb20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  on .** sqlite3Wh
1eb30 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61  ereBegin() for a
1eb40 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
1eb50 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
1eb60 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57  qlite3WhereEnd(W
1eb70 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1eb80 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
1eb90 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
1eba0 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  rse;.  Vdbe *v =
1ebb0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1ebc0 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
1ebd0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
1ebe0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1ebf0 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
1ec00 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  bList;.  sqlite3
1ec10 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1ec20 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  b;..  /* Generat
1ec30 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69  e loop terminati
1ec40 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  on code..  */.  
1ec50 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72  sqlite3ExprClear
1ec60 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
1ec70 73 65 2c 20 2d 31 29 3b 0a 20 20 66 6f 72 28 69  se, -1);.  for(i
1ec80 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d  =pTabList->nSrc-
1ec90 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
1eca0 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
1ecb0 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  nfo->a[i];.    s
1ecc0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1ecd0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
1ece0 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  ->addrCont);.   
1ecf0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
1ed00 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
1ed10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ed20 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  Op2(v, pLevel->o
1ed30 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  p, pLevel->p1, p
1ed40 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20  Level->p2);.    
1ed50 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1ed60 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d  ngeP5(v, pLevel-
1ed70 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >p5);.    }.    
1ed80 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
1ed90 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1eda0 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76  _IN_ABLE && pLev
1edb0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29  el->u.in.nIn>0 )
1edc0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49  {.      struct I
1edd0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
1ede0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73    int j;.      s
1edf0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1ee00 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
1ee10 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  ->addrNxt);.    
1ee20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e    for(j=pLevel->
1ee30 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70  u.in.nIn, pIn=&p
1ee40 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
1ee50 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a  oop[j-1]; j>0; j
1ee60 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20  --, pIn--){.    
1ee70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1ee80 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
1ee90 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20  addrInTop+1);.  
1eea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1eeb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
1eec0 78 74 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  xt, pIn->iCur, p
1eed0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
1eee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1eef0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
1ef00 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
1ef10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ef20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1ef30 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
1ef40 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
1ef50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1ef60 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
1ef70 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
1ef80 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
1ef90 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
1efa0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
1efb0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
1efc0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
1efd0 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d  P_IfPos, pLevel-
1efe0 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
1eff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f000 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
1f010 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ow, pTabList->a[
1f020 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
1f030 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
1f040 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20  IdxCur>=0 ){.   
1f050 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f060 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
1f070 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
1f080 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
1f090 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f0a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1f0b0 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
1f0c0 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
1f0d0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1f0e0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
1f0f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
1f100 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74  he "break" point
1f110 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70   is here, just p
1f120 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
1f130 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20  he outer loop.. 
1f140 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f   ** Set it..  */
1f150 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1f160 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57  solveLabel(v, pW
1f170 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a  Info->iBreak);..
1f180 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f    /* Close all o
1f190 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
1f1a0 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62  at were opened b
1f1b0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
1f1c0 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  gin..  */.  for(
1f1d0 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
1f1e0 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  fo->a; i<pTabLis
1f1f0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c  t->nSrc; i++, pL
1f200 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72  evel++){.    str
1f210 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f220 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54   *pTabItem = &pT
1f230 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
1f240 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61  ->iFrom];.    Ta
1f250 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
1f260 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
1f270 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
1f280 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
1f290 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
1f2a0 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
1f2b0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
1f2c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1f2d0 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
1f2e0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
1f2f0 4d 49 54 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b  MIT_CLOSE)==0 ){
1f300 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e  .      if( !pWIn
1f310 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
1f320 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
1f330 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1f340 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
1f350 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1f360 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
1f370 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  lose, pTabItem->
1f380 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
1f390 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 65  }.      if( (pLe
1f3a0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1f3b0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1f3c0 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
1f3d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f3e0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
1f3f0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
1f400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f410 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1f420 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64  scan uses an ind
1f430 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75  ex, make code su
1f440 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72  bstitutions to r
1f450 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  ead data.    ** 
1f460 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69  from the index i
1f470 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20  n preference to 
1f480 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74  the table. Somet
1f490 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73  imes, this means
1f4a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
1f4b0 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20  e need never be 
1f4c0 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20  read from. This 
1f4d0 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  is a performance
1f4e0 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61   boost,.    ** a
1f4f0 73 20 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c  s the vdbe level
1f500 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65   waits until the
1f510 20 74 61 62 6c 65 20 69 73 20 72 65 61 64 20 62   table is read b
1f520 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20  efore actually. 
1f530 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68     ** seeking th
1f540 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74  e table cursor t
1f550 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72  o the record cor
1f560 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
1f570 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a  e current.    **
1f580 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
1f590 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a   index..    ** .
1f5a0 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
1f5b0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
1f5c0 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
1f5d0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
1f5e0 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
1f5f0 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
1f600 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
1f610 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
1f620 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
1f630 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
1f640 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
1f650 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
1f660 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
1f670 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
1f680 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
1f690 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
1f6a0 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
1f6b0 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
1f6c0 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
1f6d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1f6e0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1f6f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
1f700 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  EXED)!=0 ){.    
1f710 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74    int k, j, last
1f720 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
1f730 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64 65 78  pOp;.      Index
1f740 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d   *pIdx = pLevel-
1f750 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20  >plan.u.pIdx;.  
1f760 20 20 20 20 69 6e 74 20 75 73 65 49 6e 64 65 78      int useIndex
1f770 4f 6e 6c 79 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Only = pLevel->p
1f780 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1f790 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20  ERE_IDX_ONLY;.. 
1f7a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
1f7b0 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f  x!=0 );.      pO
1f7c0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
1f7d0 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  etOp(v, pWInfo->
1f7e0 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73  iTop);.      las
1f7f0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
1f800 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1f810 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66       for(k=pWInf
1f820 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b  o->iTop; k<last;
1f830 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   k++, pOp++){.  
1f840 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
1f850 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  1!=pLevel->iTabC
1f860 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
1f870 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
1f880 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
1f890 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  n ){.          f
1f8a0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
1f8b0 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
1f8c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1f8d0 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69  Op->p2==pIdx->ai
1f8e0 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20  Column[j] ){.   
1f8f0 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
1f900 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  p2 = j;.        
1f910 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
1f920 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
1f930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
1f940 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1f950 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1f960 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1f970 28 21 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 7c  (!useIndexOnly |
1f980 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  | j<pIdx->nColum
1f990 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
1f9a0 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
1f9b0 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
1f9c0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
1f9d0 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
1f9e0 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
1f9f0 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
1fa00 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
1fa10 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
1fa20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52  opcode==OP_NullR
1fa30 6f 77 20 26 26 20 75 73 65 49 6e 64 65 78 4f 6e  ow && useIndexOn
1fa40 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
1fa50 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
1fa60 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  _Noop;.        }
1fa70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fa80 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63   }..  /* Final c
1fa90 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 77 68  leanup.  */.  wh
1faa0 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
1fab0 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
1fac0 6e 3b 0a 7d 0a                                   n;.}.