/ Hex Artifact Content
Login

Artifact 86cd4009ae0b19d9223d526edfd6ed12dceeffc0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64  izer"..**.** $Id
0330: 3a 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 33 36  : where.c,v 1.36
0340: 31 20 32 30 30 39 2f 30 31 2f 30 38 20 32 31 3a  1 2009/01/08 21:
0350: 30 30 3a 30 33 20 64 72 68 20 45 78 70 20 24 0a  00:03 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 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
4200: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
4210: 6b 53 65 74 2c 20 70 2d 3e 70 4c 69 73 74 29 3b  kSet, p->pList);
4220: 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53  .  mask |= exprS
4230: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
4240: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 53 65  pMaskSet, p->pSe
4250: 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  lect);.  return 
4260: 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42  mask;.}.static B
4270: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
4280: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4290: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
42a0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
42b0: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42  t){.  int i;.  B
42c0: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
42d0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
42e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
42f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
4300: 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  ){.      mask |=
4310: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
4320: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
4330: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
4340: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4350: 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20   mask;.}.static 
4360: 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65  Bitmask exprSele
4370: 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  ctTableUsage(Whe
4380: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
4390: 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29  Set, Select *pS)
43a0: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
43b0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
43c0: 53 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  S ){.    mask |=
43d0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
43e0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
43f0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d  ->pEList);.    m
4400: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
4410: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4420: 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  et, pS->pGroupBy
4430: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
4440: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
4450: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
4460: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d  pOrderBy);.    m
4470: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4480: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4490: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
44a0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
44b0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
44c0: 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  , pS->pHaving);.
44d0: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
44e0: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
44f0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
4500: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4510: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
4520: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
4530: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
4540: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
4550: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
4560: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
4570: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
4580: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
4590: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
45a0: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22  <=", ">=", and "
45b0: 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IN"..*/.static i
45c0: 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74  nt allowedOp(int
45d0: 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   op){.  assert( 
45e0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_GT>TK_EQ && T
45f0: 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_GT<TK_GE );.  
4600: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b  assert( TK_LT>TK
4610: 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f  _EQ && TK_LT<TK_
4620: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
4630: 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LE>TK_EQ && T
4640: 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LE<TK_GE );.  
4650: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
4660: 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75  K_EQ+4 );.  retu
4670: 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  rn op==TK_IN || 
4680: 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70  (op>=TK_EQ && op
4690: 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d  <=TK_GE) || op==
46a0: 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a  TK_ISNULL;.}../*
46b0: 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a  .** Swap two obj
46c0: 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59 50  ects of type TYP
46d0: 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57  E..*/.#define SW
46e0: 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59  AP(TYPE,A,B) {TY
46f0: 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74  PE t=A; A=B; B=t
4700: 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74  ;}../*.** Commut
4710: 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  e a comparison o
4720: 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73  perator.  Expres
4730: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
4740: 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72  m "X op Y".** ar
4750: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
4760: 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a   "Y op X"..**.**
4770: 20 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20   If a collation 
4780: 73 65 71 75 65 6e 63 65 20 69 73 20 61 73 73 6f  sequence is asso
4790: 63 69 61 74 65 64 20 77 69 74 68 20 65 69 74 68  ciated with eith
47a0: 65 72 20 74 68 65 20 6c 65 66 74 20 6f 72 20 72  er the left or r
47b0: 69 67 68 74 0a 2a 2a 20 73 69 64 65 20 6f 66 20  ight.** side of 
47c0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  the comparison, 
47d0: 69 74 20 72 65 6d 61 69 6e 73 20 61 73 73 6f 63  it remains assoc
47e0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
47f0: 61 6d 65 20 73 69 64 65 20 61 66 74 65 72 0a 2a  ame side after.*
4800: 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61 74 69 6f  * the commutatio
4810: 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61 74 65  n. So "Y collate
4820: 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65   NOCASE op X" be
4830: 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 63 6f 6c  comes .** "X col
4840: 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 59  late NOCASE op Y
4850: 22 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ". This is becau
4860: 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e  se any collation
4870: 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20   sequence on.** 
4880: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69  the left hand si
4890: 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73  de of a comparis
48a0: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
48b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
48c0: 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65 64  nce .** attached
48d0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 46   to the right. F
48e0: 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61 73  or the same reas
48f0: 6f 6e 20 74 68 65 20 45 50 5f 45 78 70 43 6f 6c  on the EP_ExpCol
4900: 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20  late flag.** is 
4910: 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f  not commuted..*/
4920: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
4930: 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a  rCommute(Parse *
4940: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
4950: 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52  xpr){.  u16 expR
4960: 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  ight = (pExpr->p
4970: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
4980: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  P_ExpCollate);. 
4990: 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20 28   u16 expLeft = (
49a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
49b0: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
49c0: 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ate);.  assert( 
49d0: 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d  allowedOp(pExpr-
49e0: 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f  >op) && pExpr->o
49f0: 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 70 45  p!=TK_IN );.  pE
4a00: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f  xpr->pRight->pCo
4a10: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
4a20: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
4a30: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
4a40: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
4a50: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
4a60: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
4a70: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
4a80: 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53 65 71  ;.  SWAP(CollSeq
4a90: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d  *,pExpr->pRight-
4aa0: 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c  >pColl,pExpr->pL
4ab0: 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70  eft->pColl);.  p
4ac0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
4ad0: 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70 52  ags = (pExpr->pR
4ae0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45  ight->flags & ~E
4af0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20  P_ExpCollate) | 
4b00: 65 78 70 4c 65 66 74 3b 0a 20 20 70 45 78 70 72  expLeft;.  pExpr
4b10: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 3d  ->pLeft->flags =
4b20: 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
4b30: 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43  flags & ~EP_ExpC
4b40: 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 52 69 67  ollate) | expRig
4b50: 68 74 3b 0a 20 20 53 57 41 50 28 45 78 70 72 2a  ht;.  SWAP(Expr*
4b60: 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70  ,pExpr->pRight,p
4b70: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
4b80: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  if( pExpr->op>=T
4b90: 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65  K_GT ){.    asse
4ba0: 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
4bb0: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
4bc0: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32  ( TK_GE==TK_LE+2
4bd0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
4be0: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20  TK_GT>TK_EQ );. 
4bf0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
4c00: 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  <TK_LE );.    as
4c10: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e  sert( pExpr->op>
4c20: 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d  =TK_GT && pExpr-
4c30: 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20  >op<=TK_GE );.  
4c40: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28    pExpr->op = ((
4c50: 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29  pExpr->op-TK_GT)
4c60: 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d  ^2)+TK_GT;.  }.}
4c70: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  ../*.** Translat
4c80: 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65  e from TK_xx ope
4c90: 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62  rator to WO_xx b
4ca0: 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  itmask..*/.stati
4cb0: 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d 61  c u16 operatorMa
4cc0: 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31  sk(int op){.  u1
4cd0: 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61  6 c;.  assert( a
4ce0: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a  llowedOp(op) );.
4cf0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20    if( op==TK_IN 
4d00: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e  ){.    c = WO_IN
4d10: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
4d20: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
4d30: 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c     c = WO_ISNULL
4d40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
4d50: 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c 28  ssert( (WO_EQ<<(
4d60: 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78 37  op-TK_EQ)) < 0x7
4d70: 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20 28  fff );.    c = (
4d80: 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d  u16)(WO_EQ<<(op-
4d90: 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20 61  TK_EQ));.  }.  a
4da0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53  ssert( op!=TK_IS
4db0: 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53  NULL || c==WO_IS
4dc0: 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  NULL );.  assert
4dd0: 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63  ( op!=TK_IN || c
4de0: 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73  ==WO_IN );.  ass
4df0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c  ert( op!=TK_EQ |
4e00: 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20  | c==WO_EQ );.  
4e10: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c  assert( op!=TK_L
4e20: 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b  T || c==WO_LT );
4e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
4e40: 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45  K_LE || c==WO_LE
4e50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
4e60: 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_GT || c==WO
4e70: 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GT );.  assert(
4e80: 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d   op!=TK_GE || c=
4e90: 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75  =WO_GE );.  retu
4ea0: 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn c;.}../*.** S
4eb0: 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d  earch for a term
4ec0: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
4ed0: 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66 20  ause that is of 
4ee0: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
4ef0: 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72   <expr>".** wher
4f00: 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65 6e  e X is a referen
4f10: 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d  ce to the iColum
4f20: 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20  n of table iCur 
4f30: 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20  and <op> is one 
4f40: 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20  of.** the WO_xx 
4f50: 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73  operator codes s
4f60: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
4f70: 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  op parameter..**
4f80: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
4f90: 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20  r to the term.  
4fa0: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20  Return 0 if not 
4fb0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
4fc0: 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64   WhereTerm *find
4fd0: 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61  Term(.  WhereCla
4fe0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
4ff0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
5000: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
5010: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
5020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5030: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
5040: 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  LHS */.  int iCo
5050: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  lumn,          /
5060: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
5070: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d  of LHS */.  Bitm
5080: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
5090: 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f    /* RHS must no
50a0: 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74  t overlap with t
50b0: 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33  his mask */.  u3
50c0: 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  2 op,           
50d0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57      /* Mask of W
50e0: 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63  O_xx values desc
50f0: 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20  ribing operator 
5100: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
5110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
5120: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
5130: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
5140: 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  , if not NULL */
5150: 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
5160: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b  *pTerm;.  int k;
5170: 0a 20 20 61 73 73 65 72 74 28 20 69 43 75 72 3e  .  assert( iCur>
5180: 3d 30 20 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f  =0 );.  op &= WO
5190: 5f 41 4c 4c 3b 0a 20 20 66 6f 72 28 70 54 65 72  _ALL;.  for(pTer
51a0: 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d  m=pWC->a, k=pWC-
51b0: 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20  >nTerm; k; k--, 
51c0: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
51d0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
51e0: 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20  sor==iCur.      
51f0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72   && (pTerm->prer
5200: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
5210: 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  dy)==0.       &&
5220: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
5230: 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20  lumn==iColumn.  
5240: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
5250: 65 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 29 21  eOperator & op)!
5260: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
5270: 69 66 28 20 70 49 64 78 20 26 26 20 70 54 65 72  if( pIdx && pTer
5280: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f  m->eOperator!=WO
5290: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
52a0: 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
52b0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
52c0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
52d0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  ll;.        char
52e0: 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20 20   idxaff;.       
52f0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
5300: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
5310: 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20  pWC->pParse;..  
5320: 20 20 20 20 20 20 69 64 78 61 66 66 20 3d 20 70        idxaff = p
5330: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
5340: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
5350: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ity;.        if(
5360: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
5370: 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64 78  finityOk(pX, idx
5380: 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  aff) ) continue;
5390: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 67  ..        /* Fig
53a0: 75 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 6c  ure out the coll
53b0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72  ation sequence r
53c0: 65 71 75 69 72 65 64 20 66 72 6f 6d 20 61 6e 20  equired from an 
53d0: 69 6e 64 65 78 20 66 6f 72 0a 20 20 20 20 20 20  index for.      
53e0: 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75 73    ** it to be us
53f0: 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69 73  eful for optimis
5400: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ing expression p
5410: 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20 20  X. Store this.  
5420: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69        ** value i
5430: 6e 20 76 61 72 69 61 62 6c 65 20 70 43 6f 6c 6c  n variable pColl
5440: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5450: 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e       assert(pX->
5460: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
5470: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
5480: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
5490: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
54a0: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
54b0: 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
54c0: 72 74 28 70 43 6f 6c 6c 20 7c 7c 20 70 50 61 72  rt(pColl || pPar
54d0: 73 65 2d 3e 6e 45 72 72 29 3b 0a 0a 20 20 20 20  se->nErr);..    
54e0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64      for(j=0; pId
54f0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d  x->aiColumn[j]!=
5500: 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  iColumn; j++){. 
5510: 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56           if( NEV
5520: 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c  ER(j>=pIdx->nCol
5530: 75 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  umn) ) return 0;
5540: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5550: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20     if( pColl && 
5560: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
5570: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64  Coll->zName, pId
5580: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20  x->azColl[j]) ) 
5590: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
55a0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
55b0: 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Term;.    }.  }.
55c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
55d0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
55e0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce */.static vo
55f0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53  id exprAnalyze(S
5600: 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c  rcList*, WhereCl
5610: 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  ause*, int);../*
5620: 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61  .** Call exprAna
5630: 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  lyze on all term
5640: 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61  s in a WHERE cla
5650: 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a  use.  .**.**.*/.
5660: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
5670: 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72  AnalyzeAll(.  Sr
5680: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
5690: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
56a0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
56b0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
56c0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
56d0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
56e0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
56f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5700: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20  i=pWC->nTerm-1; 
5710: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
5720: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  exprAnalyze(pTab
5730: 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20  List, pWC, i);. 
5740: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
5750: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5760: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
5770: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
5780: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
5790: 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45  ession is a LIKE
57a0: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
57b0: 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  r that.** can be
57c0: 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
57d0: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
57e0: 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e  traints.  Return
57f0: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a   TRUE if it is.*
5800: 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69  * so and false i
5810: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  f not..**.** In 
5820: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70  order for the op
5830: 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74  erator to be opt
5840: 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48  imizible, the RH
5850: 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69  S must be a stri
5860: 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68  ng.** literal th
5870: 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  at does not begi
5880: 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72  n with a wildcar
5890: 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d.  .*/.static i
58a0: 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  nt isLikeOrGlob(
58b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
58c0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
58d0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
58e0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
58f0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
5900: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
5910: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
5920: 69 6e 74 20 2a 70 6e 50 61 74 74 65 72 6e 2c 20  int *pnPattern, 
5930: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
5940: 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66  on-wildcard pref
5950: 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  ix characters */
5960: 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c  .  int *pisCompl
5970: 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69 66 20  ete, /* True if 
5980: 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72  the only wildcar
5990: 64 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61  d is % in the la
59a0: 73 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a  st character */.
59b0: 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20    int *pnoCase  
59c0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 75      /* True if u
59d0: 70 70 65 72 63 61 73 65 20 69 73 20 65 71 75 69  ppercase is equi
59e0: 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63  valent to lowerc
59f0: 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ase */.){.  cons
5a00: 74 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20  t char *z;      
5a10: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
5a20: 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45 20   on RHS of LIKE 
5a30: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78  operator */.  Ex
5a40: 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65  pr *pRight, *pLe
5a50: 66 74 3b 20 20 20 20 20 20 2f 2a 20 52 69 67 68  ft;      /* Righ
5a60: 74 20 61 6e 64 20 6c 65 66 74 20 73 69 7a 65 20  t and left size 
5a70: 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  of LIKE operator
5a80: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
5a90: 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  pList;          
5aa0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65 72   /* List of oper
5ab0: 61 6e 64 73 20 74 6f 20 74 68 65 20 4c 49 4b 45  ands to the LIKE
5ac0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
5ad0: 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20 20 20  nt c;           
5ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
5af0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 5b   character in z[
5b00: 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  ] */.  int cnt; 
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
5b30: 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66  on-wildcard pref
5b40: 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  ix characters */
5b50: 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 20 20  .  char wc[3];  
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5b70: 20 57 69 6c 64 63 61 72 64 20 63 68 61 72 61 63   Wildcard charac
5b80: 74 65 72 73 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65  ters */.  CollSe
5b90: 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
5ba0: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
5bb0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 4c  g sequence for L
5bc0: 48 53 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  HS */.  sqlite3 
5bd0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
5be0: 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
5bf0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
5c00: 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69  if( !sqlite3IsLi
5c10: 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  keFunction(db, p
5c20: 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77  Expr, pnoCase, w
5c30: 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  c) ){.    return
5c40: 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53   0;.  }.#ifdef S
5c50: 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20 69  QLITE_EBCDIC.  i
5c60: 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20 72 65  f( *pnoCase ) re
5c70: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20  turn 0;.#endif. 
5c80: 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
5c90: 70 4c 69 73 74 3b 0a 20 20 70 52 69 67 68 74 20  pList;.  pRight 
5ca0: 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  = pList->a[0].pE
5cb0: 78 70 72 3b 0a 20 20 69 66 28 20 70 52 69 67 68  xpr;.  if( pRigh
5cc0: 74 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47  t->op!=TK_STRING
5cd0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
5ce0: 3b 0a 20 20 7d 0a 20 20 70 4c 65 66 74 20 3d 20  ;.  }.  pLeft = 
5cf0: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
5d00: 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  r;.  if( pLeft->
5d10: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
5d20: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5d30: 20 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c   }.  pColl = sql
5d40: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
5d50: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
5d60: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 21    assert( pColl!
5d70: 3d 30 20 7c 7c 20 70 4c 65 66 74 2d 3e 69 43 6f  =0 || pLeft->iCo
5d80: 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 69 66  lumn==-1 );.  if
5d90: 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ( pColl==0 ){.  
5da0: 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f    /* No collatio
5db0: 6e 20 69 73 20 64 65 66 69 6e 65 64 20 66 6f 72  n is defined for
5dc0: 20 74 68 65 20 52 4f 57 49 44 2e 20 20 55 73 65   the ROWID.  Use
5dd0: 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 2a 2f   the default. */
5de0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  .    pColl = db-
5df0: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 7d 0a  >pDfltColl;.  }.
5e00: 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 74 79    if( (pColl->ty
5e10: 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  pe!=SQLITE_COLL_
5e20: 42 49 4e 41 52 59 20 7c 7c 20 2a 70 6e 6f 43 61  BINARY || *pnoCa
5e30: 73 65 29 20 26 26 0a 20 20 20 20 20 20 28 70 43  se) &&.      (pC
5e40: 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54  oll->type!=SQLIT
5e50: 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 20 7c 7c  E_COLL_NOCASE ||
5e60: 20 21 2a 70 6e 6f 43 61 73 65 29 20 29 7b 0a 20   !*pnoCase) ){. 
5e70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5e80: 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
5e90: 65 45 78 70 72 28 64 62 2c 20 70 52 69 67 68 74  eExpr(db, pRight
5ea0: 29 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 20 2a  );.  z = (char *
5eb0: 29 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  )pRight->token.z
5ec0: 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  ;.  cnt = 0;.  i
5ed0: 66 28 20 7a 20 29 7b 0a 20 20 20 20 77 68 69 6c  f( z ){.    whil
5ee0: 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30  e( (c=z[cnt])!=0
5ef0: 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20   && c!=wc[0] && 
5f00: 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77  c!=wc[1] && c!=w
5f10: 63 5b 32 5d 20 29 7b 20 63 6e 74 2b 2b 3b 20 7d  c[2] ){ cnt++; }
5f20: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6e 74 3d 3d  .  }.  if( cnt==
5f30: 30 20 7c 7c 20 32 35 35 3d 3d 28 75 38 29 7a 5b  0 || 255==(u8)z[
5f40: 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 72 65  cnt-1] ){.    re
5f50: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  turn 0;.  }.  *p
5f60: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63  isComplete = z[c
5f70: 6e 74 5d 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b  nt]==wc[0] && z[
5f80: 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e  cnt+1]==0;.  *pn
5f90: 50 61 74 74 65 72 6e 20 3d 20 63 6e 74 3b 0a 20  Pattern = cnt;. 
5fa0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
5fb0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
5fc0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
5fd0: 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  TION */...#ifnde
5fe0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
5ff0: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
6000: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
6010: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
6020: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
6030: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
6040: 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20     column MATCH 
6050: 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  expr.**.** If it
6060: 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20   is then return 
6070: 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72  TRUE.  If not, r
6080: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a  eturn FALSE..*/.
6090: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74  static int isMat
60a0: 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78  chOfColumn(.  Ex
60b0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f  pr *pExpr      /
60c0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
60d0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45  ession */.){.  E
60e0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
60f0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
6100: 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  !=TK_FUNCTION ){
6110: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6120: 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e   }.  if( pExpr->
6130: 74 6f 6b 65 6e 2e 6e 21 3d 35 20 7c 7c 0a 20 20  token.n!=5 ||.  
6140: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 4e       sqlite3StrN
6150: 49 43 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72  ICmp((const char
6160: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
6170: 2c 22 6d 61 74 63 68 22 2c 35 29 21 3d 30 20 29  ,"match",5)!=0 )
6180: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6190: 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45    }.  pList = pE
61a0: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66  xpr->pList;.  if
61b0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ( pList->nExpr!=
61c0: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
61d0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
61e0: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e  st->a[1].pExpr->
61f0: 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20  op != TK_COLUMN 
6200: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
6220: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
6230: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6240: 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
6250: 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70  If the pBase exp
6260: 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
6270: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
6280: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a  USING clause of.
6290: 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20  ** a join, then 
62a0: 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70  transfer the app
62b0: 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67  ropriate marking
62c0: 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65  s over to derive
62d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
62e0: 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61  d transferJoinMa
62f0: 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65  rkings(Expr *pDe
6300: 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61  rived, Expr *pBa
6310: 73 65 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d  se){.  pDerived-
6320: 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d  >flags |= pBase-
6330: 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d  >flags & EP_From
6340: 4a 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64  Join;.  pDerived
6350: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
6360: 65 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68  e = pBase->iRigh
6370: 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23  tJoinTable;.}..#
6380: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6390: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
63a0: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
63b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
63c0: 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a  _SUBQUERY)./*.**
63d0: 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20   Analyze a term 
63e0: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
63f0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d   two or more OR-
6400: 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62  connected.** sub
6410: 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a  terms.  So in:.*
6420: 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45  *.**     ... WHE
6430: 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62  RE  (a=5) AND (b
6440: 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31  =7 OR c=9 OR d=1
6450: 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a  3) AND (d=13).**
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6470: 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e            ^^^^^^
6480: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a  ^^^^^^^^^^^^^^.*
6490: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
64a0: 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73  e analyzes terms
64b0: 20 73 75 63 68 20 61 73 20 74 68 65 20 6d 69 64   such as the mid
64c0: 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20  dle term in the 
64d0: 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a  above example..*
64e0: 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20  * A WhereOrTerm 
64f0: 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74  object is comput
6500: 65 64 20 61 6e 64 20 61 74 74 61 63 68 65 64 20  ed and attached 
6510: 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65  to the term unde
6520: 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72  r.** analysis, r
6530: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
6540: 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20   outcome of the 
6550: 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65  analysis.  Hence
6560: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72  :.**.**     Wher
6570: 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20  eTerm.wtFlags   
6580: 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a  |=  TERM_ORINFO.
6590: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
65a0: 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61  .u.pOrInfo  =  a
65b0: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
65c0: 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72 54 65  ocated WhereOrTe
65d0: 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20  rm object.**.** 
65e0: 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  The term being a
65f0: 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76  nalyzed must hav
6600: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66  e two or more of
6610: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75   OR-connected su
6620: 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e  bterms..** A sin
6630: 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68  gle subterm migh
6640: 74 20 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e  t be a set of AN
6650: 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d  D-connected sub-
6660: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61  subterms..** Exa
6670: 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75  mples of terms u
6680: 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a  nder analysis:.*
6690: 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20  *.**     (A)    
66a0: 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31   t1.x=t2.y OR t1
66b0: 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d  .x=t2.z OR t1.y=
66c0: 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b  15 OR t1.z=t3.a+
66d0: 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20  5.**     (B)    
66e0: 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72   x=expr1 OR expr
66f0: 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a  2=x OR x=expr3.*
6700: 2a 20 20 20 20 20 28 43 29 20 20 20 20 20 74 31  *     (C)     t1
6710: 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78  .x=t2.y OR (t1.x
6720: 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31  =t2.z AND t1.y=1
6730: 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20  5).**     (D)   
6740: 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e    x=expr1 OR (y>
6750: 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20  11 AND y<22 AND 
6760: 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27  z LIKE '*hello*'
6770: 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20  ).**     (E)    
6780: 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d   (p.a=1 AND q.b=
6790: 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20  2 AND r.c=3) OR 
67a0: 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35  (p.x=4 AND q.y=5
67b0: 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a   AND r.z=6).**.*
67c0: 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20  * CASE 1:.**.** 
67d0: 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20  If all subterms 
67e0: 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  are of the form 
67f0: 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d  T.C=expr for som
6800: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
6810: 6f 66 20 43 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  of C.** a single
6820: 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f   table T (as sho
6830: 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20  wn in example B 
6840: 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61  above) then crea
6850: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
6860: 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73  .** term that is
6870: 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49   an equivalent I
6880: 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  N expression.  I
6890: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
68a0: 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65  f the term.** be
68b0: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a  ing analyzed is:
68c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20  .**.**      x = 
68d0: 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32  expr1  OR  expr2
68e0: 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78   = x  OR  x = ex
68f0: 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63  pr3.**.** then c
6900: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
6910: 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68  ual term like th
6920: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
6930: 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32   IN (expr1,expr2
6940: 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41  ,expr3).**.** CA
6950: 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 2:.**.** If a
6960: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
6970: 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20 73  indexable by a s
6980: 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74  ingle table T, t
6990: 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20  hen set.**.**   
69a0: 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65    WhereTerm.eOpe
69b0: 72 61 74 6f 72 20 20 20 20 20 20 20 20 20 20 20  rator           
69c0: 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20     =  WO_OR.**  
69d0: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70     WhereTerm.u.p
69e0: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
69f0: 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f  e  |=  the curso
6a00: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62  r number for tab
6a10: 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62  le T.**.** A sub
6a20: 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62  term is "indexab
6a30: 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f 66 20  le" if it is of 
6a40: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43  the form.** "T.C
6a50: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68   <op> <expr>" wh
6a60: 65 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c  ere C is any col
6a70: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61  umn of table T a
6a80: 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f  nd .** <op> is o
6a90: 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20  ne of "=", "<", 
6aa0: 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c  "<=", ">", ">=",
6ab0: 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22   "IS NULL", or "
6ac0: 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72  IN"..** A subter
6ad0: 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61  m is also indexa
6ae0: 62 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e 20  ble if it is an 
6af0: 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  AND of two or mo
6b00: 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d  re.** subsubterm
6b10: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  s at least one o
6b20: 66 20 77 68 69 63 68 20 69 73 20 69 6e 64 65 78  f which is index
6b30: 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65  able.  Indexable
6b40: 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d   AND .** subterm
6b50: 73 20 68 61 76 65 20 74 68 65 69 72 20 65 4f 70  s have their eOp
6b60: 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f  erator set to WO
6b70: 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61  _AND and they ha
6b80: 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f  ve.** u.pAndInfo
6b90: 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69   set to a dynami
6ba0: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
6bb0: 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a  WhereAndTerm obj
6bc0: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20  ect..**.** From 
6bd0: 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66  another point of
6be0: 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c   view, "indexabl
6bf0: 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  e" means that th
6c00: 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a  e subterm could.
6c10: 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62  ** potentially b
6c20: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
6c30: 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f  ndex if an appro
6c40: 70 72 69 61 74 65 20 69 6e 64 65 78 20 65 78 69  priate index exi
6c50: 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61  sts..** This ana
6c60: 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63  lysis does not c
6c70: 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65 72 20  onsider whether 
6c80: 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78  or not the index
6c90: 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a   exists; that.**
6ca0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   is something th
6cb0: 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 72 6f  e bestIndex() ro
6cc0: 75 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72  utine will deter
6cd0: 6d 69 6e 65 2e 20 20 54 68 69 73 20 61 6e 61 6c  mine.  This anal
6ce0: 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f  ysis.** only loo
6cf0: 6b 73 20 61 74 20 77 68 65 74 68 65 72 20 73 75  ks at whether su
6d00: 62 74 65 72 6d 73 20 61 70 70 72 6f 70 72 69 61  bterms appropria
6d10: 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  te for indexing 
6d20: 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  exist..**.** All
6d30: 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f   examples A thro
6d40: 75 67 68 20 45 20 61 62 6f 76 65 20 61 6c 6c 20  ugh E above all 
6d50: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
6d60: 20 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a   But if a term.*
6d70: 2a 20 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65  * also statisfie
6d80: 73 20 63 61 73 65 20 31 20 28 73 75 63 68 20 61  s case 1 (such a
6d90: 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61  s B) we know tha
6da0: 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  t the optimizer 
6db0: 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70  will.** always p
6dc0: 72 65 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f  refer case 1, so
6dd0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 77 65   in that case we
6de0: 20 70 72 65 74 65 6e 64 20 74 68 61 74 20 63 61   pretend that ca
6df0: 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73  se 2 is not.** s
6e00: 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  atisfied..**.** 
6e10: 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  It might be the 
6e20: 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70  case that multip
6e30: 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e  le tables are in
6e40: 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78  dexable.  For ex
6e50: 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62  ample,.** (E) ab
6e60: 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ove is indexable
6e70: 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c   on tables P, Q,
6e80: 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65   and R..**.** Te
6e90: 72 6d 73 20 74 68 61 74 20 73 61 74 69 73 66 79  rms that satisfy
6ea0: 20 63 61 73 65 20 32 20 61 72 65 20 63 61 6e 64   case 2 are cand
6eb0: 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75  idates for looku
6ec0: 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65  p by using.** se
6ed0: 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 20 74  parate indices t
6ee0: 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f  o find rowids fo
6ef0: 72 20 65 61 63 68 20 73 75 62 74 65 72 6d 20 61  r each subterm a
6f00: 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20  nd composing.** 
6f10: 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c  the union of all
6f20: 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20   rowids using a 
6f30: 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  RowSet object.  
6f40: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a  This is similar.
6f50: 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e  ** to "bitmap in
6f60: 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20  dices" in other 
6f70: 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73  database engines
6f80: 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53  ..**.** OTHERWIS
6f90: 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74  E:.**.** If neit
6fa0: 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63  her case 1 nor c
6fb0: 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65  ase 2 apply, the
6fc0: 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65  n leave the eOpe
6fd0: 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20  rator set to.** 
6fe0: 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d  zero.  This term
6ff0: 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66   is not useful f
7000: 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74  or search..*/.st
7010: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
7020: 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53  alyzeOrTerm(.  S
7030: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
7040: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
7050: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
7060: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
7070: 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  C,         /* th
7080: 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45  e complete WHERE
7090: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
70a0: 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20   idxTerm        
70b0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
70c0: 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74  of the OR-term t
70d0: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
70e0: 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
70f0: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
7100: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7110: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
7120: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
7130: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7150: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
7160: 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
7170: 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43  rm *pTerm = &pWC
7180: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20  ->a[idxTerm];   
7190: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20   /* The term to 
71a0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
71b0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
71c0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20  Term->pExpr;    
71d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
71e0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
71f0: 65 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72  e term */.  Wher
7200: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
7210: 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53  et = pWC->pMaskS
7220: 65 74 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73 65  et; /* Table use
7230: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20   masks */.  int 
7240: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7270: 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  ters */.  WhereC
7280: 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20  lause *pOrWc;   
7290: 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f      /* Breakup o
72a0: 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62  f pTerm into sub
72b0: 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65  terms */.  Where
72c0: 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20  Term *pOrTerm;  
72d0: 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65       /* A Sub-te
72e0: 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f  rm within the pO
72f0: 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72  rWc */.  WhereOr
7300: 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20  Info *pOrInfo;  
7310: 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c     /* Additional
7320: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73   information ass
7330: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 65  ociated with pTe
7340: 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  rm */.  Bitmask 
7350: 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20  chngToIN;       
7360: 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
7370: 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63   might satisfy c
7380: 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61  ase 1 */.  Bitma
7390: 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20  sk indexable;   
73a0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
73b0: 68 61 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c  hat are indexabl
73c0: 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63 61  e, satisfying ca
73d0: 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  se 2 */..  /*.  
73e0: 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20  ** Break the OR 
73f0: 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20  clause into its 
7400: 73 65 70 61 72 61 74 65 20 73 75 62 74 65 72 6d  separate subterm
7410: 73 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d 73  s.  The subterms
7420: 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64   are.  ** stored
7430: 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73   in a WhereClaus
7440: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
7450: 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68  aining within th
7460: 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20  e WhereOrInfo.  
7470: 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
7480: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
7490: 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c  e original OR cl
74a0: 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a  ause term..  */.
74b0: 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
74c0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
74d0: 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f  M_DYNAMIC|TERM_O
74e0: 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e  RINFO|TERM_ANDIN
74f0: 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  FO))==0 );.  ass
7500: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
7510: 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d  TK_OR );.  pTerm
7520: 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f  ->u.pOrInfo = pO
7530: 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  rInfo = sqlite3D
7540: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
7550: 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29  sizeof(*pOrInfo)
7560: 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f  );.  if( pOrInfo
7570: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7580: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
7590: 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20  = TERM_ORINFO;. 
75a0: 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66   pOrWc = &pOrInf
75b0: 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c  o->wc;.  whereCl
75c0: 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20  auseInit(pOrWc, 
75d0: 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61  pWC->pParse, pMa
75e0: 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 53  skSet);.  whereS
75f0: 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70  plit(pOrWc, pExp
7600: 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70  r, TK_OR);.  exp
7610: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63  rAnalyzeAll(pSrc
7620: 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20  , pOrWc);.  if( 
7630: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7640: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
7650: 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72  ert( pOrWc->nTer
7660: 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20  m>=2 );..  /*.  
7670: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73  ** Compute the s
7680: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
7690: 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20  t might satisfy 
76a0: 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20  cases 1 or 2..  
76b0: 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d  */.  indexable =
76c0: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69   chngToIN = ~(Bi
76d0: 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
76e0: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
76f0: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
7700: 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78  a; i>=0 && index
7710: 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  able; i--, pOrTe
7720: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
7730: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
7740: 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d  or & WO_SINGLE)=
7750: 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
7760: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
7770: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
7780: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
7790: 61 74 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ator==0 );.     
77a0: 20 61 73 73 65 72 74 28 20 28 70 4f 72 54 65 72   assert( (pOrTer
77b0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
77c0: 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f  RM_ANDINFO|TERM_
77d0: 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20  ORINFO))==0 );. 
77e0: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20       chngToIN = 
77f0: 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66  0;.      pAndInf
7800: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
7810: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
7820: 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20  f(*pAndInfo));. 
7830: 20 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66       if( pAndInf
7840: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  o ){.        Whe
7850: 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43  reClause *pAndWC
7860: 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  ;.        WhereT
7870: 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20  erm *pAndTerm;. 
7880: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
7890: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
78a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  = 0;.        pOr
78b0: 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
78c0: 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20   = pAndInfo;.   
78d0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
78e0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e  Flags |= TERM_AN
78f0: 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70  DINFO;.        p
7900: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
7910: 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20  r = WO_AND;.    
7920: 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41      pAndWC = &pA
7930: 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
7940: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49      whereClauseI
7950: 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d  nit(pAndWC, pWC-
7960: 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65  >pParse, pMaskSe
7970: 74 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  t);.        wher
7980: 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20 70  eSplit(pAndWC, p
7990: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54  OrTerm->pExpr, T
79a0: 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20 20  K_AND);.        
79b0: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
79c0: 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20  Src, pAndWC);.  
79d0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
79e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
79f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
7a00: 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41  j=0, pAndTerm=pA
7a10: 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57  ndWC->a; j<pAndW
7a20: 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
7a30: 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  AndTerm++){.    
7a40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41        assert( pA
7a50: 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b  ndTerm->pExpr );
7a60: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
7a70: 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72  llowedOp(pAndTer
7a80: 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b  m->pExpr->op) ){
7a90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c  .            b |
7aa0: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
7ab0: 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65  et, pAndTerm->le
7ac0: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
7ad0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
7ae0: 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62  .        indexab
7af0: 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  le &= b;.      }
7b00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
7b10: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
7b20: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b  & TERM_COPIED ){
7b30: 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74  .      /* Skip t
7b40: 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77  his term for now
7b50: 2e 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74  .  We revisit it
7b60: 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73   when we process
7b70: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f   the.      ** co
7b80: 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d  rresponding TERM
7b90: 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f  _VIRTUAL term */
7ba0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7bb0: 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20    Bitmask b;.   
7bc0: 20 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 70     b = getMask(p
7bd0: 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d  MaskSet, pOrTerm
7be0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
7bf0: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
7c00: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
7c10: 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20  _VIRTUAL ){.    
7c20: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
7c30: 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e  Other = &pOrWc->
7c40: 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65  a[pOrTerm->iPare
7c50: 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c  nt];.        b |
7c60: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
7c70: 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74  et, pOther->left
7c80: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
7c90: 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65  .      indexable
7ca0: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28   &= b;.      if(
7cb0: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
7cc0: 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20  tor!=WO_EQ ){.  
7cd0: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
7ce0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
7cf0: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
7d00: 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  N &= b;.      }.
7d10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
7d20: 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20    ** Record the 
7d30: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
7d40: 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  at satisfy case 
7d50: 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68  2.  The set migh
7d60: 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e  t be.  ** empty.
7d70: 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d  .  */.  pOrInfo-
7d80: 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64  >indexable = ind
7d90: 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d  exable;.  pTerm-
7da0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64  >eOperator = ind
7db0: 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20  exable==0 ? 0 : 
7dc0: 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  WO_OR;..  /*.  *
7dd0: 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73  * chngToIN holds
7de0: 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73   a set of tables
7df0: 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61   that *might* sa
7e00: 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 42  tisfy case 1.  B
7e10: 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20  ut.  ** we have 
7e20: 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74  to do some addit
7e30: 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74  ional checking t
7e40: 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31 20  o see if case 1 
7e50: 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73  really.  ** is s
7e60: 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2f 0a 20  atisfied..  */. 
7e70: 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b   if( chngToIN ){
7e80: 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e  .    int okToChn
7e90: 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f  gToIN = 0;     /
7ea0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f  * True if the co
7eb0: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69  nversion to IN i
7ec0: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69  s valid */.    i
7ed0: 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  nt iColumn = -1;
7ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
7ef0: 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20  mn index on lhs 
7f00: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
7f10: 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f  /.    int iCurso
7f20: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7f30: 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20  /* Table cursor 
7f40: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65  common to all te
7f50: 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  rms */.    int j
7f60: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
7f70: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
7f80: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  nter */..    /* 
7f90: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62  Search for a tab
7fa0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68  le and column th
7fb0: 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e  at appears on on
7fc0: 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
7fd0: 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68    ** other of th
7fe0: 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e  e == operator in
7ff0: 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20   every subterm. 
8000: 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   That table and 
8010: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69  column.    ** wi
8020: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
8030: 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  n iCursor and iC
8040: 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69  olumn.  There mi
8050: 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20  ght not be any. 
8060: 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65     ** such table
8070: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65   and column.  Se
8080: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  t okToChngToIN i
8090: 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  f an appropriate
80a0: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e   table.    ** an
80b0: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e  d column is foun
80c0: 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f  d but leave okTo
80d0: 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69  ChngToIN false i
80e0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20  f not found..   
80f0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
8100: 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e   j<2 && !okToChn
8110: 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  gToIN; j++){.   
8120: 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72     pOrTerm = pOr
8130: 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  Wc->a;.      for
8140: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
8150: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
8160: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
8170: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
8180: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
8190: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _EQ );.        p
81a0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
81b0: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
81c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
81d0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
81e0: 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  =iColumn ) conti
81f0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
8200: 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74   (chngToIN & get
8210: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
8220: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
8230: 6f 72 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  or))==0 ) contin
8240: 75 65 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c  ue;.        iCol
8250: 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75  umn = pOrTerm->u
8260: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
8270: 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70       iCursor = p
8280: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
8290: 6f 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  or;.        brea
82a0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
82b0: 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
82c0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
82d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
82e0: 72 74 28 20 28 63 68 6e 67 54 6f 49 4e 26 28 63  rt( (chngToIN&(c
82f0: 68 6e 67 54 6f 49 4e 2d 31 29 29 3d 3d 30 20 29  hngToIN-1))==0 )
8300: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
8310: 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d  ( chngToIN==getM
8320: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 43  ask(pMaskSet, iC
8330: 6f 6c 75 6d 6e 29 20 29 3b 0a 20 20 20 20 20 20  olumn) );.      
8340: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8350: 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54  .      okToChngT
8360: 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  oIN = 1;.      f
8370: 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54  or(; i>=0 && okT
8380: 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20  oChngToIN; i--, 
8390: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
83a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
83b0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
83c0: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
83d0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
83e0: 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f  ftCursor!=iCurso
83f0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
8400: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8410: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
8420: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
8430: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
8440: 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  tColumn!=iColumn
8450: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b   ){.          ok
8460: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
8470: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8480: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66           int aff
8490: 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a  Left, affRight;.
84a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
84b0: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
84c0: 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f  ide is also a co
84d0: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61  lumn, then the a
84e0: 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20  ffinities.      
84f0: 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72      ** of both r
8500: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
8510: 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68  des must be such
8520: 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20   that no type.  
8530: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65          ** conve
8540: 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  rsions are requi
8550: 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74  red on the right
8560: 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39  .  (Ticket #2249
8570: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ).          */. 
8580: 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68           affRigh
8590: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
85a0: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
85b0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
85c0: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65  .          affLe
85d0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
85e0: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
85f0: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
8600: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
8610: 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66  ffRight!=0 && af
8620: 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20  fRight!=affLeft 
8630: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
8640: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
8650: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
8660: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
8670: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
8680: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
8690: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
86a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
86b0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
86c0: 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e  s point, okToChn
86d0: 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66  gToIN is true if
86e0: 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20   original pTerm 
86f0: 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a  satisfies.    **
8700: 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61   case 1.  In tha
8710: 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63  t case, construc
8720: 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  t a new virtual 
8730: 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20  term that is .  
8740: 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65    ** pTerm conve
8750: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20  rted into an IN 
8760: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
8770: 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e  .    if( okToChn
8780: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  gToIN ){.      E
8790: 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20  xpr *pDup;      
87a0: 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73        /* A trans
87b0: 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65  ient duplicate e
87c0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
87d0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
87e0: 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  st = 0;   /* The
87f0: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
8800: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
8810: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30   Expr *pLeft = 0
8820: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;       /* The L
8830: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
8840: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
8850: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
8860: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
8870: 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f  plete IN operato
8880: 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  r */..      for(
8890: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
88a0: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
88b0: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  >a; i>=0; i--, p
88c0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
88d0: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
88e0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
88f0: 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74  OR_OK)==0 ) cont
8900: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
8910: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
8920: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
8930: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
8940: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t( pOrTerm->left
8950: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
8960: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
8970: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  t( pOrTerm->u.le
8980: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
8990: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75  n );.        pDu
89a0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
89b0: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
89c0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
89d0: 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20          pList = 
89e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
89f0: 70 70 65 6e 64 28 70 57 43 2d 3e 70 50 61 72 73  ppend(pWC->pPars
8a00: 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 2c 20  e, pList, pDup, 
8a10: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  0);.        pLef
8a20: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
8a30: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
8a40: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
8a50: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
8a60: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
8a70: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
8a80: 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ft);.      pNew 
8a90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
8aa0: 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30  , TK_IN, pDup, 0
8ab0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
8ac0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
8ad0: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
8ae0: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
8af0: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70  Markings(pNew, p
8b00: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Expr);.        p
8b10: 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69  New->pList = pLi
8b20: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e  st;.        idxN
8b30: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
8b40: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
8b50: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
8b60: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
8b70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8b80: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
8b90: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
8ba0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
8bb0: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ew);.        pTe
8bc0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
8bd0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
8be0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
8bf0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
8c00: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
8c10: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
8c20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8c30: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8c40: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
8c50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8c60: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8c70: 72 20 3d 20 30 3b 20 20 2f 2a 20 63 61 73 65 20  r = 0;  /* case 
8c80: 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20  1 trumps case 2 
8c90: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  */.    }.  }.}.#
8ca0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
8cb0: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
8cc0: 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45  ATION && !SQLITE
8cd0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
8ce0: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  /.../*.** The in
8cf0: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
8d00: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
8d10: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
8d20: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
8d30: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
8d40: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
8d50: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
8d60: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
8d70: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
8d80: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
8d90: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
8da0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
8db0: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
8dc0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
8dd0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
8de0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
8df0: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
8e00: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
8e10: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
8e20: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
8e30: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
8e40: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
8e50: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
8e60: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
8e70: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
8e80: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
8e90: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
8ea0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
8eb0: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
8ec0: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
8ed0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
8ee0: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
8ef0: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
8f00: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
8f10: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
8f20: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
8f30: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
8f40: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
8f50: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
8f60: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
8f70: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
8f80: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
8f90: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
8fa0: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
8fb0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
8fc0: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
8fd0: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
8fe0: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
8ff0: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
9000: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
9010: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
9020: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
9030: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
9040: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
9050: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
9060: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
9070: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
9080: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
9090: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
90a0: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
90b0: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
90c0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
90d0: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
90e0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
90f0: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
9100: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
9110: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
9120: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
9130: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
9140: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
9150: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
9160: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
9170: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
9180: 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  *pMaskSet;      
9190: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61      /* Set of ta
91a0: 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20  ble index masks 
91b0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
91c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
91d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
91e0: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
91f0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d  alyzed */.  Bitm
9200: 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20  ask prereqLeft; 
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9220: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
9230: 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66   the pExpr->pLef
9240: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  t */.  Bitmask p
9250: 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20  rereqAll;       
9260: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
9270: 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70  quesites of pExp
9280: 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  r */.  Bitmask e
9290: 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 0a 20  xtraRight = 0;. 
92a0: 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 0a 20   int nPattern;. 
92b0: 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b   int isComplete;
92c0: 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b 0a 20  .  int noCase;. 
92d0: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f    /* Top-level o
9300: 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d  perator.  pExpr-
9310: 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  >op */.  Parse *
9320: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
9330: 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 50 61 72  arse;     /* Par
9340: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9350: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9360: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
9370: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
9380: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
9390: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
93a0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
93b0: 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  rn;.  }.  pTerm 
93c0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
93d0: 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  m];.  pMaskSet =
93e0: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a   pWC->pMaskSet;.
93f0: 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d    pExpr = pTerm-
9400: 3e 70 45 78 70 72 3b 0a 20 20 70 72 65 72 65 71  >pExpr;.  prereq
9410: 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65  Left = exprTable
9420: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
9430: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
9440: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
9450: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
9460: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9470: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
9480: 20 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70   );.    pTerm->p
9490: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
94a0: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
94b0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
94c0: 3e 70 4c 69 73 74 29 0a 20 20 20 20 20 20 20 20  >pList).        
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 20 20 7c 20 65 78 70 72 53 65 6c 65 63 74 54 61    | exprSelectTa
94f0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
9500: 74 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  t, pExpr->pSelec
9510: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
9520: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
9530: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
9540: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
9550: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
9560: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
9570: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
9580: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
9590: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
95a0: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
95b0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
95c0: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
95d0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
95e0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
95f0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
9600: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
9610: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
9620: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
9630: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
9640: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
9650: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
9660: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
9670: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
9680: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96a0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
96b0: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
96c0: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
96d0: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
96e0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
96f0: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
9700: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
9710: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
9720: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
9730: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
9740: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
9750: 65 64 4f 70 28 6f 70 29 20 26 26 20 28 70 54 65  edOp(op) && (pTe
9760: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
9770: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
9780: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c   ){.    Expr *pL
9790: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
97a0: 66 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  ft;.    Expr *pR
97b0: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
97c0: 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  ight;.    if( pL
97d0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
97e0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
97f0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
9800: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
9810: 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65       pTerm->u.le
9820: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
9830: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
9840: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
9850: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
9860: 28 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  (op);.    }.    
9870: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52  if( pRight && pR
9880: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ight->op==TK_COL
9890: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65  UMN ){.      Whe
98a0: 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20  reTerm *pNew;.  
98b0: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a      Expr *pDup;.
98c0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
98d0: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
98e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
98f0: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
9900: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
9910: 44 75 70 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  Dup(db, pExpr);.
9920: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
9930: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
9940: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9950: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
9960: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
9970: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
9980: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
9990: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
99a0: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
99b0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
99c0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
99d0: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
99e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
99f0: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
9a00: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
9a10: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
9a20: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
9a30: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
9a40: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
9a50: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
9a60: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
9a70: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
9a80: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
9a90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9aa0: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45         pDup = pE
9ab0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  xpr;.        pNe
9ac0: 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  w = pTerm;.     
9ad0: 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d   }.      exprCom
9ae0: 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75  mute(pParse, pDu
9af0: 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20  p);.      pLeft 
9b00: 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20  = pDup->pLeft;. 
9b10: 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43       pNew->leftC
9b20: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
9b30: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65  Table;.      pNe
9b40: 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  w->u.leftColumn 
9b50: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
9b60: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72  ;.      pNew->pr
9b70: 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
9b80: 65 71 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e  eqLeft;.      pN
9b90: 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  ew->prereqAll = 
9ba0: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20  prereqAll;.     
9bb0: 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72   pNew->eOperator
9bc0: 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28   = operatorMask(
9bd0: 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d  pDup->op);.    }
9be0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
9bf0: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
9c00: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  N_OPTIMIZATION. 
9c10: 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73   /* If a term is
9c20: 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65   the BETWEEN ope
9c30: 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77  rator, create tw
9c40: 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  o new virtual te
9c50: 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65  rms.  ** that de
9c60: 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74  fine the range t
9c70: 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20  hat the BETWEEN 
9c80: 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72  implements.  For
9c90: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
9ca0: 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45   **      a BETWE
9cb0: 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a  EN b AND c.  **.
9cc0: 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65    ** is converte
9cd0: 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
9ce0: 2a 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45  *      (a BETWEE
9cf0: 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28  N b AND c) AND (
9d00: 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29  a>=b) AND (a<=c)
9d10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74  .  **.  ** The t
9d20: 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65  wo new terms are
9d30: 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20   added onto the 
9d40: 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65  end of the Where
9d50: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20  Clause object.. 
9d60: 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d   ** The new term
9d70: 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20  s are "dynamic" 
9d80: 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e  and are children
9d90: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
9da0: 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65   BETWEEN.  ** te
9db0: 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  rm.  That means 
9dc0: 74 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57  that if the BETW
9dd0: 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65  EEN term is code
9de0: 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  d, the children 
9df0: 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64  are.  ** skipped
9e00: 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68  .  Or, if the ch
9e10: 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73  ildren are satis
9e20: 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  fied by an index
9e30: 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  , the original. 
9e40: 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d   ** BETWEEN term
9e50: 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   is skipped..  *
9e60: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
9e70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45  pr->op==TK_BETWE
9e80: 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54  EN && pWC->op==T
9e90: 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70  K_AND ){.    Exp
9ea0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
9eb0: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
9ec0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74   int i;.    stat
9ed0: 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b  ic const u8 ops[
9ee0: 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c  ] = {TK_GE, TK_L
9ef0: 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  E};.    assert( 
9f00: 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pList!=0 );.    
9f10: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
9f20: 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66  Expr==2 );.    f
9f30: 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
9f40: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
9f50: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69  NewExpr;.      i
9f60: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
9f70: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
9f80: 74 65 33 45 78 70 72 28 64 62 2c 20 6f 70 73 5b  te3Expr(db, ops[
9f90: 69 5d 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  i], sqlite3ExprD
9fa0: 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  up(db, pExpr->pL
9fb0: 65 66 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20  eft),.          
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
9fe0: 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  p(db, pList->a[i
9ff0: 5d 2e 70 45 78 70 72 29 2c 20 30 29 3b 0a 20 20  ].pExpr), 0);.  
a000: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
a010: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
a020: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
a030: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
a040: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
a050: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
a060: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
a070: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
a080: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
a090: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
a0a0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
a0b0: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
a0c0: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
a0d0: 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  erm;.    }.    p
a0e0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32  Term->nChild = 2
a0f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
a100: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57  SQLITE_OMIT_BETW
a110: 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  EEN_OPTIMIZATION
a120: 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
a130: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  d(SQLITE_OMIT_OR
a140: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26  _OPTIMIZATION) &
a150: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
a160: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
a170: 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20  .  /* Analyze a 
a180: 74 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d  term that is com
a190: 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20  posed of two or 
a1a0: 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f  more subterms co
a1b0: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20  nnected by.  ** 
a1c0: 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a  an OR operator..
a1d0: 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
a1e0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
a1f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a200: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
a210: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
a220: 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70  zeOrTerm(pSrc, p
a230: 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20  WC, idxTerm);.  
a240: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a250: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
a260: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
a270: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a280: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
a290: 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74  N.  /* Add const
a2a0: 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65  raints to reduce
a2b0: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
a2c0: 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47  e on a LIKE or G
a2d0: 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  LOB.  ** operato
a2e0: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c  r..  **.  ** A l
a2f0: 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74  ike pattern of t
a300: 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20  he form "x LIKE 
a310: 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67  'abc%'" is chang
a320: 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69  ed into constrai
a330: 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nts.  **.  **   
a340: 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20         x>='abc' 
a350: 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20  AND x<'abd' AND 
a360: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20  x LIKE 'abc%'.  
a370: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74  **.  ** The last
a380: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
a390: 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69  e prefix "abc" i
a3a0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f  s incremented to
a3b0: 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74   form the.  ** t
a3c0: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
a3d0: 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f  tion "abd"..  */
a3e0: 0a 20 20 69 66 28 20 69 73 4c 69 6b 65 4f 72 47  .  if( isLikeOrG
a3f0: 6c 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70  lob(pParse, pExp
a400: 72 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69  r, &nPattern, &i
a410: 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61  sComplete, &noCa
a420: 73 65 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  se).         && 
a430: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
a440: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
a450: 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  ft, *pRight;.   
a460: 20 45 78 70 72 20 2a 70 53 74 72 31 2c 20 2a 70   Expr *pStr1, *p
a470: 53 74 72 32 3b 0a 20 20 20 20 45 78 70 72 20 2a  Str2;.    Expr *
a480: 70 4e 65 77 45 78 70 72 31 2c 20 2a 70 4e 65 77  pNewExpr1, *pNew
a490: 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  Expr2;.    int i
a4a0: 64 78 4e 65 77 31 2c 20 69 64 78 4e 65 77 32 3b  dxNew1, idxNew2;
a4b0: 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45  ..    pLeft = pE
a4c0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
a4d0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 69 67  .pExpr;.    pRig
a4e0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
a4f0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
a500: 20 20 20 70 53 74 72 31 20 3d 20 73 71 6c 69 74     pStr1 = sqlit
a510: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
a520: 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c  TK_STRING, 0, 0,
a530: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74   0);.    if( pSt
a540: 72 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r1 ){.      sqli
a550: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c  te3TokenCopy(db,
a560: 20 26 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20   &pStr1->token, 
a570: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b  &pRight->token);
a580: 0a 20 20 20 20 20 20 70 53 74 72 31 2d 3e 74 6f  .      pStr1->to
a590: 6b 65 6e 2e 6e 20 3d 20 6e 50 61 74 74 65 72 6e  ken.n = nPattern
a5a0: 3b 0a 20 20 20 20 20 20 70 53 74 72 31 2d 3e 66  ;.      pStr1->f
a5b0: 6c 61 67 73 20 3d 20 45 50 5f 44 65 71 75 6f 74  lags = EP_Dequot
a5c0: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ed;.    }.    pS
a5d0: 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tr2 = sqlite3Exp
a5e0: 72 44 75 70 28 64 62 2c 20 70 53 74 72 31 29 3b  rDup(db, pStr1);
a5f0: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
a600: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
a610: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 0a 20      u8 c, *pC;. 
a620: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74       assert( pSt
a630: 72 32 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 3b  r2->token.dyn );
a640: 0a 20 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a  .      pC = (u8*
a650: 29 26 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 7a  )&pStr2->token.z
a660: 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3b 0a 20 20  [nPattern-1];.  
a670: 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20      c = *pC;.   
a680: 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b     if( noCase ){
a690: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
a6a0: 27 40 27 20 29 20 69 73 43 6f 6d 70 6c 65 74 65  '@' ) isComplete
a6b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 20   = 0;.        c 
a6c0: 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  = sqlite3UpperTo
a6d0: 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20  Lower[c];.      
a6e0: 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20  }.      *pC = c 
a6f0: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  + 1;.    }.    p
a700: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
a710: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
a720: 54 4b 5f 47 45 2c 20 73 71 6c 69 74 65 33 45 78  TK_GE, sqlite3Ex
a730: 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 29 2c  prDup(db,pLeft),
a740: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
a750: 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43  idxNew1 = whereC
a760: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
a770: 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d   pNewExpr1, TERM
a780: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
a790: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
a7a0: 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30  case( idxNew1==0
a7b0: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
a7c0: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
a7d0: 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65  dxNew1);.    pNe
a7e0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
a7f0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
a800: 5f 4c 54 2c 20 73 71 6c 69 74 65 33 45 78 70 72  _LT, sqlite3Expr
a810: 44 75 70 28 64 62 2c 70 4c 65 66 74 29 2c 20 70  Dup(db,pLeft), p
a820: 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64  Str2, 0);.    id
a830: 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61  xNew2 = whereCla
a840: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
a850: 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56  NewExpr2, TERM_V
a860: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
a870: 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61  MIC);.    testca
a880: 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29  se( idxNew2==0 )
a890: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
a8a0: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
a8b0: 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d  New2);.    pTerm
a8c0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
a8d0: 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43  rm];.    if( isC
a8e0: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
a8f0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d   pWC->a[idxNew1]
a900: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
a910: 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  rm;.      pWC->a
a920: 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e  [idxNew2].iParen
a930: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
a940: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
a950: 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 2;.    }.  }.
a960: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
a970: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
a980: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
a990: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a9a0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
a9b0: 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48  * Add a WO_MATCH
a9c0: 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20   auxiliary term 
a9d0: 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  to the constrain
a9e0: 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a  t set if the.  *
a9f0: 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73  * current expres
aa00: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
aa10: 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54  orm:  column MAT
aa20: 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68  CH expr..  ** Th
aa30: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
aa40: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42  s used by the xB
aa50: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73  estIndex methods
aa60: 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c   of.  ** virtual
aa70: 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61   tables.  The na
aa80: 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d  tive query optim
aa90: 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74  izer does not at
aaa0: 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f  tempt.  ** to do
aab0: 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d   anything with M
aac0: 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ATCH functions..
aad0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74    */.  if( isMat
aae0: 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72  chOfColumn(pExpr
aaf0: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  ) ){.    int idx
ab00: 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  New;.    Expr *p
ab10: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20  Right, *pLeft;. 
ab20: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
ab30: 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d  ewTerm;.    Bitm
ab40: 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  ask prereqColumn
ab50: 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20  , prereqExpr;.. 
ab60: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
ab70: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
ab80: 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
ab90: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
aba0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
abb0: 70 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70  prereqExpr = exp
abc0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
abd0: 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  kSet, pRight);. 
abe0: 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20     prereqColumn 
abf0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
ac00: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74  (pMaskSet, pLeft
ac10: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72  );.    if( (prer
ac20: 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43  eqExpr & prereqC
ac30: 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  olumn)==0 ){.   
ac40: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
ac50: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  r;.      pNewExp
ac60: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  r = sqlite3Expr(
ac70: 64 62 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 30 2c  db, TK_MATCH, 0,
ac80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
ac90: 64 62 2c 20 70 52 69 67 68 74 29 2c 20 30 29 3b  db, pRight), 0);
aca0: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
acb0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
acc0: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
acd0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
ace0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
acf0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
ad00: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
ad10: 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d  pNewTerm = &pWC-
ad20: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
ad30: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
ad40: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
ad50: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
ad60: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
ad70: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
ad80: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
ad90: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
ada0: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
adb0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
adc0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
add0: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65  MATCH;.      pNe
ade0: 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  wTerm->iParent =
adf0: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
ae00: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
ae10: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
ae20: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
ae30: 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  1;.      pTerm->
ae40: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
ae50: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e  COPIED;.      pN
ae60: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  ewTerm->prereqAl
ae70: 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  l = pTerm->prere
ae80: 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  qAll;.    }.  }.
ae90: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
aea0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
aeb0: 4c 45 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76  LE */..  /* Prev
aec0: 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65  ent ON clause te
aed0: 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  rms of a LEFT JO
aee0: 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73  IN from being us
aef0: 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a  ed to drive.  **
af00: 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61   an index for ta
af10: 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
af20: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
af30: 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  */.  pTerm->prer
af40: 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61  eqRight |= extra
af50: 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Right;.}../*.** 
af60: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
af70: 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
af80: 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73 74 2d 3e  sions in pList->
af90: 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20 63 6f 6e  a[iFirst...] con
afa0: 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66 65 72 65  tain.** a refere
afb0: 6e 63 65 20 74 6f 20 61 6e 79 20 74 61 62 6c 65  nce to any table
afc0: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
afd0: 69 42 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  iBase table..*/.
afe0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 66 65 72  static int refer
aff0: 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73  encesOtherTables
b000: 28 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  (.  ExprList *pL
b010: 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ist,          /*
b020: 20 53 65 61 72 63 68 20 65 78 70 72 65 73 73 69   Search expressi
b030: 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69 73 74 20  ons in ths list 
b040: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
b050: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f  t *pMaskSet,   /
b060: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  * Mapping from t
b070: 61 62 6c 65 73 20 74 6f 20 62 69 74 6d 61 70 73  ables to bitmaps
b080: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
b090: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b0a0: 2f 2a 20 42 65 20 73 65 61 72 63 68 69 6e 67 20  /* Be searching 
b0b0: 77 69 74 68 20 74 68 65 20 69 46 69 72 73 74 2d  with the iFirst-
b0c0: 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  th expression */
b0d0: 0a 20 20 69 6e 74 20 69 42 61 73 65 20 20 20 20  .  int iBase    
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b0f0: 49 67 6e 6f 72 65 20 72 65 66 65 72 65 6e 63 65  Ignore reference
b100: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
b110: 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  */.){.  Bitmask 
b120: 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65 74 4d 61  allowed = ~getMa
b130: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 42 61  sk(pMaskSet, iBa
b140: 73 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 46  se);.  while( iF
b150: 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  irst<pList->nExp
b160: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 65 78  r ){.    if( (ex
b170: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
b180: 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  skSet, pList->a[
b190: 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78 70 72 29  iFirst++].pExpr)
b1a0: 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20 29 7b 0a  &allowed)!=0 ){.
b1b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
b1c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b1d0: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
b1e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63  This routine dec
b1f0: 69 64 65 73 20 69 66 20 70 49 64 78 20 63 61 6e  ides if pIdx can
b200: 20 62 65 20 75 73 65 64 20 74 6f 20 73 61 74 69   be used to sati
b210: 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
b220: 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 20 49 66 20  .** clause.  If 
b230: 69 74 20 63 61 6e 2c 20 69 74 20 72 65 74 75 72  it can, it retur
b240: 6e 73 20 31 2e 20 20 49 66 20 70 49 64 78 20 63  ns 1.  If pIdx c
b250: 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68  annot satisfy th
b260: 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  e.** ORDER BY cl
b270: 61 75 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  ause, this routi
b280: 6e 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  ne returns 0..**
b290: 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20  .** pOrderBy is 
b2a0: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
b2b0: 73 65 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54  se from a SELECT
b2c0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 54 61   statement.  pTa
b2d0: 62 20 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74  b is the.** left
b2e0: 2d 6d 6f 73 74 20 74 61 62 6c 65 20 69 6e 20 74  -most table in t
b2f0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
b300: 66 20 74 68 61 74 20 73 61 6d 65 20 53 45 4c 45  f that same SELE
b310: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
b320: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 68 61  .** the table ha
b330: 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  s a cursor numbe
b340: 72 20 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49  r of "base".  pI
b350: 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  dx is an index o
b360: 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45  n pTab..**.** nE
b370: 71 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62  qCol is the numb
b380: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
b390: 20 70 49 64 78 20 74 68 61 74 20 61 72 65 20 75   pIdx that are u
b3a0: 73 65 64 20 61 73 20 65 71 75 61 6c 69 74 79 0a  sed as equality.
b3b0: 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ** constraints. 
b3c0: 20 41 6e 79 20 6f 66 20 74 68 65 73 65 20 63 6f   Any of these co
b3d0: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20 6d 69 73  lumns may be mis
b3e0: 73 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 52  sing from the OR
b3f0: 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65  DER BY.** clause
b400: 20 61 6e 64 20 74 68 65 20 6d 61 74 63 68 20 63   and the match c
b410: 61 6e 20 73 74 69 6c 6c 20 62 65 20 61 20 73 75  an still be a su
b420: 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  ccess..**.** All
b430: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
b440: 44 45 52 20 42 59 20 74 68 61 74 20 6d 61 74 63  DER BY that matc
b450: 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e  h against the in
b460: 64 65 78 20 6d 75 73 74 20 62 65 20 65 69 74 68  dex must be eith
b470: 65 72 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45 53  er.** ASC or DES
b480: 43 2e 20 20 28 54 65 72 6d 73 20 6f 66 20 74 68  C.  (Terms of th
b490: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
b4a0: 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
b4b0: 66 20 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e  f a UNIQUE.** in
b4c0: 64 65 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  dex do not need 
b4d0: 74 6f 20 73 61 74 69 73 66 79 20 74 68 69 73 20  to satisfy this 
b4e0: 63 6f 6e 73 74 72 61 69 6e 74 2e 29 20 20 54 68  constraint.)  Th
b4f0: 65 20 2a 70 62 52 65 76 20 76 61 6c 75 65 20 69  e *pbRev value i
b500: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 31 20 69 66  s.** set to 1 if
b510: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
b520: 61 75 73 65 20 69 73 20 61 6c 6c 20 44 45 53 43  ause is all DESC
b530: 20 61 6e 64 20 69 74 20 69 73 20 73 65 74 20 74   and it is set t
b540: 6f 20 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52  o 0 if.** the OR
b550: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73  DER BY clause is
b560: 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61   all ASC..*/.sta
b570: 74 69 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e  tic int isSortin
b580: 67 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  gIndex(.  Parse 
b590: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
b5a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
b5b0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d  text */.  WhereM
b5c0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
b5d0: 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f  , /* Mapping fro
b5e0: 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e  m table cursor n
b5f0: 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 70  umbers to bitmap
b600: 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  s */.  Index *pI
b610: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx,            /
b620: 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 61  * The index we a
b630: 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20  re testing */.  
b640: 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20  int base,       
b650: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
b660: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
b670: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72   table to be sor
b680: 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
b690: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
b6a0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
b6b0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
b6c0: 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20   nEqCol,        
b6d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b6e0: 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
b6f0: 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69  with == constrai
b700: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nts */.  int *pb
b710: 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20  Rev             
b720: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20   /* Set to 1 if 
b730: 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43  ORDER BY is DESC
b740: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
b750: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
b760: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
b770: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
b780: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30  nt sortOrder = 0
b790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b7a0: 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61  * XOR of index a
b7b0: 6e 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74  nd ORDER BY sort
b7c0: 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20   direction */.  
b7d0: 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20  int nTerm;      
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
b800: 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
b810: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
b820: 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20  _item *pTerm;   
b830: 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68   /* A term of th
b840: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
b850: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
b860: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b870: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
b880: 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65  erBy!=0 );.  nTe
b890: 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  rm = pOrderBy->n
b8a0: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
b8b0: 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a  nTerm>0 );..  /*
b8c0: 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20   Match terms of 
b8d0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
b8e0: 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  use against colu
b8f0: 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  mns of.  ** the 
b900: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
b910: 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63   Note that indic
b920: 65 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43  es have pIdx->nC
b930: 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f  olumn regular co
b940: 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20  lumns plus.  ** 
b950: 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  one additional c
b960: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67  olumn containing
b970: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65   the rowid.  The
b980: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20   rowid column.  
b990: 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
b9a0: 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20  is also allowed 
b9b0: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
b9c0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
b9d0: 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ** clause..  */.
b9e0: 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
b9f0: 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  rm=pOrderBy->a; 
ba00: 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49  j<nTerm && i<=pI
ba10: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
ba20: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
ba30: 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  pr;       /* The
ba40: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
ba50: 68 65 20 4f 52 44 45 52 20 42 59 20 70 54 65 72  he ORDER BY pTer
ba60: 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  m */.    CollSeq
ba70: 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54   *pColl;    /* T
ba80: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
ba90: 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a  uence of pExpr *
baa0: 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f  /.    int termSo
bab0: 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74  rtOrder; /* Sort
bac0: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
bad0: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  term */.    int 
bae0: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f  iColumn;       /
baf0: 2a 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  * The i-th colum
bb00: 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
bb10: 20 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f   -1 for rowid */
bb20: 0a 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72  .    int iSortOr
bb30: 64 65 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72  der;    /* 1 for
bb40: 20 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43   DESC, 0 for ASC
bb50: 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64   on the i-th ind
bb60: 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63  ex term */.    c
bb70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
bb80: 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  ; /* Name of the
bb90: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
bba0: 6e 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64  nce for i-th ind
bbb0: 65 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20  ex term */..    
bbc0: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
bbd0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
bbe0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
bbf0: 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
bc00: 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20  ble!=base ){.   
bc10: 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73     /* Can not us
bc20: 65 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20  e an index sort 
bc30: 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74  on anything that
bc40: 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e   is not a column
bc50: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
bc60: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
bc70: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
bc80: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  use */.      bre
bc90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ak;.    }.    pC
bca0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
bcb0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
bcc0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28   pExpr);.    if(
bcd0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
bce0: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
bcf0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  ltColl;.    }.  
bd00: 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43    if( i<pIdx->nC
bd10: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69  olumn ){.      i
bd20: 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61  Column = pIdx->a
bd30: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
bd40: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
bd50: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  Idx->pTable->iPK
bd60: 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43  ey ){.        iC
bd70: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
bd80: 20 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f    }.      iSortO
bd90: 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f  rder = pIdx->aSo
bda0: 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
bdb0: 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e    zColl = pIdx->
bdc0: 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d  azColl[i];.    }
bdd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c  else{.      iCol
bde0: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
bdf0: 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a  iSortOrder = 0;.
be00: 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43        zColl = pC
be10: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
be20: 7d 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  }.    if( pExpr-
be30: 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  >iColumn!=iColum
be40: 6e 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  n || sqlite3StrI
be50: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
be60: 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
be70: 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74    /* Term j of t
be80: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
be90: 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  se does not matc
bea0: 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68  h column i of th
beb0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  e index */.     
bec0: 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b   if( i<nEqCol ){
bed0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
bee0: 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74  n index column t
bef0: 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
bf00: 65 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74  ed by == fails t
bf10: 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20  o match an.     
bf20: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74     ** ORDER BY t
bf30: 65 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e  erm, that is OK.
bf40: 20 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68    Just ignore th
bf50: 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  at column of the
bf60: 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a   index.        *
bf70: 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  /.        contin
bf80: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ue;.      }else 
bf90: 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f  if( i==pIdx->nCo
bfa0: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
bfb0: 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  /* Index column 
bfc0: 69 20 69 73 20 74 68 65 20 72 6f 77 69 64 2e 20  i is the rowid. 
bfd0: 20 41 6c 6c 20 6f 74 68 65 72 20 74 65 72 6d 73   All other terms
bfe0: 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 20   match. */.     
bff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c000: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
c010: 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f  * If an index co
c020: 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61  lumn fails to ma
c030: 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63  tch and is not c
c040: 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
c050: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
c060: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f   the index canno
c070: 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  t satisfy the OR
c080: 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e  DER BY constrain
c090: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
c0a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
c0b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c0c0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
c0d0: 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
c0e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
c0f0: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30  rm->sortOrder==0
c100: 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f   || pTerm->sortO
c110: 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61  rder==1 );.    a
c120: 73 73 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65  ssert( iSortOrde
c130: 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64  r==0 || iSortOrd
c140: 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 72  er==1 );.    ter
c150: 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 69 53 6f  mSortOrder = iSo
c160: 72 74 4f 72 64 65 72 20 5e 20 70 54 65 72 6d 2d  rtOrder ^ pTerm-
c170: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
c180: 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a  if( i>nEqCol ){.
c190: 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 53 6f        if( termSo
c1a0: 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64  rtOrder!=sortOrd
c1b0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  er ){.        /*
c1c0: 20 49 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c   Indices can onl
c1d0: 79 20 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c  y be used if all
c1e0: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
c1f0: 70 61 73 74 20 74 68 65 0a 20 20 20 20 20 20 20  past the.       
c200: 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   ** equality con
c210: 73 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c  straints are all
c220: 20 65 69 74 68 65 72 20 44 45 53 43 20 6f 72 20   either DESC or 
c230: 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ASC. */.        
c240: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
c250: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
c260: 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 74     sortOrder = t
c270: 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  ermSortOrder;.  
c280: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20    }.    j++;.   
c290: 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66   pTerm++;.    if
c2a0: 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21  ( iColumn<0 && !
c2b0: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
c2c0: 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20  ables(pOrderBy, 
c2d0: 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73  pMaskSet, j, bas
c2e0: 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
c2f0: 66 20 74 68 65 20 69 6e 64 65 78 65 64 20 63 6f  f the indexed co
c300: 6c 75 6d 6e 20 69 73 20 74 68 65 20 70 72 69 6d  lumn is the prim
c310: 61 72 79 20 6b 65 79 20 61 6e 64 20 65 76 65 72  ary key and ever
c320: 79 74 68 69 6e 67 20 6d 61 74 63 68 65 73 0a 20  ything matches. 
c330: 20 20 20 20 20 2a 2a 20 73 6f 20 66 61 72 20 61       ** so far a
c340: 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f  nd none of the O
c350: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f  RDER BY terms to
c360: 20 74 68 65 20 72 69 67 68 74 20 72 65 66 65 72   the right refer
c370: 65 6e 63 65 20 6f 74 68 65 72 0a 20 20 20 20 20  ence other.     
c380: 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68   ** tables in th
c390: 65 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20  e join, then we 
c3a0: 61 72 65 20 61 73 73 75 72 65 64 20 74 68 61 74  are assured that
c3b0: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62   the index can b
c3c0: 65 20 75 73 65 64 20 0a 20 20 20 20 20 20 2a 2a  e used .      **
c3d0: 20 74 6f 20 73 6f 72 74 20 62 65 63 61 75 73 65   to sort because
c3e0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
c3f0: 20 69 73 20 75 6e 69 71 75 65 20 61 6e 64 20 73   is unique and s
c400: 6f 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74  o none of the ot
c410: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  her.      ** col
c420: 75 6d 6e 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61  umns will make a
c430: 6e 79 20 64 69 66 66 65 72 65 6e 63 65 0a 20 20  ny difference.  
c440: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d      */.      j =
c450: 20 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   nTerm;.    }.  
c460: 7d 0a 0a 20 20 2a 70 62 52 65 76 20 3d 20 73 6f  }..  *pbRev = so
c470: 72 74 4f 72 64 65 72 21 3d 30 3b 0a 20 20 69 66  rtOrder!=0;.  if
c480: 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20  ( j>=nTerm ){.  
c490: 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f    /* All terms o
c4a0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
c4b0: 6c 61 75 73 65 20 61 72 65 20 63 6f 76 65 72 65  lause are covere
c4c0: 64 20 62 79 20 74 68 69 73 20 69 6e 64 65 78 20  d by this index 
c4d0: 73 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  so.    ** this i
c4e0: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
c4f0: 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f   for sorting. */
c500: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
c510: 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f   }.  if( pIdx->o
c520: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
c530: 26 26 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  && i==pIdx->nCol
c540: 75 6d 6e 0a 20 20 20 20 20 20 26 26 20 21 72 65  umn.      && !re
c550: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
c560: 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d  les(pOrderBy, pM
c570: 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29  askSet, j, base)
c580: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74   ){.    /* All t
c590: 65 72 6d 73 20 6f 66 20 74 68 69 73 20 69 6e 64  erms of this ind
c5a0: 65 78 20 6d 61 74 63 68 20 73 6f 6d 65 20 70 72  ex match some pr
c5b0: 65 66 69 78 20 6f 66 20 74 68 65 20 4f 52 44 45  efix of the ORDE
c5c0: 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  R BY clause.    
c5d0: 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
c5e0: 20 69 73 20 55 4e 49 51 55 45 20 61 6e 64 20 6e   is UNIQUE and n
c5f0: 6f 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 74  o terms on the t
c600: 61 69 6c 20 6f 66 20 74 68 65 20 4f 52 44 45 52  ail of the ORDER
c610: 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73   BY.    ** claus
c620: 65 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65  e reference othe
c630: 72 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  r tables in a jo
c640: 69 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  in.  If this is 
c650: 61 6c 6c 20 74 72 75 65 20 74 68 65 6e 0a 20 20  all true then.  
c660: 20 20 2a 2a 20 74 68 65 20 6f 72 64 65 72 20 62    ** the order b
c670: 79 20 63 6c 61 75 73 65 20 69 73 20 73 75 70 65  y clause is supe
c680: 72 66 6c 75 6f 75 73 2e 20 2a 2f 0a 20 20 20 20  rfluous. */.    
c690: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
c6a0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
c6b0: 2a 2a 20 43 68 65 63 6b 20 74 61 62 6c 65 20 74  ** Check table t
c6c0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 4f 52 44  o see if the ORD
c6d0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  ER BY clause in 
c6e0: 70 4f 72 64 65 72 42 79 20 63 61 6e 20 62 65 20  pOrderBy can be 
c6f0: 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
c700: 73 6f 72 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  sorting in order
c710: 20 6f 66 20 52 4f 57 49 44 2e 20 20 52 65 74 75   of ROWID.  Retu
c720: 72 6e 20 74 72 75 65 20 69 66 20 73 6f 20 61 6e  rn true if so an
c730: 64 20 73 65 74 20 2a 70 62 52 65 76 20 74 6f 20  d set *pbRev to 
c740: 62 65 0a 2a 2a 20 74 72 75 65 20 66 6f 72 20 72  be.** true for r
c750: 65 76 65 72 73 65 20 52 4f 57 49 44 20 61 6e 64  everse ROWID and
c760: 20 66 61 6c 73 65 20 66 6f 72 20 66 6f 72 77 61   false for forwa
c770: 72 64 20 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a  rd ROWID order..
c780: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f  */.static int so
c790: 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 0a 20  rtableByRowid(. 
c7a0: 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
c7b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
c7c0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
c7d0: 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ble to be sorted
c7e0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
c7f0: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
c800: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
c810: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4d  ause */.  WhereM
c820: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
c830: 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f  , /* Mapping fro
c840: 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73 20  m table cursors 
c850: 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20  to bitmaps */.  
c860: 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20  int *pbRev      
c870: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
c880: 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20  o 1 if ORDER BY 
c890: 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  is DESC */.){.  
c8a0: 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65  Expr *p;..  asse
c8b0: 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
c8c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  );.  assert( pOr
c8d0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29  derBy->nExpr>0 )
c8e0: 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79  ;.  p = pOrderBy
c8f0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
c900: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
c910: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
c920: 65 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e 69 43  e==base && p->iC
c930: 6f 6c 75 6d 6e 3d 3d 2d 31 0a 20 20 20 20 26 26  olumn==-1.    &&
c940: 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65   !referencesOthe
c950: 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79  rTables(pOrderBy
c960: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 31 2c 20 62  , pMaskSet, 1, b
c970: 61 73 65 29 20 29 7b 0a 20 20 20 20 2a 70 62 52  ase) ){.    *pbR
c980: 65 76 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  ev = pOrderBy->a
c990: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [0].sortOrder;. 
c9a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
c9b0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
c9c0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
c9d0: 63 72 75 64 65 20 65 73 74 69 6d 61 74 65 20 6f  crude estimate o
c9e0: 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20  f the logarithm 
c9f0: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c  of the input val
ca00: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  ue..** The resul
ca10: 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 65  ts need not be e
ca20: 78 61 63 74 2e 20 20 54 68 69 73 20 69 73 20 6f  xact.  This is o
ca30: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73 74  nly used for est
ca40: 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  imating.** the t
ca50: 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65 72  otal cost of per
ca60: 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69 6f  forming operatio
ca70: 6e 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20  ns with O(logN) 
ca80: 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63  or O(NlogN).** c
ca90: 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63 61  omplexity.  Beca
caa0: 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61 20  use N is just a 
cab0: 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f 20  guess, it is no 
cac0: 67 72 65 61 74 20 74 72 61 67 65 64 79 20 69 66  great tragedy if
cad0: 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69  .** logN is a li
cae0: 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  ttle off..*/.sta
caf0: 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f  tic double estLo
cb00: 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64  g(double N){.  d
cb10: 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a  ouble logN = 1;.
cb20: 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b    double x = 10;
cb30: 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b  .  while( N>x ){
cb40: 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a  .    logN += 1;.
cb50: 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d      x *= 10;.  }
cb60: 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a  .  return logN;.
cb70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75  }../*.** Two rou
cb80: 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69  tines for printi
cb90: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
cba0: 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  f an sqlite3_ind
cbb0: 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ex_info.** struc
cbc0: 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20  ture.  Used for 
cbd0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
cbe0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20  gging only.  If 
cbf0: 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54  neither.** SQLIT
cc00: 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45  E_TEST or SQLITE
cc10: 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e  _DEBUG are defin
cc20: 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72  ed, then these r
cc30: 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e  outines.** are n
cc40: 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64  o-ops..*/.#if !d
cc50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
cc60: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
cc70: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
cc80: 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
cc90: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
cca0: 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  INPUTS(sqlite3_i
ccb0: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
ccc0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
ccd0: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
cce0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
ccf0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
cd00: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
cd10: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
cd20: 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69  intf("  constrai
cd30: 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74  nt[%d]: col=%d t
cd40: 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75  ermid=%d op=%d u
cd50: 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20  sabled=%d\n",.  
cd60: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
cd70: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
cd80: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
cd90: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
cda0: 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a  i].iTermOffset,.
cdb0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
cdc0: 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20  raint[i].op,.   
cdd0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
cde0: 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20  nt[i].usable);. 
cdf0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
ce00: 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  p->nOrderBy; i++
ce10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
ce20: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
ce30: 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  erby[%d]: col=%d
ce40: 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20   desc=%d\n",.   
ce50: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
ce60: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  >aOrderBy[i].iCo
ce70: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
ce80: 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  aOrderBy[i].desc
ce90: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
cea0: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f  void TRACE_IDX_O
ceb0: 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  UTPUTS(sqlite3_i
cec0: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
ced0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
cee0: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
cef0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
cf00: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
cf10: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
cf20: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
cf30: 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64  intf("  usage[%d
cf40: 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d  ]: argvIdx=%d om
cf50: 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  it=%d\n",.      
cf60: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
cf70: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
cf80: 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20  ].argvIndex,.   
cf90: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
cfa0: 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29  ntUsage[i].omit)
cfb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
cfc0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
cfd0: 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69  xNum=%d\n", p->i
cfe0: 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  dxNum);.  sqlite
cff0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
d000: 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d  idxStr=%s\n", p-
d010: 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
d020: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
d030: 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65    orderByConsume
d040: 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65  d=%d\n", p->orde
d050: 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20  rByConsumed);.  
d060: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
d070: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43  tf("  estimatedC
d080: 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73  ost=%g\n", p->es
d090: 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a  timatedCost);.}.
d0a0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52  #else.#define TR
d0b0: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41  ACE_IDX_INPUTS(A
d0c0: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  ).#define TRACE_
d0d0: 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23  IDX_OUTPUTS(A).#
d0e0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
d0f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
d100: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f  ALTABLE./*.** Co
d110: 6d 70 75 74 65 20 74 68 65 20 62 65 73 74 20 69  mpute the best i
d120: 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72 74 75  ndex for a virtu
d130: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
d140: 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 69  The best index i
d150: 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
d160: 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
d170: 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
d180: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75  al.** table modu
d190: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
d1a0: 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  e is really just
d1b0: 20 61 20 77 72 61 70 70 65 72 20 74 68 61 74 20   a wrapper that 
d1c0: 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65 20 73  sets up.** the s
d1d0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
d1e0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
d1f0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d   is used to comm
d200: 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a 2a 20  unicate with.** 
d210: 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  xBestIndex..**.*
d220: 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69  * In a join, thi
d230: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
d240: 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70  be called multip
d250: 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  le times for the
d260: 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75 61 6c  .** same virtual
d270: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73 71 6c   table.  The sql
d280: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
d290: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
d2a0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  ated.** and init
d2b0: 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65 20 66  ialized on the f
d2c0: 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  irst invocation 
d2d0: 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 61 6c  and reused on al
d2e0: 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
d2f0: 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68  invocations.  Th
d300: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
d310: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
d320: 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
d330: 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65  .** code is gene
d340: 72 61 74 65 64 20 74 6f 20 61 63 63 65 73 73 20  rated to access 
d350: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
d360: 65 2e 20 20 54 68 65 20 77 68 65 72 65 49 6e 66  e.  The whereInf
d370: 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f  oDelete() .** ro
d380: 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61 72 65  utine takes care
d390: 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68 65 20   of freeing the 
d3a0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
d3b0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 61 66 74  fo structure aft
d3c0: 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64 79 20  er.** everybody 
d3d0: 68 61 73 20 66 69 6e 69 73 68 65 64 20 77 69 74  has finished wit
d3e0: 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  h it..*/.static 
d3f0: 64 6f 75 62 6c 65 20 62 65 73 74 56 69 72 74 75  double bestVirtu
d400: 61 6c 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  alIndex(.  Parse
d410: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d430: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
d440: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
d450: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
d460: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
d470: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
d480: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
d490: 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  m *pSrc,     /* 
d4a0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
d4b0: 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
d4c0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
d4d0: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
d4e0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
d4f0: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
d500: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
d510: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
d520: 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 20 20  erBy,           
d530: 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79   /* The order by
d540: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
d550: 20 6f 72 64 65 72 42 79 55 73 61 62 6c 65 2c 20   orderByUsable, 
d560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d570: 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 6f  rue if we can po
d580: 74 65 6e 74 69 61 6c 20 73 6f 72 74 20 2a 2f 0a  tential sort */.
d590: 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
d5a0: 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f  info **ppIdxInfo
d5b0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d   /* Index inform
d5c0: 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20  ation passed to 
d5d0: 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b  xBestIndex */.){
d5e0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
d5f0: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73   pSrc->pTab;.  s
d600: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
d610: 61 62 20 3d 20 70 54 61 62 2d 3e 70 56 74 61 62  ab = pTab->pVtab
d620: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
d630: 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
d640: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
d650: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
d660: 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
d670: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
d680: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70  index_orderby *p
d690: 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74  IdxOrderBy;.  st
d6a0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
d6b0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
d6c0: 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
d6d0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
d6e0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
d6f0: 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69  nt nOrderBy;.  i
d700: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20  nt rc;..  /* If 
d710: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
d720: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
d730: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72   has not been pr
d740: 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c  eviously.  ** al
d750: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74  located and init
d760: 69 61 6c 69 7a 65 64 20 66 6f 72 20 74 68 69 73  ialized for this
d770: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
d780: 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 0a 20 20  then allocate.  
d790: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
d7a0: 65 20 69 74 20 6e 6f 77 0a 20 20 2a 2f 0a 20 20  e it now.  */.  
d7b0: 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64  pIdxInfo = *ppId
d7c0: 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64  xInfo;.  if( pId
d7d0: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
d7e0: 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 57  int nTerm;.    W
d7f0: 48 45 52 45 54 52 41 43 45 28 28 22 52 65 63 6f  HERETRACE(("Reco
d800: 6d 70 75 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  mputing index in
d810: 66 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c  fo for %s...\n",
d820: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pTab->zName));.
d830: 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  .    /* Count th
d840: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
d850: 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
d860: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
d870: 66 65 72 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74  ferring.    ** t
d880: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
d890: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  able */.    for(
d8a0: 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d  i=nTerm=0, pTerm
d8b0: 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
d8c0: 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
d8d0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
d8e0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
d8f0: 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
d900: 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
d910: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
d920: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
d930: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
d940: 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1))==0 );.     
d950: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
d960: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
d970: 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IN );.      test
d980: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
d990: 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c  erator==WO_ISNUL
d9a0: 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  L );.      if( p
d9b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
d9c0: 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  & (WO_IN|WO_ISNU
d9d0: 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
d9e0: 20 20 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20        nTerm++;. 
d9f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
da00: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
da10: 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  use contains onl
da20: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  y columns in the
da30: 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a   current .    **
da40: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
da50: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  hen allocate spa
da60: 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65  ce for the aOrde
da70: 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 20 20  rBy part of.    
da80: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
da90: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
daa0: 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
dab0: 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
dac0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
dad0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
dae0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
daf0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
db00: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
db10: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
db20: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
db30: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
db40: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d  COLUMN || pExpr-
db50: 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69  >iTable!=pSrc->i
db60: 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
db70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
db80: 28 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e  ( i==pOrderBy->n
db90: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
dba0: 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
dbb0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
dbc0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
dbd0: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
dbe0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
dbf0: 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
dc00: 2a 2f 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 20  */.    pIdxInfo 
dc10: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
dc20: 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
dc30: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e  , sizeof(*pIdxIn
dc40: 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo).            
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78   + (sizeof(*pIdx
dc70: 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a  Cons) + sizeof(*
dc80: 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20  pUsage))*nTerm. 
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
dcb0: 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
dcc0: 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20  y)*nOrderBy );. 
dcd0: 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d     if( pIdxInfo=
dce0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
dcf0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
dd00: 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  se, "out of memo
dd10: 72 79 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ry");.      retu
dd20: 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 0a 20 20  rn 0.0;.    }.  
dd30: 20 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20 70    *ppIdxInfo = p
dd40: 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a  IdxInfo;..    /*
dd50: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
dd60: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
dd70: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
dd80: 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  fo structure con
dd90: 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20 6d 61 6e  tains.    ** man
dda0: 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72  y fields that ar
ddb0: 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73  e declared "cons
ddc0: 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42  t" to prevent xB
ddd0: 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20  estIndex from.  
dde0: 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68    ** changing th
ddf0: 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  em.  We have to 
de00: 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61  do some funky ca
de10: 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74  sting in order t
de20: 6f 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c  o.    ** initial
de30: 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ize those fields
de40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64  ..    */.    pId
de50: 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20  xCons = (struct 
de60: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
de70: 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49  nstraint*)&pIdxI
de80: 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20 70 49 64 78  nfo[1];.    pIdx
de90: 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63  OrderBy = (struc
dea0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
deb0: 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f  orderby*)&pIdxCo
dec0: 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 70  ns[nTerm];.    p
ded0: 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20  Usage = (struct 
dee0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
def0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29  nstraint_usage*)
df00: 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72  &pIdxOrderBy[nOr
df10: 64 65 72 42 79 5d 3b 0a 20 20 20 20 2a 28 69 6e  derBy];.    *(in
df20: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t*)&pIdxInfo->nC
df30: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72  onstraint = nTer
df40: 6d 3b 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26 70  m;.    *(int*)&p
df50: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
df60: 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  y = nOrderBy;.  
df70: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
df80: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
df90: 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
dfa0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70  >aConstraint = p
dfb0: 49 64 78 43 6f 6e 73 3b 0a 20 20 20 20 2a 28 73  IdxCons;.    *(s
dfc0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
dfd0: 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70  dex_orderby**)&p
dfe0: 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
dff0: 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b  y = pIdxOrderBy;
e000: 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20 73 71  .    *(struct sq
e010: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
e020: 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
e030: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
e040: 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 20 20 66    pUsage;..    f
e0a0: 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
e0b0: 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
e0c0: 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
e0d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
e0e0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
e0f0: 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
e100: 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
e110: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
e120: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70  rm->eOperator&(p
e130: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d  Term->eOperator-
e140: 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  1))==0 );.      
e150: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
e160: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
e170: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
e180: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
e190: 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c  rator==WO_ISNULL
e1a0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
e1b0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
e1c0: 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c   (WO_IN|WO_ISNUL
e1d0: 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
e1e0: 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d       pIdxCons[j]
e1f0: 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
e200: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
e210: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
e220: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20  ].iTermOffset = 
e230: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  i;.      pIdxCon
e240: 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 70 54  s[j].op = (u8)pT
e250: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a  erm->eOperator;.
e260: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72        /* The dir
e270: 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69  ect assignment i
e280: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  n the previous l
e290: 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ine is possible 
e2a0: 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20  only because.   
e2b0: 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e     ** the WO_ an
e2c0: 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  d SQLITE_INDEX_C
e2d0: 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73  ONSTRAINT_ codes
e2e0: 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20   are identical. 
e2f0: 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f   The.      ** fo
e300: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
e310: 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
e320: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
e330: 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45  t( WO_EQ==SQLITE
e340: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
e350: 54 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 61 73  T_EQ );.      as
e360: 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c  sert( WO_LT==SQL
e370: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
e380: 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 20  AINT_LT );.     
e390: 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d   assert( WO_LE==
e3a0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
e3b0: 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20  STRAINT_LE );.  
e3c0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
e3d0: 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
e3e0: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b  CONSTRAINT_GT );
e3f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
e400: 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GE==SQLITE_IND
e410: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45  EX_CONSTRAINT_GE
e420: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e430: 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49  ( WO_MATCH==SQLI
e440: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
e450: 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20  INT_MATCH );.   
e460: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
e470: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
e480: 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
e490: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
e4a0: 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 20 20  MATCH) );.      
e4b0: 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  j++;.    }.    f
e4c0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
e4d0: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
e4e0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
e4f0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
e500: 70 72 3b 0a 20 20 20 20 20 20 70 49 64 78 4f 72  pr;.      pIdxOr
e510: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
e520: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
e530: 6e 3b 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64  n;.      pIdxOrd
e540: 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70  erBy[i].desc = p
e550: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
e560: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
e570: 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73   }..  /* At this
e580: 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c 69   point, the sqli
e590: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
e5a0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 70 49  tructure that pI
e5b0: 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20  dxInfo points.  
e5c0: 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76 65 20  ** to will have 
e5d0: 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
e5e0: 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e 67 20  , either during 
e5f0: 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f  the current invo
e600: 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64  cation or.  ** d
e610: 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72  uring some prior
e620: 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f   invocation.  No
e630: 77 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 74  w we just have t
e640: 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a  o customize the.
e650: 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20    ** details of 
e660: 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74 68 65  pIdxInfo for the
e670: 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74   current invocat
e680: 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69 74 20  ion and pass it 
e690: 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e 64  to.  ** xBestInd
e6a0: 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ex..  */..  /* T
e6b0: 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d  he module name m
e6c0: 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 20  ust be defined. 
e6d0: 41 6c 73 6f 2c 20 62 79 20 74 68 69 73 20 70 6f  Also, by this po
e6e0: 69 6e 74 20 74 68 65 72 65 20 6d 75 73 74 0a 20  int there must. 
e6f0: 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74 65 72   ** be a pointer
e700: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76   to an sqlite3_v
e710: 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 20 4f  tab structure. O
e720: 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20 73 71  therwise.  ** sq
e730: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
e740: 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64 20  mnNames() would 
e750: 68 61 76 65 20 70 69 63 6b 65 64 20 75 70 20 74  have picked up t
e760: 68 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a  he error. .  */.
e770: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
e780: 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20 70  azModuleArg && p
e790: 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67  Tab->azModuleArg
e7a0: 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  [0] );.  assert(
e7b0: 20 70 56 74 61 62 20 29 3b 0a 23 69 66 20 30 0a   pVtab );.#if 0.
e7c0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 56 74 61    if( pTab->pVta
e7d0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
e7e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
e7f0: 73 65 2c 20 22 75 6e 64 65 66 69 6e 65 64 20 6d  se, "undefined m
e800: 6f 64 75 6c 65 20 25 73 20 66 6f 72 20 74 61 62  odule %s for tab
e810: 6c 65 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  le %s",.        
e820: 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
e830: 67 5b 30 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  g[0], pTab->zNam
e840: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  e);.    return 0
e850: 2e 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  .0;.  }.#endif..
e860: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f    /* Set the aCo
e870: 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c  nstraint[].usabl
e880: 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69  e fields and ini
e890: 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a  tialize all .  *
e8a0: 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
e8b0: 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  es to zero..  **
e8c0: 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e  .  ** aConstrain
e8d0: 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72  t[].usable is tr
e8e0: 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ue for constrain
e8f0: 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67  ts where the rig
e900: 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64  ht-hand.  ** sid
e910: 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
e920: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
e930: 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
e940: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a   of the current.
e950: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20    ** table.  In 
e960: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
e970: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
e980: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
e990: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
e9a0: 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72     column = expr
e9b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77  .  **.  ** and w
e9c0: 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
e9d0: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68   a join, then th
e9e0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e constraint on 
e9f0: 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20  column is .  ** 
ea00: 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c  only valid if al
ea10: 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  l tables referen
ea20: 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75  ced in expr occu
ea30: 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  r to the left.  
ea40: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
ea50: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
ea60: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n..  **.  ** The
ea70: 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20   aConstraints[] 
ea80: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65  array contains e
ea90: 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
eaa0: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
eab0: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
eac0: 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20  able.  That way 
ead0: 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20  we only have to 
eae0: 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a  compute it once.
eaf0: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
eb00: 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f   we might try to
eb10: 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69   pick the best i
eb20: 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69  ndex multiple ti
eb30: 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61  mes..  ** For ea
eb40: 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69  ch attempt at pi
eb50: 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20  cking an index, 
eb60: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62  the order of tab
eb70: 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  les in the.  ** 
eb80: 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69  join might be di
eb90: 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61  fferent so we ha
eba0: 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  ve to recompute 
ebb0: 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a  the usable flag.
ebc0: 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a    ** each time..
ebd0: 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
ebe0: 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
ebf0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
ec00: 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
ec10: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
ec20: 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
ec30: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
ec40: 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  age;.  for(i=0; 
ec50: 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
ec60: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
ec70: 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a  dxCons++){.    j
ec80: 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
ec90: 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54  rmOffset;.    pT
eca0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
ecb0: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e  ;.    pIdxCons->
ecc0: 75 73 61 62 6c 65 20 3d 20 20 28 70 54 65 72 6d  usable =  (pTerm
ecd0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
ece0: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 3f 31 3a  notReady)==0 ?1:
ecf0: 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  0;.  }.  memset(
ed00: 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
ed10: 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
ed20: 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
ed30: 6e 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  nt);.  if( pIdxI
ed40: 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
ed50: 64 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  dxStr ){.    sql
ed60: 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
ed70: 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d  fo->idxStr);.  }
ed80: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
ed90: 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Str = 0;.  pIdxI
eda0: 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
edb0: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  .  pIdxInfo->nee
edc0: 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
edd0: 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  0;.  pIdxInfo->o
ede0: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
edf0: 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
ee00: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
ee10: 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
ee20: 20 32 2e 30 3b 0a 20 20 6e 4f 72 64 65 72 42 79   2.0;.  nOrderBy
ee30: 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72   = pIdxInfo->nOr
ee40: 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70 49 64  derBy;.  if( pId
ee50: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
ee60: 26 26 20 21 6f 72 64 65 72 42 79 55 73 61 62 6c  && !orderByUsabl
ee70: 65 20 29 7b 0a 20 20 20 20 2a 28 69 6e 74 2a 29  e ){.    *(int*)
ee80: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  &pIdxInfo->nOrde
ee90: 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
eea0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
eeb0: 65 74 79 4f 66 66 28 70 50 61 72 73 65 2d 3e 64  etyOff(pParse->d
eec0: 62 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  b);.  WHERETRACE
eed0: 28 28 22 78 42 65 73 74 49 6e 64 65 78 20 66 6f  (("xBestIndex fo
eee0: 72 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a  r %s\n", pTab->z
eef0: 4e 61 6d 65 29 29 3b 0a 20 20 54 52 41 43 45 5f  Name));.  TRACE_
ef00: 49 44 58 5f 49 4e 50 55 54 53 28 70 49 64 78 49  IDX_INPUTS(pIdxI
ef10: 6e 66 6f 29 3b 0a 20 20 72 63 20 3d 20 70 56 74  nfo);.  rc = pVt
ef20: 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65  ab->pModule->xBe
ef30: 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70  stIndex(pVtab, p
ef40: 49 64 78 49 6e 66 6f 29 3b 0a 20 20 54 52 41 43  IdxInfo);.  TRAC
ef50: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 49  E_IDX_OUTPUTS(pI
ef60: 64 78 49 6e 66 6f 29 3b 0a 20 20 28 76 6f 69 64  dxInfo);.  (void
ef70: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e  )sqlite3SafetyOn
ef80: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 0a 20  (pParse->db);.. 
ef90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
efa0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
efb0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
efc0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
efd0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
efe0: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
eff0: 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72  if( !pVtab->zErr
f000: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
f010: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f020: 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
f030: 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
f040: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f050: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f060: 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56  pParse, "%s", pV
f070: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
f080: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
f090: 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
f0a0: 3e 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  >db, pVtab->zErr
f0b0: 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
f0c0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66  ErrMsg = 0;..  f
f0d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
f0e0: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
f0f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
f100: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
f110: 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20  raint[i].usable 
f120: 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67  && pUsage[i].arg
f130: 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20  vIndex>0 ){.    
f140: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f150: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
f160: 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20       "table %s: 
f170: 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72  xBestIndex retur
f180: 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70  ned an invalid p
f190: 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  lan", pTab->zNam
f1a0: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
f1b0: 20 30 2e 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   0.0;.    }.  }.
f1c0: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
f1d0: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
f1e0: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 72 65 74 75  nOrderBy;.  retu
f1f0: 72 6e 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  rn pIdxInfo->est
f200: 69 6d 61 74 65 64 43 6f 73 74 3b 0a 7d 0a 23 65  imatedCost;.}.#e
f210: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
f220: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
f230: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20   */../*.** Find 
f240: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66  the query plan f
f250: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70  or accessing a p
f260: 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e  articular table.
f270: 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62    Write the.** b
f280: 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61  est query plan a
f290: 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f  nd its cost into
f2a0: 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 20 6f   the WhereCost o
f2b0: 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64 20 61  bject supplied a
f2c0: 73 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61  s the.** last pa
f2d0: 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
f2e0: 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
f2f0: 6c 61 6e 20 77 69 6e 73 2e 20 20 54 68 65 20 63  lan wins.  The c
f300: 6f 73 74 20 69 73 20 61 6e 20 65 73 74 69 6d 61  ost is an estima
f310: 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74  te of the amount
f320: 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64   of.** CPU and d
f330: 69 73 6b 20 49 2f 4f 20 6e 65 65 64 20 74 6f 20  isk I/O need to 
f340: 70 72 6f 63 65 73 73 20 74 68 65 20 72 65 71 75  process the requ
f350: 65 73 74 20 75 73 69 6e 67 20 74 68 65 20 73 65  est using the se
f360: 6c 65 63 74 65 64 20 70 6c 61 6e 2e 0a 2a 2a 20  lected plan..** 
f370: 46 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66  Factors that inf
f380: 6c 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c  luence cost incl
f390: 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ude:.**.**    * 
f3a0: 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   The estimated n
f3b0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
f3c0: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69  at will be retri
f3d0: 65 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20  eved.  (The.**  
f3e0: 20 20 20 20 20 66 65 77 65 72 20 74 68 65 20 62       fewer the b
f3f0: 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20  etter.).**.**   
f400: 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e   *  Whether or n
f410: 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20  ot sorting must 
f420: 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  occur..**.**    
f430: 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  *  Whether or no
f440: 74 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  t there must be 
f450: 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73  separate lookups
f460: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
f470: 20 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68   index and in th
f480: 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a  e main table..**
f490: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61 73  .** If there was
f4a0: 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
f4b0: 6c 61 75 73 65 20 61 74 74 61 63 68 65 64 20 74  lause attached t
f4c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74  o the table in t
f4d0: 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61  he SELECT.** sta
f4e0: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68 69  tement, then thi
f4f0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
f500: 63 6f 6e 73 69 64 65 72 73 20 70 6c 61 6e 73 20  considers plans 
f510: 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 6e 61  using the .** na
f520: 6d 65 64 20 69 6e 64 65 78 2e 20 49 66 20 6f 6e  med index. If on
f530: 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
f540: 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
f550: 72 6e 65 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20  rned cost is.** 
f560: 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20  SQLITE_BIG_DBL. 
f570: 49 66 20 61 20 70 6c 61 6e 20 63 61 6e 20 62 65  If a plan can be
f580: 20 66 6f 75 6e 64 20 74 68 61 74 20 75 73 65 73   found that uses
f590: 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
f5a0: 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  , .** then the c
f5b0: 6f 73 74 20 69 73 20 63 61 6c 63 75 6c 61 74 65  ost is calculate
f5c0: 64 20 69 6e 20 74 68 65 20 75 73 75 61 6c 20 77  d in the usual w
f5d0: 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4e  ay..**.** If a N
f5e0: 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
f5f0: 65 20 77 61 73 20 61 74 74 61 63 68 65 64 20 74  e was attached t
f600: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74  o the table in t
f610: 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
f620: 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 6e 6f  atement, then no
f630: 20 69 6e 64 65 78 65 73 20 61 72 65 20 63 6f 6e   indexes are con
f640: 73 69 64 65 72 65 64 2e 20 48 6f 77 65 76 65 72  sidered. However
f650: 2c 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 0a  , the selected .
f660: 2a 2a 20 70 6c 61 6e 20 6d 61 79 20 73 74 69 6c  ** plan may stil
f670: 6c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  l take advantage
f680: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 62   of the tables b
f690: 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 0a 2a 2a  uilt-in rowid.**
f6a0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
f6b0: 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78  c void bestIndex
f6c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f6d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f6e0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
f6f0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
f700: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
f710: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
f720: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
f730: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
f740: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
f750: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
f760: 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
f770: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
f780: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
f790: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
f7a0: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
f7b0: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45  available */.  E
f7c0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
f7d0: 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  y,         /* Th
f7e0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
f7f0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  e */.  WhereCost
f800: 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20   *pCost         
f810: 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73     /* Lowest cos
f820: 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a  t query plan */.
f830: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
f840: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
f850: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
f860: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
f870: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
f880: 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72  Cur = pSrc->iCur
f890: 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  sor;   /* The cu
f8a0: 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
f8b0: 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  e to be accessed
f8c0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
f8d0: 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
f8e0: 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
f8f0: 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
f900: 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b 20 20 20  */.  int rev;   
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61 6e   /* True to scan
f930: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
f940: 72 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61  r */.  int wsFla
f950: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
f960: 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f     /* Flags asso
f970: 63 69 61 74 65 64 20 77 69 74 68 20 70 50 72 6f  ciated with pPro
f980: 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 3b  be */.  int nEq;
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f9b0: 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
f9c0: 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65  aints */.  int e
f9d0: 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20  qTermMask;      
f9e0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
f9f0: 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79  f valid equality
fa00: 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
fa10: 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20  double cost;    
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
fa30: 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 70 50 72  ost of using pPr
fa40: 6f 62 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  obe */.  double 
fa50: 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  nRow;           
fa60: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
fa70: 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
fa80: 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
fa90: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
fac0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  */.  Bitmask mas
fad0: 6b 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  kSrc;           
fae0: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20   /* Bitmask for 
faf0: 74 68 65 20 70 53 72 63 20 74 61 62 6c 65 20 2a  the pSrc table *
fb00: 2f 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  /..  WHERETRACE(
fb10: 28 22 62 65 73 74 49 6e 64 65 78 3a 20 74 62 6c  ("bestIndex: tbl
fb20: 3d 25 73 20 6e 6f 74 52 65 61 64 79 3d 25 6c 6c  =%s notReady=%ll
fb30: 78 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62  x\n", pSrc->pTab
fb40: 2d 3e 7a 4e 61 6d 65 2c 6e 6f 74 52 65 61 64 79  ->zName,notReady
fb50: 29 29 3b 0a 20 20 70 50 72 6f 62 65 20 3d 20 70  ));.  pProbe = p
fb60: 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  Src->pTab->pInde
fb70: 78 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  x;.  if( pSrc->n
fb80: 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20  otIndexed ){.   
fb90: 20 70 50 72 6f 62 65 20 3d 20 30 3b 0a 20 20 7d   pProbe = 0;.  }
fba0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61  ..  /* If the ta
fbb0: 62 6c 65 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  ble has no indic
fbc0: 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
fbd0: 20 6e 6f 20 74 65 72 6d 73 20 69 6e 20 74 68 65   no terms in the
fbe0: 20 77 68 65 72 65 0a 20 20 2a 2a 20 63 6c 61 75   where.  ** clau
fbf0: 73 65 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  se that refer to
fc00: 20 74 68 65 20 52 4f 57 49 44 2c 20 74 68 65 6e   the ROWID, then
fc10: 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62   we will never b
fc20: 65 20 61 62 6c 65 20 74 6f 20 64 6f 0a 20 20 2a  e able to do.  *
fc30: 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  * anything other
fc40: 20 74 68 61 6e 20 61 20 66 75 6c 6c 20 74 61 62   than a full tab
fc50: 6c 65 20 73 63 61 6e 20 6f 6e 20 74 68 69 73 20  le scan on this 
fc60: 74 61 62 6c 65 2e 20 20 57 65 20 6d 69 67 68 74  table.  We might
fc70: 20 61 73 0a 20 20 2a 2a 20 77 65 6c 6c 20 70 75   as.  ** well pu
fc80: 74 20 69 74 20 66 69 72 73 74 20 69 6e 20 74 68  t it first in th
fc90: 65 20 6a 6f 69 6e 20 6f 72 64 65 72 2e 20 20 54  e join order.  T
fca0: 68 61 74 20 77 61 79 2c 20 70 65 72 68 61 70 73  hat way, perhaps
fcb0: 20 69 74 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20   it can be.  ** 
fcc0: 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 6f 74  referenced by ot
fcd0: 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20 74 68  her tables in th
fce0: 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 6d  e join..  */.  m
fcf0: 65 6d 73 65 74 28 70 43 6f 73 74 2c 20 30 2c 20  emset(pCost, 0, 
fd00: 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29 29 3b  sizeof(*pCost));
fd10: 0a 20 20 69 66 28 20 70 50 72 6f 62 65 3d 3d 30  .  if( pProbe==0
fd20: 20 26 26 0a 20 20 20 20 20 66 69 6e 64 54 65 72   &&.     findTer
fd30: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
fd40: 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c   0, WO_EQ|WO_IN|
fd50: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
fd60: 54 7c 57 4f 5f 47 45 2c 30 29 3d 3d 30 20 26 26  T|WO_GE,0)==0 &&
fd70: 0a 20 20 20 20 20 28 70 4f 72 64 65 72 42 79 3d  .     (pOrderBy=
fd80: 3d 30 20 7c 7c 20 21 73 6f 72 74 61 62 6c 65 42  =0 || !sortableB
fd90: 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72  yRowid(iCur, pOr
fda0: 64 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61 73  derBy, pWC->pMas
fdb0: 6b 53 65 74 2c 20 26 72 65 76 29 29 20 29 7b 0a  kSet, &rev)) ){.
fdc0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
fdd0: 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
fde0: 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
fdf0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
fe00: 20 61 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72   a rowid=EXPR or
fe10: 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20   rowid IN (...) 
fe20: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20  constraints. If 
fe30: 74 68 65 72 65 20 77 61 73 0a 20 20 2a 2a 20 61  there was.  ** a
fe40: 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
fe50: 75 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20  use attached to 
fe60: 74 68 69 73 20 74 61 62 6c 65 2c 20 73 6b 69 70  this table, skip
fe70: 20 74 68 69 73 20 73 74 65 70 2e 0a 20 20 2a 2f   this step..  */
fe80: 0a 20 20 69 66 28 20 21 70 53 72 63 2d 3e 70 49  .  if( !pSrc->pI
fe90: 6e 64 65 78 20 29 7b 0a 20 20 20 20 70 54 65 72  ndex ){.    pTer
fea0: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
feb0: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
fec0: 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
fed0: 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  N, 0);.    if( p
fee0: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 45 78  Term ){.      Ex
fef0: 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 20  pr *pExpr;.     
ff00: 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
ff10: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57  lags = WHERE_ROW
ff20: 49 44 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28  ID_EQ;.      if(
ff30: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
ff40: 72 20 26 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20  r & WO_EQ ){.   
ff50: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 3d 3d 20       /* Rowid== 
ff60: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 62 65  is always the be
ff70: 73 74 20 70 69 63 6b 2e 20 20 4c 6f 6f 6b 20 6e  st pick.  Look n
ff80: 6f 20 66 75 72 74 68 65 72 2e 20 20 42 65 63 61  o further.  Beca
ff90: 75 73 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20  use only.       
ffa0: 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   ** a single row
ffb0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 2c 20 6f   is generated, o
ffc0: 75 74 70 75 74 20 69 73 20 61 6c 77 61 79 73 20  utput is always 
ffd0: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20  in sorted order 
ffe0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  */.        pCost
fff0: 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  ->plan.wsFlags =
10000 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20   WHERE_ROWID_EQ 
10010 7c 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a  | WHERE_UNIQUE;.
10020 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70          pCost->p
10030 6c 61 6e 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  lan.nEq = 1;.   
10040 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
10050 28 22 2e 2e 2e 20 62 65 73 74 20 69 73 20 72 6f  ("... best is ro
10060 77 69 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  wid\n"));.      
10070 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
10080 20 30 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73   0;.        pCos
10090 74 2d 3e 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20  t->nRow = 1;.   
100a0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
100b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 45     }else if( (pE
100c0 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
100d0 70 72 29 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b  pr)->pList!=0 ){
100e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  .        /* Rowi
100f0 64 20 49 4e 20 28 4c 49 53 54 29 3a 20 63 6f 73  d IN (LIST): cos
10100 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65  t is NlogN where
10110 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
10120 20 6f 66 20 6c 69 73 74 0a 20 20 20 20 20 20 20   of list.       
10130 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 20 2a   ** elements.  *
10140 2f 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  /.        pCost-
10150 3e 72 43 6f 73 74 20 3d 20 70 43 6f 73 74 2d 3e  >rCost = pCost->
10160 6e 52 6f 77 20 3d 20 70 45 78 70 72 2d 3e 70 4c  nRow = pExpr->pL
10170 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
10180 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
10190 20 2a 3d 20 65 73 74 4c 6f 67 28 70 43 6f 73 74   *= estLog(pCost
101a0 2d 3e 72 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  ->rCost);.      
101b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
101c0 2a 20 52 6f 77 69 64 20 49 4e 20 28 53 45 4c 45  * Rowid IN (SELE
101d0 43 54 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f  CT): cost is Nlo
101e0 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  gN where N is th
101f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
10200 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
10210 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
10220 20 69 6e 6e 65 72 20 73 65 6c 65 63 74 2e 20 20   inner select.  
10230 57 65 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  We have no way t
10240 6f 20 65 73 74 69 6d 61 74 65 0a 20 20 20 20 20  o estimate.     
10250 20 20 20 2a 2a 20 74 68 61 74 20 76 61 6c 75 65     ** that value
10260 20 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64 20   so make a wild 
10270 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20  guess. */.      
10280 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20    pCost->nRow = 
10290 31 30 30 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  100;.        pCo
102a0 73 74 2d 3e 72 43 6f 73 74 20 3d 20 32 30 30 3b  st->rCost = 200;
102b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57  .      }.      W
102c0 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
102d0 72 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a 20 25  rowid IN cost: %
102e0 2e 39 67 5c 6e 22 2c 20 70 43 6f 73 74 2d 3e 72  .9g\n", pCost->r
102f0 43 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Cost));.    }.  
10300 0a 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  .    /* Estimate
10310 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 74   the cost of a t
10320 61 62 6c 65 20 73 63 61 6e 2e 20 20 49 66 20 77  able scan.  If w
10330 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f  e do not know ho
10340 77 20 6d 61 6e 79 0a 20 20 20 20 2a 2a 20 65 6e  w many.    ** en
10350 74 72 69 65 73 20 61 72 65 20 69 6e 20 74 68 65  tries are in the
10360 20 74 61 62 6c 65 2c 20 75 73 65 20 31 20 6d 69   table, use 1 mi
10370 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75 65 73 73  llion as a guess
10380 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 73  ..    */.    cos
10390 74 20 3d 20 70 50 72 6f 62 65 20 3f 20 70 50 72  t = pProbe ? pPr
103a0 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  obe->aiRowEst[0]
103b0 20 3a 20 31 30 30 30 30 30 30 3b 0a 20 20 20 20   : 1000000;.    
103c0 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
103d0 20 74 61 62 6c 65 20 73 63 61 6e 20 62 61 73 65   table scan base
103e0 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20   cost: %.9g\n", 
103f0 63 6f 73 74 29 29 3b 0a 20 20 20 20 77 73 46 6c  cost));.    wsFl
10400 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49  ags = WHERE_ROWI
10410 44 5f 52 41 4e 47 45 3b 0a 20 20 0a 20 20 20 20  D_RANGE;.  .    
10420 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e  /* Check for con
10430 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 20 72 61  straints on a ra
10440 6e 67 65 20 6f 66 20 72 6f 77 69 64 73 20 69 6e  nge of rowids in
10450 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a 20   a table scan.. 
10460 20 20 20 2a 2f 0a 20 20 20 20 70 54 65 72 6d 20     */.    pTerm 
10470 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
10480 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
10490 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  dy, WO_LT|WO_LE|
104a0 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b  WO_GT|WO_GE, 0);
104b0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 20 29  .    if( pTerm )
104c0 7b 0a 20 20 20 20 20 20 69 66 28 20 66 69 6e 64  {.      if( find
104d0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
104e0 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
104f0 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b  _LT|WO_LE, 0) ){
10500 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
10510 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
10520 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 63 6f 73  MIT;.        cos
10530 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73  t /= 3;  /* Gues
10540 73 20 74 68 61 74 20 72 6f 77 69 64 3c 45 58 50  s that rowid<EXP
10550 52 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f  R eliminates two
10560 2d 74 68 69 72 64 73 20 6f 66 20 72 6f 77 73 20  -thirds of rows 
10570 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
10580 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
10590 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
105a0 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f  Ready, WO_GT|WO_
105b0 47 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  GE, 0) ){.      
105c0 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
105d0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
105e0 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b        cost /= 3;
105f0 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20    /* Guess that 
10600 72 6f 77 69 64 3e 45 58 50 52 20 65 6c 69 6d 69  rowid>EXPR elimi
10610 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73  nates two-thirds
10620 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20   of rows */.    
10630 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54    }.      WHERET
10640 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64  RACE(("... rowid
10650 20 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63   range reduces c
10660 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
10670 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  cost));.    }els
10680 65 7b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73  e{.      wsFlags
10690 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
106a0 6e 52 6f 77 20 3d 20 63 6f 73 74 3b 0a 20 20 0a  nRow = cost;.  .
106b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61      /* If the ta
106c0 62 6c 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f  ble scan does no
106d0 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  t satisfy the OR
106e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69  DER BY clause, i
106f0 6e 63 72 65 61 73 65 0a 20 20 20 20 2a 2a 20 74  ncrease.    ** t
10700 68 65 20 63 6f 73 74 20 62 79 20 4e 6c 6f 67 4e  he cost by NlogN
10710 20 74 6f 20 63 6f 76 65 72 20 74 68 65 20 65 78   to cover the ex
10720 70 65 6e 73 65 20 6f 66 20 73 6f 72 74 69 6e 67  pense of sorting
10730 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 72  . */.    if( pOr
10740 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
10750 66 28 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77  f( sortableByRow
10760 69 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42  id(iCur, pOrderB
10770 79 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  y, pWC->pMaskSet
10780 2c 20 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20  , &rev) ){.     
10790 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
107a0 45 52 45 5f 4f 52 44 45 52 42 59 7c 57 48 45 52  ERE_ORDERBY|WHER
107b0 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 20  E_ROWID_RANGE;. 
107c0 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29         if( rev )
107d0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c  {.          wsFl
107e0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56  ags |= WHERE_REV
107f0 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ERSE;.        }.
10800 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10810 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73       cost += cos
10820 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a  t*estLog(cost);.
10830 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
10840 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67  CE(("... sorting
10850 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20   increases cost 
10860 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  to %.9g\n", cost
10870 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
10880 7d 0a 20 20 20 20 69 66 28 20 63 6f 73 74 3c 70  }.    if( cost<p
10890 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20  Cost->rCost ){. 
108a0 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73       pCost->rCos
108b0 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20  t = cost;.      
108c0 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52  pCost->nRow = nR
108d0 6f 77 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  ow;.      pCost-
108e0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20  >plan.wsFlags = 
108f0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  wsFlags;.    }. 
10900 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
10910 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
10920 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 53 65 61  IZATION.  /* Sea
10930 72 63 68 20 66 6f 72 20 61 6e 20 4f 52 2d 63 6c  rch for an OR-cl
10940 61 75 73 65 20 74 68 61 74 20 63 61 6e 20 62 65  ause that can be
10950 20 75 73 65 64 20 74 6f 20 6c 6f 6f 6b 20 75 70   used to look up
10960 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f   the table..  */
10970 0a 20 20 6d 61 73 6b 53 72 63 20 3d 20 67 65 74  .  maskSrc = get
10980 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53  Mask(pWC->pMaskS
10990 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 66 6f 72  et, iCur);.  for
109a0 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
109b0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
109c0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
109d0 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65  .    WhereClause
109e0 20 74 65 6d 70 57 43 3b 0a 20 20 20 20 74 65 6d   tempWC;.    tem
109f0 70 57 43 20 3d 20 2a 70 57 43 3b 0a 20 20 20 20  pWC = *pWC;.    
10a00 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
10a10 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20  ator==WO_OR .   
10a20 20 20 20 20 20 26 26 20 28 28 70 54 65 72 6d 2d       && ((pTerm-
10a30 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61  >prereqAll & ~ma
10a40 73 6b 53 72 63 29 20 26 20 6e 6f 74 52 65 61 64  skSrc) & notRead
10a50 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26  y)==0.        &&
10a60 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   (pTerm->u.pOrIn
10a70 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20  fo->indexable & 
10a80 6d 61 73 6b 53 72 63 29 21 3d 30 20 29 7b 0a 20  maskSrc)!=0 ){. 
10a90 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
10aa0 20 2a 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d   *pOrWC = &pTerm
10ab0 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
10ac0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
10ad0 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20   *pOrTerm;.     
10ae0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 64 6f   int j;.      do
10af0 75 62 6c 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b  uble rTotal = 0;
10b00 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 30 3b  .      nRow = 0;
10b10 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
10b20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61  pOrTerm=pOrWC->a
10b30 3b 20 6a 3c 70 4f 72 57 43 2d 3e 6e 54 65 72 6d  ; j<pOrWC->nTerm
10b40 3b 20 6a 2b 2b 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; j++, pOrTerm++
10b50 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
10b60 43 6f 73 74 20 73 54 65 72 6d 43 6f 73 74 3b 0a  Cost sTermCost;.
10b70 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
10b80 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69  CE(("... Multi-i
10b90 6e 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67 20  ndex OR testing 
10ba0 66 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20 25  for term %d of %
10bb0 64 2e 2e 2e 2e 5c 6e 22 2c 20 6a 2c 69 29 29 3b  d....\n", j,i));
10bc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
10bd0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
10be0 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20  =WO_AND ){.     
10bf0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
10c00 20 2a 70 41 6e 64 57 43 20 3d 20 26 70 4f 72 54   *pAndWC = &pOrT
10c10 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d  erm->u.pAndInfo-
10c20 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >wc;.          b
10c30 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  estIndex(pParse,
10c40 20 70 41 6e 64 57 43 2c 20 70 53 72 63 2c 20 6e   pAndWC, pSrc, n
10c50 6f 74 52 65 61 64 79 2c 20 30 2c 20 26 73 54 65  otReady, 0, &sTe
10c60 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20  rmCost);.       
10c70 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
10c80 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
10c90 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
10ca0 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72    tempWC.a = pOr
10cb0 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
10cc0 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31  tempWC.nTerm = 1
10cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  ;.          best
10ce0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 74  Index(pParse, &t
10cf0 65 6d 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  empWC, pSrc, not
10d00 52 65 61 64 79 2c 20 30 2c 20 26 73 54 65 72 6d  Ready, 0, &sTerm
10d10 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cost);.        }
10d20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10d30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
10d40 20 20 7d 0a 20 20 20 20 20 20 20 20 72 54 6f 74    }.        rTot
10d50 61 6c 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e  al += sTermCost.
10d60 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 6e  rCost;.        n
10d70 52 6f 77 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74  Row += sTermCost
10d80 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69  .nRow;.        i
10d90 66 28 20 72 54 6f 74 61 6c 3e 3d 70 43 6f 73 74  f( rTotal>=pCost
10da0 2d 3e 72 43 6f 73 74 20 29 20 62 72 65 61 6b 3b  ->rCost ) break;
10db0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57  .      }.      W
10dc0 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
10dd0 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 63  multi-index OR c
10de0 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e  ost=%.9g nrow=%.
10df0 39 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  9g\n",.         
10e00 20 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 2c           rTotal,
10e10 20 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 69   nRow));.      i
10e20 66 28 20 72 54 6f 74 61 6c 3c 70 43 6f 73 74 2d  f( rTotal<pCost-
10e30 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  >rCost ){.      
10e40 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
10e50 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20   rTotal;.       
10e60 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e   pCost->nRow = n
10e70 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  Row;.        pCo
10e80 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
10e90 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
10ea0 52 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  R;.        pCost
10eb0 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 20 3d  ->plan.u.pTerm =
10ec0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
10ed0 69 66 28 20 70 4f 72 64 65 72 42 79 21 3d 30 0a  if( pOrderBy!=0.
10ee0 20 20 20 20 20 20 20 20 20 26 26 20 73 6f 72 74           && sort
10ef0 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72  ableByRowid(iCur
10f00 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 57 43 2d  , pOrderBy, pWC-
10f10 3e 70 4d 61 73 6b 53 65 74 2c 20 26 72 65 76 29  >pMaskSet, &rev)
10f20 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 72 65  .         && !re
10f30 76 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  v.        ){.   
10f40 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c         pCost->pl
10f50 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  an.wsFlags = WHE
10f60 52 45 5f 4f 52 44 45 52 42 59 7c 57 48 45 52 45  RE_ORDERBY|WHERE
10f70 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20  _MULTI_OR;.     
10f80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10f90 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
10fa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
10fb0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
10fc0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 53 72  .  /* If the pSr
10fd0 63 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72  c table is the r
10fe0 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
10ff0 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77  LEFT JOIN then w
11000 65 20 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75  e may not.  ** u
11010 73 65 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 73  se an index to s
11020 61 74 69 73 66 79 20 49 53 20 4e 55 4c 4c 20 63  atisfy IS NULL c
11030 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68  onstraints on th
11040 61 74 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  at table.  This 
11050 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  is.  ** because 
11060 63 6f 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e  columns might en
11070 64 20 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20  d up being NULL 
11080 69 66 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65  if the table doe
11090 73 20 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20  s not match -.  
110a0 2a 2a 20 61 20 63 69 72 63 75 6d 73 74 61 6e 63  ** a circumstanc
110b0 65 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65  e which the inde
110c0 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73  x cannot help us
110d0 20 64 69 73 63 6f 76 65 72 2e 20 20 54 69 63 6b   discover.  Tick
110e0 65 74 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20  et #2177..  */. 
110f0 20 69 66 28 20 28 70 53 72 63 2d 3e 6a 6f 69 6e   if( (pSrc->join
11100 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
11110 3d 30 20 29 7b 0a 20 20 20 20 65 71 54 65 72 6d  =0 ){.    eqTerm
11120 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
11130 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  IN;.  }else{.   
11140 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f   eqTermMask = WO
11150 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e  _EQ|WO_IN|WO_ISN
11160 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  ULL;.  }..  /* L
11170 6f 6f 6b 20 61 74 20 65 61 63 68 20 69 6e 64 65  ook at each inde
11180 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  x..  */.  if( pS
11190 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20  rc->pIndex ){.  
111a0 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
111b0 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 66  >pIndex;.  }.  f
111c0 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 50 72  or(; pProbe; pPr
111d0 6f 62 65 3d 28 70 53 72 63 2d 3e 70 49 6e 64 65  obe=(pSrc->pInde
111e0 78 20 3f 20 30 20 3a 20 70 50 72 6f 62 65 2d 3e  x ? 0 : pProbe->
111f0 70 4e 65 78 74 29 29 7b 0a 20 20 20 20 64 6f 75  pNext)){.    dou
11200 62 6c 65 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72  ble inMultiplier
11210 20 3d 20 31 3b 0a 0a 20 20 20 20 57 48 45 52 45   = 1;..    WHERE
11220 54 52 41 43 45 28 28 22 2e 2e 2e 20 69 6e 64 65  TRACE(("... inde
11230 78 20 25 73 3a 5c 6e 22 2c 20 70 50 72 6f 62 65  x %s:\n", pProbe
11240 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20  ->zName));..    
11250 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
11260 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
11270 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
11280 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 20   are satisfied. 
11290 20 20 20 2a 2a 20 62 79 20 78 3d 45 58 50 52 20     ** by x=EXPR 
112a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 78  constraints or x
112b0 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72   IN (...) constr
112c0 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  aints..    */.  
112d0 20 20 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20    wsFlags = 0;. 
112e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
112f0 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  robe->nColumn; i
11300 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
11310 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
11320 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54  umn[i];.      pT
11330 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
11340 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
11350 52 65 61 64 79 2c 20 65 71 54 65 72 6d 4d 61 73  Ready, eqTermMas
11360 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  k, pProbe);.    
11370 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
11380 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 77 73   break;.      ws
11390 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
113a0 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20  OLUMN_EQ;.      
113b0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
113c0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a  ator & WO_IN ){.
113d0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
113e0 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
113f0 70 72 3b 0a 20 20 20 20 20 20 20 20 77 73 46 6c  pr;.        wsFl
11400 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
11410 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20  UMN_IN;.        
11420 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
11430 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ct!=0 ){.       
11440 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20     inMultiplier 
11450 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 7d  *= 25;.        }
11460 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
11470 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b  pExpr->pList) ){
11480 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c  .          inMul
11490 74 69 70 6c 69 65 72 20 2a 3d 20 70 45 78 70 72  tiplier *= pExpr
114a0 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  ->pList->nExpr +
114b0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
114c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
114d0 6e 52 6f 77 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nRow = pProbe->a
114e0 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d  iRowEst[i] * inM
114f0 75 6c 74 69 70 6c 69 65 72 3b 0a 20 20 20 20 63  ultiplier;.    c
11500 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 65 73 74  ost = nRow * est
11510 4c 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65 72  Log(inMultiplier
11520 29 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b 0a  );.    nEq = i;.
11530 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
11540 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
11550 20 26 26 20 28 77 73 46 6c 61 67 73 20 26 20 57   && (wsFlags & W
11560 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d  HERE_COLUMN_IN)=
11570 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e  =0.         && n
11580 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq==pProbe->nCol
11590 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 77 73 46  umn ){.      wsF
115a0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
115b0 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  IQUE;.    }.    
115c0 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
115d0 2e 2e 2e 20 6e 45 71 3d 25 64 20 69 6e 4d 75 6c  ... nEq=%d inMul
115e0 74 3d 25 2e 39 67 20 63 6f 73 74 3d 25 2e 39 67  t=%.9g cost=%.9g
115f0 5c 6e 22 2c 6e 45 71 2c 69 6e 4d 75 6c 74 69 70  \n",nEq,inMultip
11600 6c 69 65 72 2c 63 6f 73 74 29 29 3b 0a 0a 20 20  lier,cost));..  
11610 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 61    /* Look for ra
11620 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nge constraints.
11630 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
11640 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  Eq<pProbe->nColu
11650 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  mn ){.      int 
11660 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  j = pProbe->aiCo
11670 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20  lumn[nEq];.     
11680 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
11690 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
116a0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
116b0 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
116c0 45 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  E, pProbe);.    
116d0 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
116e0 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
116f0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
11700 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66  ANGE;.        if
11710 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
11720 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
11730 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
11740 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20  pProbe) ){.     
11750 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
11760 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
11770 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20  .          cost 
11780 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20  /= 3;.          
11790 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20  nRow /= 3;.     
117a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
117b0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
117c0 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
117d0 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70  , WO_GT|WO_GE, p
117e0 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20  Probe) ){.      
117f0 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
11800 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
11810 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f            cost /
11820 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  = 3;.          n
11830 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20  Row /= 3;.      
11840 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52    }.        WHER
11850 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20  ETRACE(("...... 
11860 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f  range reduces co
11870 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
11880 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
11890 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
118a0 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   the additional 
118b0 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
118c0 69 66 20 74 68 61 74 20 69 73 20 61 20 66 61 63  if that is a fac
118d0 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
118e0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
118f0 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c 61        if( (wsFla
11900 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
11910 4e 5f 49 4e 29 3d 3d 30 20 26 26 0a 20 20 20 20  N_IN)==0 &&.    
11920 20 20 20 20 20 20 20 69 73 53 6f 72 74 69 6e 67         isSorting
11930 49 6e 64 65 78 28 70 50 61 72 73 65 2c 70 57 43  Index(pParse,pWC
11940 2d 3e 70 4d 61 73 6b 53 65 74 2c 70 50 72 6f 62  ->pMaskSet,pProb
11950 65 2c 69 43 75 72 2c 70 4f 72 64 65 72 42 79 2c  e,iCur,pOrderBy,
11960 6e 45 71 2c 26 72 65 76 29 20 29 7b 0a 20 20 20  nEq,&rev) ){.   
11970 20 20 20 20 20 69 66 28 20 77 73 46 6c 61 67 73       if( wsFlags
11980 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11990 20 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45   wsFlags = WHERE
119a0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20  _COLUMN_RANGE;. 
119b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
119c0 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
119d0 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20  E_ORDERBY;.     
119e0 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20     if( rev ){.  
119f0 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
11a00 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
11a10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11a30 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73   cost += cost*es
11a40 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20  tLog(cost);.    
11a50 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
11a60 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20  "...... orderby 
11a70 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 74  increases cost t
11a80 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
11a90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11aa0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
11ab0 6f 20 73 65 65 20 69 66 20 77 65 20 63 61 6e 20  o see if we can 
11ac0 67 65 74 20 61 77 61 79 20 77 69 74 68 20 75 73  get away with us
11ad0 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64  ing just the ind
11ae0 65 78 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a  ex without.    *
11af0 2a 20 65 76 65 72 20 72 65 61 64 69 6e 67 20 74  * ever reading t
11b00 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68  he table.  If th
11b10 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
11b20 74 68 65 6e 20 68 61 6c 76 65 20 74 68 65 0a 20  then halve the. 
11b30 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68     ** cost of th
11b40 69 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f  is index..    */
11b50 0a 20 20 20 20 69 66 28 20 77 73 46 6c 61 67 73  .    if( wsFlags
11b60 20 26 26 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65   && pSrc->colUse
11b70 64 20 3c 20 28 28 28 42 69 74 6d 61 73 6b 29 31  d < (((Bitmask)1
11b80 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20  )<<(BMS-1)) ){. 
11b90 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
11ba0 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a   pSrc->colUsed;.
11bb0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
11bc0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
11bd0 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  robe->nColumn; j
11be0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
11bf0 20 78 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43   x = pProbe->aiC
11c00 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
11c10 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b    if( x<BMS-1 ){
11c20 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d 20  .          m &= 
11c30 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  ~(((Bitmask)1)<<
11c40 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
11c50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11c60 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
11c70 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
11c80 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  _IDX_ONLY;.     
11c90 20 20 20 63 6f 73 74 20 2f 3d 20 32 3b 0a 20 20     cost /= 2;.  
11ca0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
11cb0 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e  (("...... idx-on
11cc0 6c 79 20 72 65 64 75 63 65 73 20 63 6f 73 74 20  ly reduces cost 
11cd0 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  to %.9g\n", cost
11ce0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
11cf0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
11d00 73 20 69 6e 64 65 78 20 68 61 73 20 61 63 68 69  s index has achi
11d10 65 76 65 64 20 74 68 65 20 6c 6f 77 65 73 74 20  eved the lowest 
11d20 63 6f 73 74 20 73 6f 20 66 61 72 2c 20 74 68 65  cost so far, the
11d30 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f  n use it..    */
11d40 0a 20 20 20 20 69 66 28 20 77 73 46 6c 61 67 73  .    if( wsFlags
11d50 21 3d 30 20 26 26 20 63 6f 73 74 20 3c 20 70 43  !=0 && cost < pC
11d60 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20  ost->rCost ){.  
11d70 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
11d80 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70   = cost;.      p
11d90 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f  Cost->nRow = nRo
11da0 77 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  w;.      pCost->
11db0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 77  plan.wsFlags = w
11dc0 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 43  sFlags;.      pC
11dd0 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20  ost->plan.nEq = 
11de0 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nEq;.      asser
11df0 74 28 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77  t( pCost->plan.w
11e00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
11e10 4e 44 45 58 45 44 20 29 3b 0a 20 20 20 20 20 20  NDEXED );.      
11e20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49  pCost->plan.u.pI
11e30 64 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20  dx = pProbe;.   
11e40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
11e50 6f 72 74 20 74 68 65 20 62 65 73 74 20 72 65 73  ort the best res
11e60 75 6c 74 0a 20 20 2a 2f 0a 20 20 70 43 6f 73 74  ult.  */.  pCost
11e70 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  ->plan.wsFlags |
11e80 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20  = eqTermMask;.  
11e90 57 48 45 52 45 54 52 41 43 45 28 28 22 62 65 73  WHERETRACE(("bes
11ea0 74 20 69 6e 64 65 78 20 69 73 20 25 73 2c 20 63  t index is %s, c
11eb0 6f 73 74 3d 25 2e 39 67 2c 20 6e 72 6f 77 3d 25  ost=%.9g, nrow=%
11ec0 2e 39 67 2c 20 77 73 46 6c 61 67 73 3d 25 78 2c  .9g, wsFlags=%x,
11ed0 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   nEq=%d\n",.    
11ee0 20 20 20 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e      (pCost->plan
11ef0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
11f00 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 3f 0a 20  _INDEXED)!=0 ?. 
11f10 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 73              pCos
11f20 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  t->plan.u.pIdx->
11f30 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e 65 29 22  zName : "(none)"
11f40 2c 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 2c 0a 20  , pCost->nRow,. 
11f50 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43         pCost->rC
11f60 6f 73 74 2c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e  ost, pCost->plan
11f70 2e 77 73 46 6c 61 67 73 2c 20 70 43 6f 73 74 2d  .wsFlags, pCost-
11f80 3e 70 6c 61 6e 2e 6e 45 71 29 29 3b 0a 7d 0a 0a  >plan.nEq));.}..
11f90 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61  ./*.** Disable a
11fa0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
11fb0 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65  RE clause.  Exce
11fc0 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62  pt, do not disab
11fd0 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69  le the term.** i
11fe0 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20  f it controls a 
11ff0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
12000 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f  and it did not o
12010 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
12020 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63  ON.** or USING c
12030 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f  lause of that jo
12040 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64  in..**.** Consid
12050 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a  er the term t2.z
12060 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c  ='ok' in the fol
12070 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a  lowing queries:.
12080 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c  **.**   (1)  SEL
12090 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
120a0 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
120b0 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32  .a=t2.x WHERE t2
120c0 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29  .z='ok'.**   (2)
120d0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
120e0 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
120f0 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  ON t1.a=t2.x AND
12100 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
12110 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (3)  SELECT * FR
12120 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20  OM t1, t2 WHERE 
12130 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
12140 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68  .z='ok'.**.** Th
12150 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64  e t2.z='ok' is d
12160 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69  isabled in the i
12170 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74  n (2) because it
12180 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69   originates.** i
12190 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  n the ON clause.
121a0 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69    The term is di
121b0 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65  sabled in (3) be
121c0 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20  cause it is not 
121d0 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46  part.** of a LEF
121e0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49  T OUTER JOIN.  I
121f0 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20  n (1), the term 
12200 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e  is not disabled.
12210 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67  .**.** Disabling
12220 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74   a term causes t
12230 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20  hat term to not 
12240 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65  be tested in the
12250 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
12260 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73  f the join.  Dis
12270 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74  abling is an opt
12280 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e  imization.  When
12290 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73   terms are satis
122a0 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63  fied.** by indic
122b0 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74  es, we disable t
122c0 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72  hem to prevent r
122d0 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69  edundant tests i
122e0 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c  n the inner.** l
122f0 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67  oop.  We would g
12300 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  et the correct r
12310 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e  esults if nothin
12320 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61  g were ever disa
12330 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69  bled,.** but joi
12340 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ns might run a l
12350 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54  ittle slower.  T
12360 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64  he trick is to d
12370 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a  isable as much.*
12380 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68  * as we can with
12390 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f  out disabling to
123a0 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64  o much.  If we d
123b0 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20  isabled in (1), 
123c0 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20  we'd get.** the 
123d0 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53  wrong answer.  S
123e0 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a  ee ticket #813..
123f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
12400 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65  isableTerm(Where
12410 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57  Level *pLevel, W
12420 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29  hereTerm *pTerm)
12430 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20  {.  if( pTerm.  
12440 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 28 70      && ALWAYS((p
12450 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
12460 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 29 0a  TERM_CODED)==0).
12470 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
12480 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c  ->iLeftJoin==0 |
12490 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
124a0 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
124b0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20  EP_FromJoin)).  
124c0 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  ){.    pTerm->wt
124d0 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
124e0 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
124f0 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
12500 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
12510 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
12520 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
12530 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
12540 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
12550 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
12560 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
12570 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
12580 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
12590 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
125a0 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74  pply the affinit
125b0 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
125c0 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6e 20  ith the first n 
125d0 63 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78  columns of index
125e0 0a 2a 2a 20 70 49 64 78 20 74 6f 20 74 68 65 20  .** pIdx to the 
125f0 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 6e 20  values in the n 
12600 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
12610 6e 67 20 61 74 20 62 61 73 65 2e 0a 2a 2f 0a 73  ng at base..*/.s
12620 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41  tatic void codeA
12630 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72  pplyAffinity(Par
12640 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
12650 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 49 6e 64  base, int n, Ind
12660 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28  ex *pIdx){.  if(
12670 20 6e 3e 30 20 29 7b 0a 20 20 20 20 56 64 62 65   n>0 ){.    Vdbe
12680 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
12690 64 62 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dbe;.    assert(
126a0 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c   v!=0 );.    sql
126b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
126c0 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62  , OP_Affinity, b
126d0 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  ase, n);.    sql
126e0 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
126f0 79 53 74 72 28 76 2c 20 70 49 64 78 29 3b 0a 20  yStr(v, pIdx);. 
12700 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
12710 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
12720 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  e(pParse, base, 
12730 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  n);.  }.}.../*.*
12740 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12750 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75  for a single equ
12760 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68  ality term of th
12770 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
12780 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   An equality.** 
12790 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68  term can be eith
127a0 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49  er X=expr or X I
127b0 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d  N (...).   pTerm
127c0 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20   is the term to 
127d0 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a  be .** coded..**
127e0 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20  .** The current 
127f0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f  value for the co
12800 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74  nstraint is left
12810 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
12820 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63  g..**.** For a c
12830 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65  onstraint of the
12840 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68   form X=expr, th
12850 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
12860 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74  evaluated and it
12870 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c  s.** result is l
12880 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  eft on the stack
12890 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e  .  For constrain
128a0 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  ts of the form X
128b0 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69   IN (...).** thi
128c0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
128d0 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  p a loop that wi
128e0 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ll iterate over 
128f0 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e  all values of X.
12900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
12910 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
12920 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12930 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
12940 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
12950 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
12960 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65  erm,   /* The te
12970 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
12980 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64  clause to be cod
12990 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  ed */.  WhereLev
129a0 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57  el *pLevel, /* W
129b0 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  hen level of the
129c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20   FROM clause we 
129d0 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
129e0 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20  /.  int iTarget 
129f0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d          /* Attem
12a00 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75  pt to leave resu
12a10 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69  lts in this regi
12a20 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
12a30 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
12a40 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20  Expr;.  Vdbe *v 
12a50 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
12a60 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20  .  int iReg;    
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12a80 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
12a90 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  g results */..  
12aa0 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e  assert( iTarget>
12ab0 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f  0 );.  if( pX->o
12ac0 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20  p==TK_EQ ){.    
12ad0 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  iReg = sqlite3Ex
12ae0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
12af0 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
12b00 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c   iTarget);.  }el
12b10 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  se if( pX->op==T
12b20 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
12b30 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
12b40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12b50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
12b60 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e  , 0, iReg);.#ifn
12b70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12b80 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65  SUBQUERY.  }else
12b90 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b  {.    int eType;
12ba0 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  .    int iTab;. 
12bb0 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
12bc0 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65   *pIn;..    asse
12bd0 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
12be0 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  N );.    iReg = 
12bf0 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79  iTarget;.    eTy
12c00 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
12c10 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
12c20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 54 61 62  pX, 0);.    iTab
12c30 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
12c40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12c50 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
12c60 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  d, iTab, 0);.   
12c70 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
12c80 20 22 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61   "%.*s", pX->spa
12c90 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29  n.n, pX->span.z)
12ca0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12cb0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
12cc0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
12cd0 42 4c 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70  BLE );.    if( p
12ce0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d  Level->u.in.nIn=
12cf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
12d00 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71  el->addrNxt = sq
12d10 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
12d20 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  el(v);.    }.   
12d30 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
12d40 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n++;.    pLevel-
12d50 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a  >u.in.aInLoop =.
12d60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
12d70 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50  ReallocOrFree(pP
12d80 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c  arse->db, pLevel
12d90 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a  ->u.in.aInLoop,.
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
12dc0 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69  zeof(pLevel->u.i
12dd0 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c  n.aInLoop[0])*pL
12de0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b  evel->u.in.nIn);
12df0 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65  .    pIn = pLeve
12e00 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b  l->u.in.aInLoop;
12e10 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a  .    if( pIn ){.
12e20 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65        pIn += pLe
12e30 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20  vel->u.in.nIn - 
12e40 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43  1;.      pIn->iC
12e50 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  ur = iTab;.     
12e60 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
12e70 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
12e80 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
12e90 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
12ea0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
12eb0 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67  owid, iTab, iReg
12ec0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12ed0 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
12ee0 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
12ef0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
12f00 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30  _Column, iTab, 0
12f10 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
12f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12f30 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
12f40 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20  sNull, iReg);.  
12f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
12f60 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
12f70 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 0;.    }.#endi
12f80 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54  f.  }.  disableT
12f90 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
12fa0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65  m);.  return iRe
12fb0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  g;.}../*.** Gene
12fc0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
12fd0 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c  ill evaluate all
12fe0 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
12ff0 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a  raints for an.**
13000 20 69 6e 64 65 78 2e 20 20 54 68 65 20 76 61 6c   index.  The val
13010 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73  ues for all cons
13020 74 72 61 69 6e 74 73 20 61 72 65 20 6c 65 66 74  traints are left
13030 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   on the stack..*
13040 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
13050 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65  , consider table
13060 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29   t1(a,b,c,d,e,f)
13070 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61   with index i1(a
13080 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73  ,b,c)..** Suppos
13090 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
130a0 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d  se is this:  a==
130b0 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c  5 AND b IN (1,2,
130c0 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63  3) AND c>5 AND c
130d0 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  <10.** The index
130e0 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20   has as many as 
130f0 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63  three equality c
13100 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20  onstraints, but 
13110 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70  in this.** examp
13120 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63  le, the third "c
13130 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  " value is an in
13140 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e  equality.  So on
13150 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74  ly two .** const
13160 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64  raints are coded
13170 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
13180 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f  will generate co
13190 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a  de to evaluate.*
131a0 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20  * a==5 and b IN 
131b0 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75  (1,2,3).  The cu
131c0 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
131d0 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65   a and b will be
131e0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f   stored.** in co
131f0 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
13200 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ers and the inde
13210 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  x of the first r
13220 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72  egister is retur
13230 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ned..**.** In th
13240 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20  e example above 
13250 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69  nEq==2.  But thi
13260 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72  s subroutine wor
13270 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65  ks for any value
13280 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75  .** of nEq inclu
13290 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d  ding 0.  If nEq=
132a0 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  =0, this routine
132b0 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d   is nearly a no-
132c0 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  op..** The only 
132d0 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73  thing it does is
132e0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c   allocate the pL
132f0 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72  evel->iMem memor
13300 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  y cell..**.** Th
13310 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79  is routine alway
13320 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c  s allocates at l
13330 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20  east one memory 
13340 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73  cell and returns
13350 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66  .** the index of
13360 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
13370 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  l. The code that
13380 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72  .** calls this r
13390 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20  outine will use 
133a0 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  that memory cell
133b0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65   to store the te
133c0 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79  rmination.** key
133d0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   value of the lo
133e0 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d  op.  If one or m
133f0 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  ore IN operators
13400 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a   appear, then.**
13410 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
13420 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74  locates an addit
13430 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79  ional nEq memory
13440 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72   cells for inter
13450 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73  nal.** use..*/.s
13460 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c  tatic int codeAl
13470 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
13480 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13490 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
134a0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
134b0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
134c0 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e  el,   /* Which n
134d0 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
134e0 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f  e FROM we are co
134f0 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43  ding */.  WhereC
13500 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
13510 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
13520 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  use */.  Bitmask
13530 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
13540 2a 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66  * Which parts of
13550 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79   FROM have not y
13560 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f  et been coded */
13570 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67  .  int nExtraReg
13580 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13590 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
135a0 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
135b0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  e */.){.  int nE
135c0 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  q = pLevel->plan
135d0 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65 20 6e  .nEq;   /* The n
135e0 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
135f0 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  N constraints to
13600 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20   code */.  Vdbe 
13610 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
13620 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
13630 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  vm under constru
13640 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78  ction */.  Index
13650 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
13660 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13670 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64  index being used
13680 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a   for this loop *
13690 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  /.  int iCur = p
136a0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20  Level->iTabCur; 
136b0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
136c0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
136d0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
136e0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
136f0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73  /* A single cons
13700 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  traint term */. 
13710 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13730 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
13740 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b  /.  int regBase;
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
13770 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  er */.  int nReg
13780 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13790 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
137a0 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
137b0 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 2f  allocate */..  /
137c0 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73  * This module is
137d0 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20   only called on 
137e0 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74  query plans that
137f0 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a   use an index. *
13800 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76  /.  assert( pLev
13810 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
13820 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
13830 20 29 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 65   );.  pIdx = pLe
13840 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
13850 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
13860 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
13870 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
13880 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
13890 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
138a0 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
138b0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
138c0 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Reg = pLevel->pl
138d0 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52  an.nEq + nExtraR
138e0 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  eg;.  pParse->nM
138f0 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 2f  em += nReg;..  /
13900 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
13910 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
13920 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
13930 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
13940 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a  >=nEq );.  for(j
13950 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
13960 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20  .    int r1;.   
13970 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61   int k = pIdx->a
13980 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
13990 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
139a0 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
139b0 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d  otReady, pLevel-
139c0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70  >plan.wsFlags, p
139d0 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 4e 45  Idx);.    if( NE
139e0 56 45 52 28 70 54 65 72 6d 3d 3d 30 29 20 29 20  VER(pTerm==0) ) 
139f0 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
13a00 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
13a10 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
13a20 3d 3d 30 20 29 3b 0a 20 20 20 20 72 31 20 3d 20  ==0 );.    r1 = 
13a30 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
13a40 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
13a50 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73 65 2b  pLevel, regBase+
13a60 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d  j);.    if( r1!=
13a70 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20  regBase+j ){.   
13a80 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29     if( nReg==1 )
13a90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13aa0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
13ab0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 29  pParse, regBase)
13ac0 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  ;.        regBas
13ad0 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65  e = r1;.      }e
13ae0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
13af0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13b00 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20  , OP_SCopy, r1, 
13b10 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
13b20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
13b30 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
13b40 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
13b50 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
13b60 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
13b70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
13b80 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
13b90 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
13ba0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29  O_ISNULL|WO_IN))
13bb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
13bc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13bd0 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
13be0 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e  Base+j, pLevel->
13bf0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a  addrBrk);.    }.
13c00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 67    }.  return reg
13c10 42 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Base;.}../*.** R
13c20 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
13c30 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 70 57  e WhereClause pW
13c40 43 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 74 65  C contains no te
13c50 72 6d 73 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  rms that.** are 
13c60 6e 6f 74 20 76 69 72 74 75 61 6c 20 61 6e 64 20  not virtual and 
13c70 77 68 69 63 68 20 68 61 76 65 20 6e 6f 74 20 62  which have not b
13c80 65 65 6e 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  een coded..**.**
13c90 20 54 6f 20 70 75 74 20 69 74 20 61 6e 6f 74 68   To put it anoth
13ca0 65 72 20 77 61 79 2c 20 72 65 74 75 72 6e 20 54  er way, return T
13cb0 52 55 45 20 69 66 20 6e 6f 20 61 64 64 69 74 69  RUE if no additi
13cc0 6f 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  onal WHERE claus
13cd0 65 73 0a 2a 2a 20 74 65 73 74 73 20 61 72 65 20  es.** tests are 
13ce0 72 65 71 75 69 72 65 64 20 69 6e 20 6f 72 64 65  required in orde
13cf0 72 20 74 6f 20 65 73 74 61 62 6c 69 73 68 20 74  r to establish t
13d00 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
13d10 72 6f 77 0a 2a 2a 20 73 68 6f 75 6c 64 20 67 6f  row.** should go
13d20 20 74 6f 20 6f 75 74 70 75 74 20 61 6e 64 20 72   to output and r
13d30 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
13d40 68 65 72 65 20 61 72 65 20 73 6f 6d 65 20 74 65  here are some te
13d50 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 57 48  rms of.** the WH
13d60 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
13d70 6e 65 65 64 20 74 6f 20 62 65 20 76 61 6c 69 64  need to be valid
13d80 61 74 65 64 20 62 65 66 6f 72 65 20 6f 75 74 70  ated before outp
13d90 75 74 69 6e 67 20 74 68 65 20 72 6f 77 2e 0a 2a  uting the row..*
13da0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
13db0 72 65 52 6f 77 52 65 61 64 79 46 6f 72 4f 75 74  reRowReadyForOut
13dc0 70 75 74 28 57 68 65 72 65 43 6c 61 75 73 65 20  put(WhereClause 
13dd0 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65 54 65  *pWC){.  WhereTe
13de0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
13df0 20 6a 3b 0a 20 0a 20 20 66 6f 72 28 70 54 65 72   j;. .  for(pTer
13e00 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
13e10 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
13e20 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
13e30 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
13e40 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
13e50 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 29  UAL|TERM_CODED))
13e60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
13e70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
13e80 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
13e90 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73  e code for the s
13ea0 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76  tart of the iLev
13eb0 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68  el-th loop in th
13ec0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
13ed0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
13ee0 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70 57   described by pW
13ef0 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Info..*/.static 
13f00 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c  Bitmask codeOneL
13f10 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65 72  oopStart(.  Wher
13f20 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
13f30 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66   /* Complete inf
13f40 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
13f50 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
13f60 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
13f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
13f80 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e  ch level of pWIn
13f90 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62  fo->a[] should b
13fa0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75 38 20  e coded */.  u8 
13fb0 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
13fc0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
13fd0 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
13fe0 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
13ff0 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  nt.h */.  Bitmas
14000 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f  k notReady     /
14010 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20 61  * Which tables a
14020 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  re currently ava
14030 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  ilable */.){.  i
14040 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  nt j, k;        
14050 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
14060 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
14070 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur;            /
14080 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
14090 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
140a0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74  */.  int addrNxt
140b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  ;         /* Whe
140c0 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f  re to jump to co
140d0 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
140e0 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a  next IN case */.
140f0 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b    int omitTable;
14100 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
14110 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64  f we use the ind
14120 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  ex only */.  int
14130 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
14140 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
14150 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20  need to scan in 
14160 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
14170 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
14180 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77  Level;  /* The w
14190 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65  here level to be
141a0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
141b0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
141c0 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f   /* Decompositio
141d0 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
141e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
141f0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
14200 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
14210 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61    /* A WHERE cla
14220 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61  use term */.  Pa
14230 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14250 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
14260 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
14270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
14290 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72  pared stmt under
142a0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a   constructions *
142b0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
142c0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
142d0 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
142e0 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f  se term being co
142f0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ded */.  int add
14300 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  rBrk;           
14310 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
14320 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
14330 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  ut of the loop *
14340 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
14350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14360 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
14370 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
14380 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  h next cycle */.
14390 20 20 69 6e 74 20 72 65 67 52 6f 77 53 65 74 3b    int regRowSet;
143a0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
143b0 72 6f 77 69 64 73 20 74 6f 20 74 68 69 73 20 52  rowids to this R
143c0 6f 77 53 65 74 20 69 66 20 6e 6f 6e 2d 6e 65 67  owSet if non-neg
143d0 61 74 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20 63  ative */.  int c
143e0 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 3b 20  odeRowSetEarly; 
143f0 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 64 65 78  /* True if index
14400 20 66 75 6c 6c 79 20 63 6f 6e 73 74 72 61 69 6e   fully constrain
14410 73 20 74 68 65 20 73 65 61 72 63 68 20 2a 2f 0a  s the search */.
14420 20 20 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70    ..  pParse = p
14430 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
14440 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
14450 62 65 3b 0a 20 20 70 57 43 20 3d 20 70 57 49 6e  be;.  pWC = pWIn
14460 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c 65 76 65  fo->pWC;.  pLeve
14470 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
14480 4c 65 76 65 6c 5d 3b 0a 20 20 70 54 61 62 49 74  Level];.  pTabIt
14490 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  em = &pWInfo->pT
144a0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
144b0 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72  ->iFrom];.  iCur
144c0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
144d0 72 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d 20 28  rsor;.  bRev = (
144e0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
144f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56  lags & WHERE_REV
14500 45 52 53 45 29 21 3d 30 3b 0a 20 20 6f 6d 69 74  ERSE)!=0;.  omit
14510 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d  Table = (pLevel-
14520 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
14530 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
14540 3d 30 3b 0a 20 20 72 65 67 52 6f 77 53 65 74 20  =0;.  regRowSet 
14550 3d 20 70 57 49 6e 66 6f 2d 3e 72 65 67 52 6f 77  = pWInfo->regRow
14560 53 65 74 3b 0a 20 20 63 6f 64 65 52 6f 77 53 65  Set;.  codeRowSe
14570 74 45 61 72 6c 79 20 3d 20 30 3b 0a 0a 20 20 2f  tEarly = 0;..  /
14580 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
14590 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20  for the "break" 
145a0 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69  and "continue" i
145b0 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a  nstructions.  **
145c0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
145d0 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20   loop.  Jump to 
145e0 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b  addrBrk to break
145f0 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a   out of a loop..
14600 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e    ** Jump to con
14610 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74  t to go immediat
14620 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ely to the next 
14630 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
14640 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  .  ** loop..  **
14650 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65  .  ** When there
14660 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
14670 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65  or, we also have
14680 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62   a "addrNxt" lab
14690 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61  el that.  ** mea
146a0 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  ns to continue w
146b0 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
146c0 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f  value combinatio
146d0 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68  n.  When.  ** th
146e0 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70  ere are no IN op
146f0 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63  erators in the c
14700 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20  onstraints, the 
14710 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a  "addrNxt" label.
14720 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
14730 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20   as "addrBrk".. 
14740 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20   */.  addrBrk = 
14750 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20  pLevel->addrBrk 
14760 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
14770 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
14780 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61  akeLabel(v);.  a
14790 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c  ddrCont = pLevel
147a0 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c  ->addrCont = sql
147b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
147c0 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  l(v);..  /* If t
147d0 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74  his is the right
147e0 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
147f0 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c   OUTER JOIN, all
14800 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69  ocate and.  ** i
14810 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f  nitialize a memo
14820 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63  ry cell that rec
14830 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62  ords if this tab
14840 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20  le matches any. 
14850 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c   ** row of the l
14860 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  eft table of the
14870 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   join..  */.  if
14880 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e  ( pLevel->iFrom>
14890 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30  0 && (pTabItem[0
148a0 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
148b0 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
148c0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
148d0 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
148e0 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
148f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14900 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76  Integer, 0, pLev
14910 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
14920 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
14930 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a  (v, "init LEFT J
14940 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61  OIN no-match fla
14950 67 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  g"));.  }..#ifnd
14960 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
14970 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
14980 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  (  (pLevel->plan
14990 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
149a0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
149b0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  0 ){.    /* Case
149c0 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69   0:  The table i
149d0 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  s a virtual-tabl
149e0 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c  e.  Use the VFil
149f0 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20  ter and VNext.  
14a00 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f    **          to
14a10 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
14a20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
14a30 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56   iReg;   /* P3 V
14a40 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c  alue for OP_VFil
14a50 74 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ter */.    sqlit
14a60 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
14a70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c  VtabIdx = pLevel
14a80 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64  ->plan.u.pVtabId
14a90 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  x;.    int nCons
14aa0 74 72 61 69 6e 74 20 3d 20 70 56 74 61 62 49 64  traint = pVtabId
14ab0 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  x->nConstraint;.
14ac0 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74      struct sqlit
14ad0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
14ae0 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61 67  int_usage *aUsag
14af0 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43      pVtabIdx->aC
14b30 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a  onstraintUsage;.
14b40 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74      const struct
14b50 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
14b60 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73  onstraint *aCons
14b70 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20  traint =.       
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64           pVtabId
14bb0 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  x->aConstraint;.
14bc0 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
14bd0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
14be0 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61  pParse, nConstra
14bf0 69 6e 74 2b 32 29 3b 0a 20 20 20 20 70 50 61 72  int+2);.    pPar
14c00 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
14c10 63 68 65 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 6a  che++;.    for(j
14c20 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69  =1; j<=nConstrai
14c30 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
14c40 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73  for(k=0; k<nCons
14c50 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20  traint; k++){.  
14c60 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65        if( aUsage
14c70 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a  [k].argvIndex==j
14c80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
14c90 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74  t iTerm = aConst
14ca0 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66  raint[k].iTermOf
14cb0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  fset;.          
14cc0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
14cd0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 20  disableColCache 
14ce0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
14cf0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
14d00 72 73 65 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72  rse, pWC->a[iTer
14d10 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m].pExpr->pRight
14d20 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20  , iReg+j+1);.   
14d30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14d40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14d50 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f        if( k==nCo
14d60 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b  nstraint ) break
14d70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
14d80 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  rt( pParse->disa
14d90 62 6c 65 43 6f 6c 43 61 63 68 65 20 29 3b 0a 20  bleColCache );. 
14da0 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
14db0 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20  leColCache--;.  
14dc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14dd0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
14de0 72 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78  r, pVtabIdx->idx
14df0 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Num, iReg);.    
14e00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14e10 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
14e20 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20   j-1, iReg+1);. 
14e30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14e40 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74  dOp4(v, OP_VFilt
14e50 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  er, iCur, addrBr
14e60 6b 2c 20 69 52 65 67 2c 20 70 56 74 61 62 49 64  k, iReg, pVtabId
14e70 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20 20  x->idxStr,.     
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e90 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54   pVtabIdx->needT
14ea0 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20 50 34  oFreeIdxStr ? P4
14eb0 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54  _MPRINTF : P4_ST
14ec0 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74 61 62  ATIC);.    pVtab
14ed0 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
14ee0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 66  dxStr = 0;.    f
14ef0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
14f00 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
14f10 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d     if( aUsage[j]
14f20 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  .omit ){.       
14f30 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
14f40 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72  nstraint[j].iTer
14f50 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
14f60 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
14f70 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54 65  vel, &pWC->a[iTe
14f80 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rm]);.      }.  
14f90 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
14fa0 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
14fb0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
14fc0 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
14fd0 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
14fe0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
14ff0 3b 0a 20 20 20 20 63 6f 64 65 52 6f 77 53 65 74  ;.    codeRowSet
15000 45 61 72 6c 79 20 3d 20 72 65 67 52 6f 77 53 65  Early = regRowSe
15010 74 3e 3d 30 20 3f 20 77 68 65 72 65 52 6f 77 52  t>=0 ? whereRowR
15020 65 61 64 79 46 6f 72 4f 75 74 70 75 74 28 70 57  eadyForOutput(pW
15030 43 29 20 3a 20 30 3b 0a 20 20 20 20 69 66 28 20  C) : 0;.    if( 
15040 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20  codeRowSetEarly 
15050 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15060 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15070 5f 56 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69  _VRowid, iCur, i
15080 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
15090 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
150a0 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 2c 20 72   OP_RowSetAdd, r
150b0 65 67 52 6f 77 53 65 74 2c 20 69 52 65 67 29 3b  egRowSet, iReg);
150c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
150d0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
150e0 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ge(pParse, iReg,
150f0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
15100 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
15110 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
15120 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
15130 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
15140 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
15150 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20  RE_ROWID_EQ ){. 
15160 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57     /* Case 1:  W
15170 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72  e can directly r
15180 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c  eference a singl
15190 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20  e row using an. 
151a0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65     **          e
151b0 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
151c0 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
151d0 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a  OWID field.  Or.
151e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
151f0 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c  we reference mul
15200 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67  tiple rows using
15210 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e   a "rowid IN (..
15220 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  .)".    **      
15230 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
15240 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31     */.    int r1
15250 3b 0a 20 20 20 20 69 6e 74 20 72 74 6d 70 20 3d  ;.    int rtmp =
15260 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
15270 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
15280 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
15290 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
152a0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
152b0 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61  WO_IN, 0);.    a
152c0 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
152d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
152e0 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29  Term->pExpr!=0 )
152f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
15300 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
15310 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 61 73 73  =iCur );.    ass
15320 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
15330 30 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f  0 );.    r1 = co
15340 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
15350 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
15360 65 76 65 6c 2c 20 72 74 6d 70 29 3b 0a 20 20 20  evel, rtmp);.   
15370 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
15380 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20  l->addrNxt;.    
15390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
153a0 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
153b0 74 2c 20 72 31 2c 20 61 64 64 72 4e 78 74 29 3b  t, r1, addrNxt);
153c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
153d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
153e0 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64  Exists, iCur, ad
153f0 64 72 4e 78 74 2c 20 72 31 29 3b 0a 20 20 20 20  drNxt, r1);.    
15400 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20  codeRowSetEarly 
15410 3d 20 28 70 57 43 2d 3e 6e 54 65 72 6d 3d 3d 31  = (pWC->nTerm==1
15420 20 26 26 20 72 65 67 52 6f 77 53 65 74 3e 3d 30   && regRowSet>=0
15430 29 20 3f 31 3a 30 3b 0a 20 20 20 20 69 66 28 20  ) ?1:0;.    if( 
15440 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20  codeRowSetEarly 
15450 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15460 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15470 5f 52 6f 77 53 65 74 41 64 64 2c 20 72 65 67 52  _RowSetAdd, regR
15480 6f 77 53 65 74 2c 20 72 31 29 3b 0a 20 20 20 20  owSet, r1);.    
15490 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  }.    sqlite3Rel
154a0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
154b0 73 65 2c 20 72 74 6d 70 29 3b 0a 20 20 20 20 56  se, rtmp);.    V
154c0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
154d0 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65  pk"));.    pLeve
154e0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
154f0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65  .  }else if( pLe
15500 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
15510 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s & WHERE_ROWID_
15520 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20  RANGE ){.    /* 
15530 43 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65  Case 2:  We have
15540 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
15550 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
15560 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
15570 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
15580 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
15590 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  op;.    int star
155a0 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e  t;.    int memEn
155b0 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  dValue = 0;.    
155c0 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
155d0 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61  t, *pEnd;..    a
155e0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
155f0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53 74 61 72  ==0 );.    pStar
15600 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  t = findTerm(pWC
15610 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
15620 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
15630 45 2c 20 30 29 3b 0a 20 20 20 20 70 45 6e 64 20  E, 0);.    pEnd 
15640 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
15650 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
15660 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c  dy, WO_LT|WO_LE,
15670 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65   0);.    if( bRe
15680 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  v ){.      pTerm
15690 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
156a0 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
156b0 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65        pEnd = pTe
156c0 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rm;.    }.    if
156d0 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
156e0 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
156f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
15700 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64  xpression that d
15710 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74  efines the start
15720 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
15730 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20  int r1, rTemp;  
15740 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
15750 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74  rs for holding t
15760 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72  he start boundar
15770 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  y */..      /* T
15780 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
15790 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78  stant maps TK_xx
157a0 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72   codes into corr
157b0 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20  esponding .     
157c0 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73   ** seek opcodes
157d0 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e  .  It depends on
157e0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72   a particular or
157f0 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a  dering of TK_xx.
15800 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
15810 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b  onst u8 aMoveOp[
15820 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
15830 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50   /* TK_GT */  OP
15840 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20  _SeekGt,.       
15850 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20      /* TK_LE */ 
15860 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20   OP_SeekLe,.    
15870 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20         /* TK_LT 
15880 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20  */  OP_SeekLt,. 
15890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
158a0 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65  GE */  OP_SeekGe
158b0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
158c0 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54  assert( TK_LE==T
158d0 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f  K_GT+1 );      /
158e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
158f0 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20  ordering.. */.  
15900 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
15910 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20  T==TK_GT+2 );   
15920 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68     /*  ... of th
15930 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e  e TK_xx values..
15940 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
15950 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b  t( TK_GE==TK_GT+
15960 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e  3 );      /*  ..
15970 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a  . is correcct. *
15980 2f 0a 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53  /..      pX = pS
15990 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  tart->pExpr;.   
159a0 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
159b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
159c0 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75  ( pStart->leftCu
159d0 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
159e0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
159f0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15a00 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
15a10 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20   &rTemp);.      
15a20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15a30 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d  3(v, aMoveOp[pX-
15a40 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72  >op-TK_GT], iCur
15a50 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a  , addrBrk, r1);.
15a60 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
15a70 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
15a80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15a90 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
15aa0 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31  ge(pParse, r1, 1
15ab0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15ac0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
15ad0 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20  Parse, rTemp);. 
15ae0 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
15af0 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29  (pLevel, pStart)
15b00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15b10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15b20 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f  dOp2(v, bRev ? O
15b30 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69  P_Last : OP_Rewi
15b40 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  nd, iCur, addrBr
15b50 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  k);.    }.    if
15b60 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ( pEnd ){.      
15b70 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20  Expr *pX;.      
15b80 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72  pX = pEnd->pExpr
15b90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15ba0 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pX!=0 );.      a
15bb0 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66  ssert( pEnd->lef
15bc0 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
15bd0 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c  .      memEndVal
15be0 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ue = ++pParse->n
15bf0 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
15c00 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
15c10 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d  e, pX->pRight, m
15c20 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20  emEndValue);.   
15c30 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54     if( pX->op==T
15c40 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  K_LT || pX->op==
15c50 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20  TK_GT ){.       
15c60 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
15c70 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a   OP_Le : OP_Ge;.
15c80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15c90 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
15ca0 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f  ev ? OP_Lt : OP_
15cb0 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Gt;.      }.    
15cc0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
15cd0 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20  evel, pEnd);.   
15ce0 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73   }.    start = s
15cf0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15d00 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c  tAddr(v);.    pL
15d10 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20  evel->op = bRev 
15d20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e  ? OP_Prev : OP_N
15d30 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ext;.    pLevel-
15d40 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
15d50 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61  pLevel->p2 = sta
15d60 72 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  rt;.    pLevel->
15d70 70 35 20 3d 20 28 70 53 74 61 72 74 3d 3d 30 20  p5 = (pStart==0 
15d80 26 26 20 70 45 6e 64 3d 3d 30 29 20 3f 31 3a 30  && pEnd==0) ?1:0
15d90 3b 0a 20 20 20 20 63 6f 64 65 52 6f 77 53 65 74  ;.    codeRowSet
15da0 45 61 72 6c 79 20 3d 20 72 65 67 52 6f 77 53 65  Early = regRowSe
15db0 74 3e 3d 30 20 3f 20 77 68 65 72 65 52 6f 77 52  t>=0 ? whereRowR
15dc0 65 61 64 79 46 6f 72 4f 75 74 70 75 74 28 70 57  eadyForOutput(pW
15dd0 43 29 20 3a 20 30 3b 0a 20 20 20 20 69 66 28 20  C) : 0;.    if( 
15de0 63 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20  codeRowSetEarly 
15df0 7c 7c 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  || testOp!=OP_No
15e00 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  op ){.      int 
15e10 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
15e20 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
15e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15e40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
15e50 77 69 64 2c 20 69 43 75 72 2c 20 72 31 29 3b 0a  wid, iCur, r1);.
15e60 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f 70        if( testOp
15e70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
15e80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15e90 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70  AddOp3(v, testOp
15ea0 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61  , memEndValue, a
15eb0 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
15ec0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15ed0 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
15ee0 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
15ef0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
15f00 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
15f10 20 20 20 69 66 28 20 63 6f 64 65 52 6f 77 53 65     if( codeRowSe
15f20 74 45 61 72 6c 79 20 29 7b 0a 20 20 20 20 20 20  tEarly ){.      
15f30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f40 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Op2(v, OP_RowSet
15f50 41 64 64 2c 20 72 65 67 52 6f 77 53 65 74 2c 20  Add, regRowSet, 
15f60 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r1);.      }.   
15f70 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
15f80 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15f90 20 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   r1);.    }.  }e
15fa0 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
15fb0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28  plan.wsFlags & (
15fc0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
15fd0 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  GE|WHERE_COLUMN_
15fe0 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  EQ) ){.    /* Ca
15ff0 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75 73 69  se 3: A scan usi
16000 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20  ng an index..   
16010 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
16020 20 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61     The WHERE cla
16030 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  use may contain 
16040 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75  zero or more equ
16050 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20  ality .    **   
16060 20 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d        terms ("==
16070 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74  " or "IN" operat
16080 6f 72 73 29 20 74 68 61 74 20 72 65 66 65 72 20  ors) that refer 
16090 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20  to the N.    ** 
160a0 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73          left-mos
160b0 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  t columns of the
160c0 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61   index. It may a
160d0 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  lso contain.    
160e0 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71 75  **         inequ
160f0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
16100 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c  s (>, <, >= or <
16110 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65  =) on the indexe
16120 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  d.    **        
16130 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d   column that imm
16140 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73  ediately follows
16150 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65   the N equalitie
16160 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20  s. Only .    ** 
16170 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
16180 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61  t-most column ca
16190 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  n be an inequali
161a0 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75  ty - the rest mu
161b0 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  st.    **       
161c0 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61    use the "==" a
161d0 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  nd "IN" operator
161e0 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
161f0 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20  if the .    **  
16200 20 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20         index is 
16210 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e  on (x,y,z), then
16220 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
16230 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a  lauses are all .
16240 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f      **         o
16250 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a  ptimized:.    **
16260 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
16270 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20     x=5.    **   
16280 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
16290 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y=10.    **    
162a0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
162b0 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
162c0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
162d0 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20  >5 AND y<10.    
162e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
162f0 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c  5 AND y=5 AND z<
16300 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  =10.    **.    *
16310 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c  *         The z<
16320 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66  10 term of the f
16330 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20  ollowing cannot 
16340 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20  be used, only.  
16350 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
16360 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a   x=5 term:.    *
16370 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
16380 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30      x=5 AND z<10
16390 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
163a0 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20         N may be 
163b0 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
163c0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
163d0 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a  straints..    **
163e0 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72           If ther
163f0 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c  e are no inequal
16400 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
16410 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20   then N is at.  
16420 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61    **         lea
16430 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20  st one..    **. 
16440 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
16450 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20  is case is also 
16460 75 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  used when there 
16470 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  are no WHERE cla
16480 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  use.    **      
16490 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62     constraints b
164a0 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73  ut an index is s
164b0 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20  elected anyway, 
164c0 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20  in order.    ** 
164d0 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65          to force
164e0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65   the output orde
164f0 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20  r to conform to 
16500 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20  an ORDER BY..   
16510 20 2a 2f 20 20 0a 20 20 20 20 69 6e 74 20 61 53   */  .    int aS
16520 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  tartOp[] = {.   
16530 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20     0,.      0,. 
16540 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20       OP_Rewind, 
16550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
16560 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
16570 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
16580 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  &  !bRev) */.   
16590 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20     OP_Last,     
165a0 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21          /* 3: (!
165b0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
165c0 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
165d0 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
165e0 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20   OP_SeekGt,     
165f0 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61        /* 4: (sta
16600 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
16610 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21  && !startEq && !
16620 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
16630 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20  P_SeekLt,       
16640 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74      /* 5: (start
16650 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
16660 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52   !startEq &&  bR
16670 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
16680 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20  SeekGe,         
16690 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63    /* 6: (start_c
166a0 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
166b0 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76  startEq && !bRev
166c0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
166d0 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20 20  ekLe            
166e0 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 7: (start_con
166f0 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
16700 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
16710 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
16720 74 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20  t aEndOp[] = {. 
16730 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20       OP_Noop,   
16740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
16750 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74  (!end_constraint
16760 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  s) */.      OP_I
16770 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxGE,           
16780 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 1: (end_cons
16790 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76  traints && !bRev
167a0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
167b0 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  xLT             
167c0 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 2: (end_const
167d0 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29 20  raints && bRev) 
167e0 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
167f0 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e  t nEq = pLevel->
16800 70 6c 61 6e 2e 6e 45 71 3b 0a 20 20 20 20 69 6e  plan.nEq;.    in
16810 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30  t isMinQuery = 0
16820 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
16830 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   this is an opti
16840 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e  mized SELECT min
16850 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  (x).. */.    int
16860 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
16870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73            /* Bas
16880 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
16890 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61  ng constraint va
168a0 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lues */.    int 
168b0 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
168c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
168d0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20   register */.   
168e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
168f0 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a  geStart = 0;  /*
16900 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
16910 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
16920 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65  start */.    Whe
16930 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e  reTerm *pRangeEn
16940 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65  d = 0;    /* Ine
16950 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
16960 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20  nt at range end 
16970 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
16980 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
16990 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
169a0 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73 20  ange start uses 
169b0 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
169c0 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20      int endEq;  
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169e0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
169f0 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e  e end uses ==, >
16a00 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
16a10 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  nt start_constra
16a20 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53  ints;       /* S
16a30 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73  tart of range is
16a40 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a   constrained */.
16a50 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
16a60 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
16a70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
16a80 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a  nstraint terms *
16a90 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
16aa0 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  x;         /* Th
16ab0 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
16ac0 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
16ad0 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
16ae0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
16af0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
16b00 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
16b10 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20   nExtraReg = 0; 
16b20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
16b30 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e  xtra registers n
16b40 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  eeded */.    int
16b50 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
16b60 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
16b70 20 6f 70 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20   opcode */..    
16b80 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
16b90 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20  lan.u.pIdx;.    
16ba0 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
16bb0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 6b  ->iIdxCur;.    k
16bc0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
16bd0 6e 5b 6e 45 71 5d 3b 20 20 20 20 20 2f 2a 20 43  n[nEq];     /* C
16be0 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61  olumn for inequa
16bf0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
16c00 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   */..    /* If t
16c10 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69  his loop satisfi
16c20 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20  es a sort order 
16c30 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65  (pOrderBy) reque
16c40 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20  st that .    ** 
16c50 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
16c60 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69  is function to i
16c70 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45  mplement a "SELE
16c80 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a  CT min(x) ..." .
16c90 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68      ** query, th
16ca0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  en the caller wi
16cb0 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68  ll only allow th
16cc0 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f  e loop to run fo
16cd0 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c  r.    ** a singl
16ce0 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  e iteration. Thi
16cf0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
16d00 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72   first row retur
16d10 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  ned.    ** shoul
16d20 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c  d not have a NUL
16d30 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  L value stored i
16d40 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e  n 'x'. If column
16d50 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74   'x' is.    ** t
16d60 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74  he first one aft
16d70 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  er the nEq equal
16d80 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
16d90 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20  in the index,.  
16da0 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72    ** this requir
16db0 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20  es some special 
16dc0 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f  handling..    */
16dd0 0a 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46  .    if( (wctrlF
16de0 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
16df0 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20  BY_MIN)!=0.     
16e00 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  && (pLevel->plan
16e10 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  .wsFlags&WHERE_O
16e20 52 44 45 52 42 59 29 0a 20 20 20 20 20 26 26 20  RDERBY).     && 
16e30 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e  (pIdx->nColumn>n
16e40 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
16e50 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64   /* assert( pOrd
16e60 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  erBy->nExpr==1 )
16e70 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73  ; */.      /* as
16e80 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
16e90 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[0].pExpr->iCol
16ea0 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
16eb0 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20  umn[nEq] ); */. 
16ec0 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20       isMinQuery 
16ed0 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
16ee0 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
16ef0 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
16f00 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
16f10 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
16f20 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
16f30 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
16f40 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
16f50 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
16f60 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
16f70 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
16f80 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45  ){.      pRangeE
16f90 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  nd = findTerm(pW
16fa0 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
16fb0 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f  eady, (WO_LT|WO_
16fc0 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  LE), pIdx);.    
16fd0 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
16fe0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
16ff0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
17000 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
17010 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
17020 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66 69 6e  RangeStart = fin
17030 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
17040 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57   k, notReady, (W
17050 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64  O_GT|WO_GE), pId
17060 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  x);.      nExtra
17070 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
17080 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
17090 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
170a0 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
170b0 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
170c0 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20  r IN.    ** and 
170d0 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73  store the values
170e0 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
170f0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
17100 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
17110 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42  starting at regB
17120 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
17130 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c  regBase = codeAl
17140 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70  lEqualityTerms(p
17150 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70  Parse, pLevel, p
17160 57 43 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45  WC, notReady, nE
17170 78 74 72 61 52 65 67 29 3b 0a 20 20 20 20 61 64  xtraReg);.    ad
17180 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
17190 61 64 64 72 4e 78 74 3b 0a 0a 0a 20 20 20 20 2f  addrNxt;...    /
171a0 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
171b0 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65  g a reverse orde
171c0 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63  r scan on an asc
171d0 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72  ending index, or
171e0 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72  .    ** a forwar
171f0 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  d order scan on 
17200 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
17210 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20  ex, interchange 
17220 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  the .    ** star
17230 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20  t and end terms 
17240 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64  (pRangeStart and
17250 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20   pRangeEnd)..   
17260 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 52 65 76   */.    if( bRev
17270 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  ==(pIdx->aSortOr
17280 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
17290 5f 53 4f 5f 41 53 43 29 20 29 7b 0a 20 20 20 20  _SO_ASC) ){.    
172a0 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d    SWAP(WhereTerm
172b0 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70   *, pRangeEnd, p
172c0 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
172d0 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65   }..    testcase
172e0 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
172f0 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
17300 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20  perator & WO_LE 
17310 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
17320 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
17330 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
17340 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
17350 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
17360 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61  pRangeEnd && pRa
17370 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
17380 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
17390 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
173a0 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e  eEnd && pRangeEn
173b0 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
173c0 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73 74 61 72  O_GE );.    star
173d0 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61  tEq = !pRangeSta
173e0 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72  rt || pRangeStar
173f0 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  t->eOperator & (
17400 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
17410 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61    endEq =   !pRa
17420 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65  ngeEnd || pRange
17430 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
17440 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
17450 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
17460 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74  aints = pRangeSt
17470 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20  art || nEq>0;.. 
17480 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69     /* Seek the i
17490 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74  ndex cursor to t
174a0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
174b0 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43  range. */.    nC
174c0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
174d0 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53  .    if( pRangeS
174e0 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  tart ){.      in
174f0 74 20 64 63 63 20 3d 20 70 50 61 72 73 65 2d 3e  t dcc = pParse->
17500 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3b  disableColCache;
17510 0a 20 20 20 20 20 20 69 66 28 20 70 52 61 6e 67  .      if( pRang
17520 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  eEnd ){.        
17530 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
17540 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20  olCache++;.     
17550 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
17560 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
17570 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45   pRangeStart->pE
17580 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 72 65 67  xpr->pRight, reg
17590 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
175a0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
175b0 43 6f 6c 43 61 63 68 65 20 3d 20 64 63 63 3b 0a  ColCache = dcc;.
175c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
175d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
175e0 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45  Null, regBase+nE
175f0 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
17600 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
17610 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
17620 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20  isMinQuery ){.  
17630 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17640 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
17650 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
17660 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
17670 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
17680 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
17690 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
176a0 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
176b0 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
176c0 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
176d0 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
176e0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 6f 70 20  , pIdx);.    op 
176f0 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72  = aStartOp[(star
17700 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32  t_constraints<<2
17710 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29  ) + (startEq<<1)
17720 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73   + bRev];.    as
17730 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20  sert( op!=0 );. 
17740 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17750 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20  =OP_Rewind );.  
17760 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17770 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74  OP_Last );.    t
17780 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
17790 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65  SeekGt );.    te
177a0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
177b0 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73  eekGe );.    tes
177c0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
177d0 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74  ekLe );.    test
177e0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
177f0 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  kLt );.    sqlit
17800 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17810 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
17820 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 0a  rNxt, regBase, .
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17840 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54        SQLITE_INT
17850 5f 54 4f 5f 50 54 52 28 6e 43 6f 6e 73 74 72 61  _TO_PTR(nConstra
17860 69 6e 74 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  int), P4_INT32);
17870 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
17880 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
17890 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
178a0 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64  raint at the end
178b0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   of the.    ** r
178c0 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20  ange (if any).. 
178d0 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74     */.    nConst
178e0 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
178f0 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29   if( pRangeEnd )
17900 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
17910 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
17920 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72  pRangeEnd->pExpr
17930 2d 3e 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  ->pRight, regBas
17940 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 73 71  e+nEq);.      sq
17950 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17960 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
17970 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
17980 78 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 41  xt);.      codeA
17990 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
179a0 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45  rse, regBase, nE
179b0 71 2b 31 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  q+1, pIdx);.    
179c0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
179d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
179e0 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62  op of the loop b
179f0 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65  ody */.    pLeve
17a00 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
17a10 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
17a20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
17a30 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75   if the index cu
17a40 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65  rsor is past the
17a50 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67   end of the rang
17a60 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61  e. */.    op = a
17a70 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64  EndOp[(pRangeEnd
17a80 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20   || nEq) * (1 + 
17a90 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74  bRev)];.    test
17aa0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f  case( op==OP_Noo
17ab0 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  p );.    testcas
17ac0 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20  e( op==OP_IdxGE 
17ad0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
17ae0 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b   op==OP_IdxLT );
17af0 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f  .    if( op!=OP_
17b00 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Noop ){.      sq
17b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17b20 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
17b30 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
17b40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17b50 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17b60 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 43 6f 6e  _INT_TO_PTR(nCon
17b70 73 74 72 61 69 6e 74 29 2c 20 50 34 5f 49 4e 54  straint), P4_INT
17b80 33 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  32);.      sqlit
17b90 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
17ba0 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31  , endEq!=bRev ?1
17bb0 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  :0);.    }..    
17bc0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
17bd0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
17be0 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68  raints, check th
17bf0 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  at the value.   
17c00 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
17c10 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
17c20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74   inequality cont
17c30 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c  rains is not NUL
17c40 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20  L..    ** If it 
17c50 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  is, jump to the 
17c60 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
17c70 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20  f the loop..    
17c80 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69  */.    r1 = sqli
17c90 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
17ca0 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63  arse);.    testc
17cb0 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ase( pLevel->pla
17cc0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
17cd0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20  E_BTM_LIMIT );. 
17ce0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
17cf0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
17d00 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
17d10 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 70  MIT );.    if( p
17d20 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
17d30 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
17d40 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
17d50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20  _LIMIT) ){.     
17d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17d70 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
17d80 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72   iIdxCur, nEq, r
17d90 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
17da0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17db0 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64  P_IsNull, r1, ad
17dc0 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 0a  drCont);.    }..
17dd0 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
17de0 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66  table cursor, if
17df0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
17e00 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
17e10 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74  vel, pRangeStart
17e20 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  );.    disableTe
17e30 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
17e40 65 45 6e 64 29 3b 0a 20 20 20 20 63 6f 64 65 52  eEnd);.    codeR
17e50 6f 77 53 65 74 45 61 72 6c 79 20 3d 20 72 65 67  owSetEarly = reg
17e60 52 6f 77 53 65 74 3e 3d 30 20 3f 20 77 68 65 72  RowSet>=0 ? wher
17e70 65 52 6f 77 52 65 61 64 79 46 6f 72 4f 75 74 70  eRowReadyForOutp
17e80 75 74 28 70 57 43 29 20 3a 20 30 3b 0a 20 20 20  ut(pWC) : 0;.   
17e90 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20   if( !omitTable 
17ea0 7c 7c 20 63 6f 64 65 52 6f 77 53 65 74 45 61 72  || codeRowSetEar
17eb0 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ly ){.      sqli
17ec0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17ed0 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49   OP_IdxRowid, iI
17ee0 64 78 43 75 72 2c 20 72 31 29 3b 0a 20 20 20 20  dxCur, r1);.    
17ef0 20 20 69 66 28 20 63 6f 64 65 52 6f 77 53 65 74    if( codeRowSet
17f00 45 61 72 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  Early ){.       
17f10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17f20 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 41  p2(v, OP_RowSetA
17f30 64 64 2c 20 72 65 67 52 6f 77 53 65 74 2c 20 72  dd, regRowSet, r
17f40 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
17f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17f60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17f70 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 72 31 29  _Seek, iCur, r1)
17f80 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73  ;  /* Deferred s
17f90 65 65 6b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  eek */.      }. 
17fa0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
17fb0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
17fc0 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20  Parse, r1);..   
17fd0 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
17fe0 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
17ff0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
18000 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a   loop. Disable .
18010 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61      ** WHERE cla
18020 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72  use terms made r
18030 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20  edundant by the 
18040 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e  index range scan
18050 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 65  ..    */.    pLe
18060 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
18070 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
18080 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
18090 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
180a0 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
180b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
180c0 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
180d0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
180e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
180f0 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a  LTI_OR ){.    /*
18100 20 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f 72   Case 4:  Two or
18110 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79   more separately
18120 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
18130 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20  onnected by OR. 
18140 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
18150 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
18160 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
18170 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a  LE t1(a,b,c,d);.
18180 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
18190 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
181a0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
181b0 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
181c0 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(b);.    **   C
181d0 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f  REATE INDEX i3 O
181e0 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a  N t1(c);.    **.
181f0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
18200 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
18210 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63  a=5 OR b=7 OR (c
18220 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20  =11 AND d=13).  
18230 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74    **.    ** In t
18240 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72  he example, ther
18250 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65  e are three inde
18260 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
18270 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a  ted by OR..    *
18280 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65  * The top of the
18290 20 6c 6f 6f 70 20 69 73 20 63 6f 6e 73 74 72 75   loop is constru
182a0 63 74 65 64 20 62 79 20 63 72 65 61 74 69 6e 67  cted by creating
182b0 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
182c0 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 70 75  .    ** and popu
182d0 6c 61 74 69 6e 67 20 69 74 2e 20 20 54 68 65 6e  lating it.  Then
182e0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 6c   looping over el
182f0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f  ements of the ro
18300 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  wset..    **.   
18310 20 2a 2a 20 20 20 20 20 20 20 20 4e 75 6c 6c 20   **        Null 
18320 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  1.    **        
18330 23 20 66 69 6c 6c 20 52 6f 77 53 65 74 20 31 20  # fill RowSet 1 
18340 77 69 74 68 20 65 6e 74 72 69 65 73 20 77 68 65  with entries whe
18350 72 65 20 61 3d 35 20 75 73 69 6e 67 20 69 31 0a  re a=5 using i1.
18360 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 23 20      **        # 
18370 66 69 6c 6c 20 52 6f 77 73 65 74 20 31 20 77 69  fill Rowset 1 wi
18380 74 68 20 65 6e 74 72 69 65 73 20 77 68 65 72 65  th entries where
18390 20 62 3d 37 20 75 73 69 6e 67 20 69 32 0a 20 20   b=7 using i2.  
183a0 20 20 2a 2a 20 20 20 20 20 20 20 20 23 20 66 69    **        # fi
183b0 6c 6c 20 52 6f 77 73 65 74 20 31 20 77 69 74 68  ll Rowset 1 with
183c0 20 65 6e 74 72 69 65 73 20 77 68 65 72 65 20 63   entries where c
183d0 3d 31 31 20 61 6e 64 20 64 3d 31 33 20 69 33 20  =11 and d=13 i3 
183e0 61 6e 64 20 74 31 0a 20 20 20 20 2a 2a 20 20 20  and t1.    **   
183f0 20 20 41 3a 20 52 6f 77 53 65 74 52 65 61 64 20    A: RowSetRead 
18400 31 2c 20 42 2c 20 32 0a 20 20 20 20 2a 2a 20 20  1, B, 2.    **  
18410 20 20 20 20 20 20 53 65 65 6b 20 20 20 20 20 20        Seek      
18420 20 69 2c 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20   i, 2.    **.   
18430 20 2a 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   ** The bottom o
18440 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
18450 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
18460 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
18470 20 47 6f 74 6f 20 20 20 20 20 20 20 30 2c 20 41   Goto       0, A
18480 0a 20 20 20 20 2a 2a 20 20 20 20 20 42 3a 0a 20  .    **     B:. 
18490 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65     */.    int re
184a0 67 4f 72 52 6f 77 73 65 74 3b 20 20 20 20 20 20  gOrRowset;      
184b0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
184c0 64 69 6e 67 20 74 68 65 20 52 6f 77 53 65 74 20  ding the RowSet 
184d0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e  object */.    in
184e0 74 20 72 65 67 4e 65 78 74 52 6f 77 69 64 3b 20  t regNextRowid; 
184f0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
18500 20 68 6f 6c 64 69 6e 67 20 6e 65 78 74 20 72 6f   holding next ro
18510 77 69 64 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  wid */.    Where
18520 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
18530 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75    /* The OR-clau
18540 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  se broken out in
18550 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
18560 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
18570 72 54 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 73  rTerm;    /* A s
18580 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 77 69  ingle subterm wi
18590 74 68 69 6e 20 74 68 65 20 4f 52 2d 63 6c 61 75  thin the OR-clau
185a0 73 65 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73  se */.    SrcLis
185b0 74 20 6f 6e 65 54 61 62 3b 20 20 20 20 20 20 20  t oneTab;       
185c0 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61   /* Shortened ta
185d0 62 6c 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 0a  ble list */.   .
185e0 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76      pTerm = pLev
185f0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d  el->plan.u.pTerm
18600 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
18610 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
18620 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
18630 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b  erator==WO_OR );
18640 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
18650 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
18660 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29  ERM_ORINFO)!=0 )
18670 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70  ;.    pOrWc = &p
18680 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
18690 3e 77 63 3b 0a 20 20 20 20 63 6f 64 65 52 6f 77  >wc;.    codeRow
186a0 53 65 74 45 61 72 6c 79 20 3d 20 28 72 65 67 52  SetEarly = (regR
186b0 6f 77 53 65 74 3e 3d 30 20 26 26 20 70 57 43 2d  owSet>=0 && pWC-
186c0 3e 6e 54 65 72 6d 3d 3d 31 29 20 3f 31 3a 30 3b  >nTerm==1) ?1:0;
186d0 0a 0a 20 20 20 20 69 66 28 20 63 6f 64 65 52 6f  ..    if( codeRo
186e0 77 53 65 74 45 61 72 6c 79 20 29 7b 0a 20 20 20  wSetEarly ){.   
186f0 20 20 20 72 65 67 4f 72 52 6f 77 73 65 74 20 3d     regOrRowset =
18700 20 72 65 67 52 6f 77 53 65 74 3b 0a 20 20 20 20   regRowSet;.    
18710 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 67  }else{.      reg
18720 4f 72 52 6f 77 73 65 74 20 3d 20 73 71 6c 69 74  OrRowset = sqlit
18730 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
18740 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
18750 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18760 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
18770 4f 72 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d  OrRowset);.    }
18780 0a 20 20 20 20 6f 6e 65 54 61 62 2e 6e 53 72 63  .    oneTab.nSrc
18790 20 3d 20 31 3b 0a 20 20 20 20 6f 6e 65 54 61 62   = 1;.    oneTab
187a0 2e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20  .nAlloc = 1;.   
187b0 20 6f 6e 65 54 61 62 2e 61 5b 30 5d 20 3d 20 2a   oneTab.a[0] = *
187c0 70 54 61 62 49 74 65 6d 3b 0a 20 20 20 20 66 6f  pTabItem;.    fo
187d0 72 28 6a 3d 30 2c 20 70 4f 72 54 65 72 6d 3d 70  r(j=0, pOrTerm=p
187e0 4f 72 57 63 2d 3e 61 3b 20 6a 3c 70 4f 72 57 63  OrWc->a; j<pOrWc
187f0 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 4f  ->nTerm; j++, pO
18800 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
18810 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57  WhereInfo *pSubW
18820 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
18830 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
18840 73 6f 72 21 3d 69 43 75 72 20 26 26 20 70 4f 72  sor!=iCur && pOr
18850 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
18860 3d 57 4f 5f 41 4e 44 20 29 20 63 6f 6e 74 69 6e  =WO_AND ) contin
18870 75 65 3b 0a 20 20 20 20 20 20 70 53 75 62 57 49  ue;.      pSubWI
18880 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
18890 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
188a0 26 6f 6e 65 54 61 62 2c 20 70 4f 72 54 65 72 6d  &oneTab, pOrTerm
188b0 2d 3e 70 45 78 70 72 2c 20 30 2c 0a 20 20 20 20  ->pExpr, 0,.    
188c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188d0 20 20 20 20 57 48 45 52 45 5f 46 49 4c 4c 5f 52      WHERE_FILL_R
188e0 4f 57 53 45 54 20 7c 20 57 48 45 52 45 5f 4f 4d  OWSET | WHERE_OM
188f0 49 54 5f 4f 50 45 4e 20 7c 20 57 48 45 52 45 5f  IT_OPEN | WHERE_
18900 4f 4d 49 54 5f 43 4c 4f 53 45 2c 0a 20 20 20 20  OMIT_CLOSE,.    
18910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18920 20 20 20 20 72 65 67 4f 72 52 6f 77 73 65 74 29      regOrRowset)
18930 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 75 62  ;.      if( pSub
18940 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  WInfo ){.       
18950 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
18960 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20  (pSubWInfo);.   
18970 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
18980 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
18990 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f  eLabel(v, addrCo
189a0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 21 63 6f  nt);.    if( !co
189b0 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20 29 7b  deRowSetEarly ){
189c0 0a 20 20 20 20 20 20 72 65 67 4e 65 78 74 52 6f  .      regNextRo
189d0 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  wid = sqlite3Get
189e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
189f0 0a 20 20 20 20 20 20 61 64 64 72 43 6f 6e 74 20  .      addrCont 
18a00 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  = .         sqli
18a10 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
18a20 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 2c 20   OP_RowSetRead, 
18a30 72 65 67 4f 72 52 6f 77 73 65 74 2c 61 64 64 72  regOrRowset,addr
18a40 42 72 6b 2c 72 65 67 4e 65 78 74 52 6f 77 69 64  Brk,regNextRowid
18a50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18a60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18a70 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 72 65 67  _Seek, iCur, reg
18a80 4e 65 78 74 52 6f 77 69 64 29 3b 0a 20 20 20 20  NextRowid);.    
18a90 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18aa0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
18ab0 72 65 67 4e 65 78 74 52 6f 77 69 64 29 3b 0a 20  regNextRowid);. 
18ac0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 52       /* sqlite3R
18ad0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
18ae0 61 72 73 65 2c 20 72 65 67 4f 72 52 6f 77 73 65  arse, regOrRowse
18af0 74 29 3b 20 2f 2f 20 50 72 65 73 65 72 76 65 20  t); // Preserve 
18b00 74 68 65 20 52 6f 77 53 65 74 20 2a 2f 0a 20 20  the RowSet */.  
18b10 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
18b20 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 20 20 20 20   OP_Goto;.      
18b30 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 61 64 64  pLevel->p2 = add
18b40 72 43 6f 6e 74 3b 0a 20 20 20 20 7d 65 6c 73 65  rCont;.    }else
18b50 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
18b60 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
18b70 20 20 7d 0a 20 20 20 20 64 69 73 61 62 6c 65 54    }.    disableT
18b80 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
18b90 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  m);.  }else.#end
18ba0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
18bb0 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
18bc0 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a  N */..  {.    /*
18bd0 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20   Case 5:  There 
18be0 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
18bf0 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
18c00 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  a complete.    *
18c10 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20  *          scan 
18c20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61  of the entire ta
18c30 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
18c40 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
18c50 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
18c60 72 74 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a 20  rt( bRev==0 );. 
18c70 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
18c80 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  OP_Next;.    pLe
18c90 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
18ca0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
18cb0 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
18cc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
18cd0 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ind, iCur, addrB
18ce0 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  rk);.    pLevel-
18cf0 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
18d00 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
18d10 5f 53 54 45 50 3b 0a 20 20 20 20 63 6f 64 65 52  _STEP;.    codeR
18d20 6f 77 53 65 74 45 61 72 6c 79 20 3d 20 30 3b 0a  owSetEarly = 0;.
18d30 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79 20 26    }.  notReady &
18d40 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e  = ~getMask(pWC->
18d50 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  pMaskSet, iCur);
18d60 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f  ..  /* Insert co
18d70 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79  de to test every
18d80 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74   subexpression t
18d90 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  hat can be compl
18da0 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75  etely.  ** compu
18db0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75  ted using the cu
18dc0 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62  rrent set of tab
18dd0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20  les..  */.  k = 
18de0 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
18df0 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54  WC->a, j=pWC->nT
18e00 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
18e10 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
18e20 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63  r *pE;.    testc
18e30 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
18e40 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
18e50 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  AL );.    testca
18e60 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
18e70 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
18e80 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
18e90 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
18ea0 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
18eb0 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
18ec0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
18ed0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
18ee0 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e  tReady)!=0 ) con
18ef0 74 69 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20  tinue;.    pE = 
18f00 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
18f10 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
18f20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
18f30 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20  l->iLeftJoin && 
18f40 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
18f50 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
18f60 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69  ) ){.      conti
18f70 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nue;.    }.    p
18f80 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
18f90 6c 43 61 63 68 65 20 2b 3d 20 6b 3b 0a 20 20 20  lCache += k;.   
18fa0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
18fb0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20  lse(pParse, pE, 
18fc0 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
18fd0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
18fe0 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
18ff0 65 43 6f 6c 43 61 63 68 65 20 2d 3d 20 6b 3b 0a  eColCache -= k;.
19000 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20 70      k = 1;.    p
19010 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
19020 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d   TERM_CODED;.  }
19030 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
19040 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
19050 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
19060 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
19070 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
19080 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
19090 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
190a0 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
190b0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
190c0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
190d0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
190e0 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
190f0 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
19100 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
19110 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
19120 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19130 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
19140 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
19150 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
19160 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
19170 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
19180 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c     sqlite3ExprCl
19190 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  earColumnCache(p
191a0 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Parse, pLevel->i
191b0 54 61 62 43 75 72 29 3b 0a 20 20 20 20 73 71 6c  TabCur);.    sql
191c0 69 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c  ite3ExprClearCol
191d0 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
191e0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
191f0 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  );.    for(pTerm
19200 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c  =pWC->a, j=0; j<
19210 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  pWC->nTerm; j++,
19220 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
19230 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
19240 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
19250 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
19260 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
19270 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
19280 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20  M_CODED );.     
19290 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
192a0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
192b0 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
192c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
192d0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
192e0 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
192f0 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  dy)!=0 ) continu
19300 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
19310 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
19320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19330 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
19340 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
19350 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
19360 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
19370 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
19380 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
19390 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
193a0 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 77 61 73  *.  ** If it was
193b0 20 72 65 71 75 65 73 74 65 64 20 74 6f 20 73 74   requested to st
193c0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
193d0 69 6e 20 61 20 72 6f 77 73 65 74 20 61 6e 64 20  in a rowset and 
193e0 74 68 61 74 20 68 61 73 0a 20 20 2a 2a 20 6e 6f  that has.  ** no
193f0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64  t already been d
19400 6f 2c 20 74 68 65 6e 20 64 6f 20 73 6f 20 6e 6f  o, then do so no
19410 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  w..  */.  if( re
19420 67 52 6f 77 53 65 74 3e 3d 30 20 26 26 20 21 63  gRowSet>=0 && !c
19430 6f 64 65 52 6f 77 53 65 74 45 61 72 6c 79 20 29  odeRowSetEarly )
19440 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73  {.    int r1 = s
19450 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19460 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
19470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
19480 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
19490 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  f(  (pLevel->pla
194a0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
194b0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
194c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
194d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
194e0 20 4f 50 5f 56 52 6f 77 69 64 2c 20 69 43 75 72   OP_VRowid, iCur
194f0 2c 20 72 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , r1);.    }else
19500 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
19510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19520 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
19530 64 2c 20 69 43 75 72 2c 20 72 31 29 3b 0a 20 20  d, iCur, r1);.  
19540 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
19550 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19560 52 6f 77 53 65 74 41 64 64 2c 20 72 65 67 52 6f  RowSetAdd, regRo
19570 77 53 65 74 2c 20 72 31 29 3b 0a 20 20 20 20 73  wSet, r1);.    s
19580 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
19590 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
195a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
195b0 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66  notReady;.}..#if
195c0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
195d0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TEST)./*.** The 
195e0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
195f0 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20  le holds a text 
19600 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71  description of q
19610 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61  uery plan genera
19620 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f  ted.** by the mo
19630 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74  st recent call t
19640 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
19650 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c  gin().  Each cal
19660 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a  l to WhereBegin.
19670 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ** overwrites th
19680 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69  e previous.  Thi
19690 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
196a0 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
196b0 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69  g and.** analysi
196c0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20  s only..*/.char 
196d0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
196e0 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f  an[BMS*2*40];  /
196f0 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f  * Text of the jo
19700 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  in */.static int
19710 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20   nQPlan = 0;    
19720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
19730 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f  t free slow in _
19740 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a  query_plan[] */.
19750 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19760 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  E_TEST */.../*.*
19770 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
19780 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
19790 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
197a0 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65  eInfoFree(sqlite
197b0 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f  3 *db, WhereInfo
197c0 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28   *pWInfo){.  if(
197d0 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 69   pWInfo ){.    i
197e0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
197f0 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
19800 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
19810 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
19820 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49  nfo *pInfo = pWI
19830 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e  nfo->a[i].pIdxIn
19840 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
19850 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 61  nfo ){.        a
19860 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65  ssert( pInfo->ne
19870 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d  edToFreeIdxStr==
19880 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
19890 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
198a0 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64   if( pInfo->need
198b0 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a  ToFreeIdxStr ){.
198c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
198d0 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64  3_free(pInfo->id
198e0 78 53 74 72 29 3b 0a 09 7d 0a 20 20 20 20 20 20  xStr);..}.      
198f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19900 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20  db, pInfo);.    
19910 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68    }.    }.    wh
19920 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 70  ereClauseClear(p
19930 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 20  WInfo->pWC);.   
19940 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19950 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
19960 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
19970 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  te the beginning
19980 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65   of the loop use
19990 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
199a0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
199b0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
199c0 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
199d0 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72  to an opaque str
199e0 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
199f0 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ains.** informat
19a00 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65  ion needed to te
19a10 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
19a20 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61  .  Later, the ca
19a30 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
19a40 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
19a50 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
19a60 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
19a70 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
19a80 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72  unction.** in or
19a90 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
19aa0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
19ab0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
19ac0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
19ad0 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74  ccurs, this rout
19ae0 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
19af0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
19b00 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20  c idea is to do 
19b10 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f  a nested loop, o
19b20 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68  ne loop for each
19b30 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65   table in.** the
19b40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
19b50 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45  a select.  (INSE
19b60 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  RT and UPDATE st
19b70 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  atements are the
19b80 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45  .** same as a SE
19b90 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61  LECT with only a
19ba0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
19bb0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19bc0 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  .)  For.** examp
19bd0 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69  le, if the SQL i
19be0 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  s this:.**.**   
19bf0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
19c00 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
19c10 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68  RE ...;.**.** Th
19c20 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  en the code gene
19c30 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74  rated is concept
19c40 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66  ually like the f
19c50 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
19c60 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
19c70 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20  1 in t1 do      
19c80 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
19c90 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66  ated.**        f
19ca0 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
19cb0 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79  2 do      |-- by
19cc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
19cd0 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  in().**         
19ce0 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e   foreach row3 in
19cf0 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20   t3 do   /.**   
19d00 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
19d10 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20           end    
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
19d40 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65  ated.**        e
19d50 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
19d60 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79            |-- by
19d70 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
19d80 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20  ().**      end  
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e         /.**.** N
19db0 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f  ote that the loo
19dc0 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ps might not be 
19dd0 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72  nested in the or
19de0 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
19df0 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74  y.** appear in t
19e00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
19e10 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  f a different or
19e20 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62  der is better ab
19e30 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73  le to make.** us
19e40 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e  e of indices.  N
19e50 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68  ote also that wh
19e60 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  en the IN operat
19e70 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a  or appears in.**
19e80 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
19e90 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75  e, it might resu
19ea0 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  lt in additional
19eb0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f   nested loops fo
19ec0 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68  r.** scanning th
19ed0 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73  rough all values
19ee0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
19ef0 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
19f00 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  N..**.** There a
19f10 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73  re Btree cursors
19f20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
19f30 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31   each table.  t1
19f40 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20   uses cursor.** 
19f50 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d  number pTabList-
19f60 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20  >a[0].iCursor.  
19f70 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73  t2 uses the curs
19f80 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  or pTabList->a[1
19f90 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e  ].iCursor..** An
19fa0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69  d so forth.  Thi
19fb0 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
19fc0 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  tes code to open
19fd0 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73   those VDBE curs
19fe0 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ors.** and sqlit
19ff0 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e  e3WhereEnd() gen
1a000 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
1a010 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a  to close them..*
1a020 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
1a030 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  at sqlite3WhereB
1a040 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73  egin() generates
1a050 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
1a060 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20  ors named.** in 
1a070 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e  pTabList pointin
1a080 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f  g at their appro
1a090 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20  priate entries. 
1a0a0 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a   The [...] code.
1a0b0 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f  ** can use OP_Co
1a0c0 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69  lumn and OP_Rowi
1a0d0 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  d opcodes on the
1a0e0 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78  se cursors to ex
1a0f0 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72  tract.** data fr
1a100 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  om the various t
1a110 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f  ables of the loo
1a120 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
1a130 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
1a140 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61  empty, the forea
1a150 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61  ch loops must ea
1a160 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a  ch scan their.**
1a170 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20   entire tables. 
1a180 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61   Thus a three-wa
1a190 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e  y join is an O(N
1a1a0 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ^3) operation.  
1a1b0 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  But if.** the ta
1a1c0 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65  bles have indice
1a1d0 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
1a1e0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
1a1f0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a  RE clause that.*
1a200 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65  * refer to those
1a210 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70   indices, a comp
1a220 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20  lete table scan 
1a230 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61  can be avoided a
1a240 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  nd the.** code w
1a250 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73  ill run much fas
1a260 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68  ter.  Most of th
1a270 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72  e work of this r
1a280 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69  outine is checki
1a290 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ng.** to see if 
1a2a0 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65  there are indice
1a2b0 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
1a2c0 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74  ed to speed up t
1a2d0 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  he loop..**.** T
1a2e0 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
1a2f0 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73  E clause are als
1a300 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  o used to limit 
1a310 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61  which rows actua
1a320 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74  lly.** make it t
1a330 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74  o the "..." in t
1a340 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
1a350 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61   loop.  After ea
1a360 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a  ch "foreach",.**
1a370 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
1a380 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
1a390 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69  use only terms i
1a3a0 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20  n that loop and 
1a3b0 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61  outer.** loops a
1a3c0 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  re evaluated and
1a3d0 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70   if false a jump
1a3e0 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20   is made around 
1a3f0 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
1a400 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f  * inner loops (o
1a410 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e  r around the "..
1a420 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f  ." if the test o
1a430 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
1a440 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20   inner-.** most 
1a450 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45  loop).**.** OUTE
1a460 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e  R JOINS.**.** An
1a470 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74   outer join of t
1a480 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20  ables t1 and t2 
1a490 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63  is conceptally c
1a4a0 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  oded as follows:
1a4b0 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63  .**.**    foreac
1a4c0 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a  h row1 in t1 do.
1a4d0 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30  **      flag = 0
1a4e0 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
1a4f0 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a   row2 in t2 do.*
1a500 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a  *        start:.
1a510 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a  **          ....
1a520 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  **          flag
1a530 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64   = 1.**      end
1a540 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67  .**      if flag
1a550 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ==0 then.**     
1a560 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32     move the row2
1a570 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c   cursor to a nul
1a580 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  l row.**        
1a590 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20  goto start.**   
1a5a0 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a     fi.**    end.
1a5b0 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43  **.** ORDER BY C
1a5c0 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47  LAUSE PROCESSING
1a5d0 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42  .**.** *ppOrderB
1a5e0 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
1a5f0 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
1a600 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1a610 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
1a620 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
1a630 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
1a640 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1a650 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
1a660 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
1a670 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
1a680 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
1a690 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64 65  ent, then ppOrde
1a6a0 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
1a6b0 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  ** If an index c
1a6c0 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68  an be used so th
1a6d0 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f  at the natural o
1a6e0 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74  utput order of t
1a6f0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e  he table.** scan
1a700 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20   is correct for 
1a710 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1a720 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69  use, then that i
1a730 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64  ndex is used and
1a740 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69  .** *ppOrderBy i
1a750 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20  s set to NULL.  
1a760 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
1a770 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65  ization that pre
1a780 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65  vents an.** unne
1a790 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20  cessary sort of 
1a7a0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  the result set i
1a7b0 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f  f an index appro
1a7c0 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a 2a  priate for the.*
1a7d0 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
1a7e0 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
1a7f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
1a800 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70  here clause loop
1a810 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61  s cannot be arra
1a820 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  nged to provide 
1a830 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f  the correct.** o
1a840 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65  utput order, the
1a850 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42 79  n the *ppOrderBy
1a860 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
1a870 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
1a880 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
1a890 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1a8a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1a8b0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
1a8c0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
1a8d0 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69  List,    /* A li
1a8e0 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  st of all tables
1a8f0 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
1a900 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
1a910 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
1a920 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1a930 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  .  ExprList **pp
1a940 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e 20 4f  OrderBy, /* An O
1a950 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
1a960 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 38 20  or NULL */.  u8 
1a970 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
1a980 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
1a990 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
1a9a0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
1a9b0 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 72  Int.h */.  int r
1a9c0 65 67 52 6f 77 53 65 74 20 20 20 20 20 20 20 20  egRowSet        
1a9d0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1a9e0 64 20 52 6f 77 53 65 74 20 69 66 20 57 48 45 52  d RowSet if WHER
1a9f0 45 5f 46 49 4c 4c 5f 52 4f 57 53 45 54 20 69 73  E_FILL_ROWSET is
1aa00 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   set */.){.  int
1aa10 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1aa20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1aa30 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57 68 65  counter */.  Whe
1aa40 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
1aa50 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
1aa60 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
1aa70 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
1aa80 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
1aa90 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1aaa0 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
1aab0 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
1aac0 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74   engine */.  Bit
1aad0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
1aae0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
1aaf0 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
1ab00 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
1ab10 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
1ab20 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
1ab30 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
1ab40 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
1ab50 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
1ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ab70 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20  * Decomposition 
1ab80 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1ab90 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1aba0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
1abb0 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69  abItem;  /* A si
1abc0 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  ngle entry from 
1abd0 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
1abe0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1abf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ac00 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
1ac10 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69  in the pWInfo li
1ac20 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  st */.  int iFro
1ac30 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1ac40 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1ac50 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61   unused FROM cla
1ac60 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  use element */. 
1ac70 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20   int andFlags;  
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1ac90 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ND-ed combinatio
1aca0 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b  n of all pWC->a[
1acb0 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73  ].wtFlags */.  s
1acc0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
1acd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1ace0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1acf0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1ad00 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20  pOrderBy = 0;.. 
1ad10 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1ad20 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
1ad30 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
1ad40 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75  imited by the nu
1ad50 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74  mber of.  ** bit
1ad60 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a  s in a Bitmask .
1ad70 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c    */.  if( pTabL
1ad80 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b  ist->nSrc>BMS ){
1ad90 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1ada0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74  rMsg(pParse, "at
1adb0 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20   most %d tables 
1adc0 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29  in a join", BMS)
1add0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1ade0 20 20 7d 0a 0a 20 20 69 66 28 20 70 70 4f 72 64    }..  if( ppOrd
1adf0 65 72 42 79 20 29 7b 0a 20 20 20 20 70 4f 72 64  erBy ){.    pOrd
1ae00 65 72 42 79 20 3d 20 2a 70 70 4f 72 64 65 72 42  erBy = *ppOrderB
1ae10 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  y;.  }..  /* All
1ae20 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
1ae30 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
1ae40 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
1ae50 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
1ae60 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
1ae70 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d  lue..  */.  db =
1ae80 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
1ae90 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  WInfo = sqlite3D
1aea0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1aeb0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1aec0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57          sizeof(W
1aed0 68 65 72 65 49 6e 66 6f 29 0a 20 20 20 20 20 20  hereInfo).      
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aef0 2b 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  + (pTabList->nSr
1af00 63 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72  c-1)*sizeof(Wher
1af10 65 4c 65 76 65 6c 29 0a 20 20 20 20 20 20 20 20  eLevel).        
1af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
1af30 73 69 7a 65 6f 66 28 57 68 65 72 65 43 6c 61 75  sizeof(WhereClau
1af40 73 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  se).            
1af50 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
1af60 6f 66 28 57 68 65 72 65 4d 61 73 6b 53 65 74 29  of(WhereMaskSet)
1af70 0a 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  .           );. 
1af80 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1af90 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
1afa0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
1afb0 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  r;.  }.  pWInfo-
1afc0 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62 4c 69  >nLevel = pTabLi
1afd0 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57 49 6e  st->nSrc;.  pWIn
1afe0 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
1aff0 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
1b000 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
1b010 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  st;.  pWInfo->iB
1b020 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
1b030 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1b040 20 20 70 57 49 6e 66 6f 2d 3e 72 65 67 52 6f 77    pWInfo->regRow
1b050 53 65 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67  Set = (wctrlFlag
1b060 73 20 26 20 57 48 45 52 45 5f 46 49 4c 4c 5f 52  s & WHERE_FILL_R
1b070 4f 57 53 45 54 29 20 3f 20 72 65 67 52 6f 77 53  OWSET) ? regRowS
1b080 65 74 20 3a 20 2d 31 3b 0a 20 20 70 57 49 6e 66  et : -1;.  pWInf
1b090 6f 2d 3e 70 57 43 20 3d 20 70 57 43 20 3d 20 28  o->pWC = pWC = (
1b0a0 57 68 65 72 65 43 6c 61 75 73 65 2a 29 26 70 57  WhereClause*)&pW
1b0b0 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  Info->a[pWInfo->
1b0c0 6e 4c 65 76 65 6c 5d 3b 0a 20 20 70 57 49 6e 66  nLevel];.  pWInf
1b0d0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  o->wctrlFlags = 
1b0e0 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 4d  wctrlFlags;.  pM
1b0f0 61 73 6b 53 65 74 20 3d 20 28 57 68 65 72 65 4d  askSet = (WhereM
1b100 61 73 6b 53 65 74 2a 29 26 70 57 43 5b 31 5d 3b  askSet*)&pWC[1];
1b110 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65  ..  /* Split the
1b120 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
1b130 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65  to separate sube
1b140 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65  xpressions where
1b150 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78   each.  ** subex
1b160 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
1b170 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20  rated by an AND 
1b180 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
1b190 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61   initMaskSet(pMa
1b1a0 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43  skSet);.  whereC
1b1b0 6c 61 75 73 65 49 6e 69 74 28 70 57 43 2c 20 70  lauseInit(pWC, p
1b1c0 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29  Parse, pMaskSet)
1b1d0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1b1e0 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61  odeConstants(pPa
1b1f0 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  rse, pWhere);.  
1b200 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20  whereSplit(pWC, 
1b210 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
1b220 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69  .    .  /* Speci
1b230 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45  al case: a WHERE
1b240 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
1b250 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75  constant.  Evalu
1b260 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70  ate the.  ** exp
1b270 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68  ression and eith
1b280 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c  er jump over all
1b290 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20   of the code or 
1b2a0 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a  fall thru..  */.
1b2b0 20 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20    if( pWhere && 
1b2c0 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
1b2d0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70  =0 || sqlite3Exp
1b2e0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
1b2f0 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20  in(pWhere)) ){. 
1b300 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1b310 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57  False(pParse, pW
1b320 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  here, pWInfo->iB
1b330 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  reak, SQLITE_JUM
1b340 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57  PIFNULL);.    pW
1b350 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  here = 0;.  }.. 
1b360 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74   /* Assign a bit
1b370 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73   from the bitmas
1b380 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  k to every term 
1b390 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1b3a0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  se..  **.  ** Wh
1b3b0 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74  en assigning bit
1b3c0 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46  mask values to F
1b3d0 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f  ROM clause curso
1b3e0 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20  rs, it must be. 
1b3f0 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61   ** the case tha
1b400 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  t if X is the bi
1b410 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d  tmask for the N-
1b420 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
1b430 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  erm then.  ** th
1b440 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
1b450 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  l FROM clause te
1b460 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  rms to the left 
1b470 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d  of the N-th term
1b480 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20  .  ** is (X-1). 
1b490 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20    An expression 
1b4a0 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
1b4b0 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
1b4c0 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69  N can use.  ** i
1b4d0 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  ts Expr.iRightJo
1b4e0 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f  inTable value to
1b4f0 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73   find the bitmas
1b500 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  k of the right t
1b510 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  able.  ** of the
1b520 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74   join.  Subtract
1b530 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ing one from the
1b540 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74   right table bit
1b550 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a  mask gives a.  *
1b560 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  * bitmask for al
1b570 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
1b580 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
1b590 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62  .  Knowing the b
1b5a0 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20  itmask.  ** for 
1b5b0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
1b5c0 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
1b5d0 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61   join is importa
1b5e0 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
1b5f0 35 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  5..  */.  for(i=
1b600 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
1b610 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Src; i++){.    c
1b620 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53  reateMask(pMaskS
1b630 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
1b640 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  i].iCursor);.  }
1b650 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1b660 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20    {.    Bitmask 
1b670 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20  toTheLeft = 0;. 
1b680 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
1b690 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1b6a0 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  +){.      Bitmas
1b6b0 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k m = getMask(pM
1b6c0 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
1b6d0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
1b6e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1b6f0 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20  m-1)==toTheLeft 
1b700 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65  );.      toTheLe
1b710 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20  ft |= m;.    }. 
1b720 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1b730 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
1b740 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
1b750 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78  s.  Note that ex
1b760 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68  prAnalyze() migh
1b770 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76  t.  ** add new v
1b780 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74  irtual terms ont
1b790 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1b7a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1b7b0 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77  We do not.  ** w
1b7c0 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74  ant to analyze t
1b7d0 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65 72  hese virtual ter
1b7e0 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61  ms, so start ana
1b7f0 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e  lyzing at the en
1b800 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20  d.  ** and work 
1b810 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74 20  forward so that 
1b820 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61  the added virtua
1b830 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65  l terms are neve
1b840 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  r processed..  *
1b850 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  /.  exprAnalyzeA
1b860 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43  ll(pTabList, pWC
1b870 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
1b880 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1b890 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
1b8a0 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Error;.  }..  /*
1b8b0 20 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20   Chose the best 
1b8c0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
1b8d0 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
1b8e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
1b8f0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
1b900 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65  oop fills in the
1b910 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
1b920 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70  s:.  **.  **   p
1b930 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20  WInfo->a[].pIdx 
1b940 20 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74       The index t
1b950 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c  o use for this l
1b960 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70  evel of the loop
1b970 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  ..  **   pWInfo-
1b980 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20 20 20 57  >a[].wsFlags   W
1b990 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61  HERE_xxx flags a
1b9a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1b9b0 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  Idx.  **   pWInf
1b9c0 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20  o->a[].nEq      
1b9d0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
1b9e0 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
1b9f0 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e  ints.  **   pWIn
1ba00 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20  fo->a[].iFrom   
1ba10 20 20 57 68 69 63 68 20 74 65 72 6d 20 6f 66 20    Which term of 
1ba20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ba30 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20  is being coded. 
1ba40 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
1ba50 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20  ].iTabCur   The 
1ba60 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
1ba70 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
1ba80 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  le.  **   pWInfo
1ba90 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20  ->a[].iIdxCur   
1baa0 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1bab0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20  for the index.  
1bac0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
1bad0 2e 70 54 65 72 6d 20 20 20 20 20 57 68 65 6e 20  .pTerm     When 
1bae0 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20  wsFlags==WO_OR, 
1baf0 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 74 65  the OR-clause te
1bb00 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  rm.  **.  ** Thi
1bb10 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75  s loop also figu
1bb20 72 65 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74  res out the nest
1bb30 69 6e 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62  ing order of tab
1bb40 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
1bb50 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a    ** clause..  *
1bb60 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
1bb70 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 54  (Bitmask)0;.  pT
1bb80 61 62 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73  abItem = pTabLis
1bb90 74 2d 3e 61 3b 0a 20 20 70 4c 65 76 65 6c 20 3d  t->a;.  pLevel =
1bba0 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e   pWInfo->a;.  an
1bbb0 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57  dFlags = ~0;.  W
1bbc0 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
1bbd0 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20  Optimizer Start 
1bbe0 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28  ***\n"));.  for(
1bbf0 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65  i=iFrom=0, pLeve
1bc00 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
1bc10 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1bc20 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
1bc30 20 20 20 57 68 65 72 65 43 6f 73 74 20 62 65 73     WhereCost bes
1bc40 74 50 6c 61 6e 3b 20 20 20 20 20 20 20 20 20 2f  tPlan;         /
1bc50 2a 20 4d 6f 73 74 20 65 66 66 69 63 69 65 6e 74  * Most efficient
1bc60 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66 61   plan seen so fa
1bc70 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  r */.    Index *
1bc80 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
1bc90 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f       /* Index fo
1bca0 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20  r FROM table at 
1bcb0 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20  pTabItem */.    
1bcc0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1bce0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1bcf0 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20  FROM tables */. 
1bd00 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 30     int bestJ = 0
1bd10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1bd20 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a  * The value of j
1bd30 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   */.    Bitmask 
1bd40 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1bd50 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76      /* Bitmask v
1bd60 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65  alue for j or be
1bd70 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  stJ */.    int o
1bd80 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nce = 0;        
1bd90 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
1bda0 68 65 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20  hen first table 
1bdb0 69 73 20 73 65 65 6e 20 2a 2f 0a 0a 20 20 20 20  is seen */..    
1bdc0 6d 65 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e  memset(&bestPlan
1bdd0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74  , 0, sizeof(best
1bde0 50 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74  Plan));.    best
1bdf0 50 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c  Plan.rCost = SQL
1be00 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20  ITE_BIG_DBL;.   
1be10 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54   for(j=iFrom, pT
1be20 61 62 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74  abItem=&pTabList
1be30 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69  ->a[j]; j<pTabLi
1be40 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70  st->nSrc; j++, p
1be50 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  TabItem++){.    
1be60 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72 64    int doNotReord
1be70 65 72 3b 20 20 2f 2a 20 54 72 75 65 20 69 66 20  er;  /* True if 
1be80 74 68 69 73 20 74 61 62 6c 65 20 73 68 6f 75 6c  this table shoul
1be90 64 20 6e 6f 74 20 62 65 20 72 65 6f 72 64 65 72  d not be reorder
1bea0 65 64 20 2a 2f 0a 20 20 20 20 20 20 57 68 65 72  ed */.      Wher
1beb0 65 43 6f 73 74 20 73 43 6f 73 74 3b 20 20 20 2f  eCost sCost;   /
1bec0 2a 20 43 6f 73 74 20 69 6e 66 6f 72 6d 61 74 69  * Cost informati
1bed0 6f 6e 20 66 72 6f 6d 20 62 65 73 74 49 6e 64 65  on from bestInde
1bee0 78 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 64 6f  x() */..      do
1bef0 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20 28 70  NotReorder =  (p
1bf00 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  TabItem->jointyp
1bf10 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
1bf20 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20 20  CROSS))!=0;.    
1bf30 20 20 69 66 28 20 6f 6e 63 65 20 26 26 20 64 6f    if( once && do
1bf40 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72 65  NotReorder ) bre
1bf50 61 6b 3b 0a 20 20 20 20 20 20 6d 20 3d 20 67 65  ak;.      m = ge
1bf60 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
1bf70 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
1bf80 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6d  r);.      if( (m
1bf90 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20   & notReady)==0 
1bfa0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  ){.        if( j
1bfb0 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b  ==iFrom ) iFrom+
1bfc0 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  +;.        conti
1bfd0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
1bfe0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49     assert( pTabI
1bff0 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66  tem->pTab );.#if
1c000 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c010 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1c020 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
1c030 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  l(pTabItem->pTab
1c040 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
1c050 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1c060 2a 70 56 74 61 62 49 64 78 3b 20 2f 2a 20 43 75  *pVtabIdx; /* Cu
1c070 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 69 6e  rrent virtual in
1c080 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  dex */.        s
1c090 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1c0a0 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20  o **ppIdxInfo = 
1c0b0 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49  &pWInfo->a[j].pI
1c0c0 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  dxInfo;.        
1c0d0 73 43 6f 73 74 2e 72 43 6f 73 74 20 3d 20 62 65  sCost.rCost = be
1c0e0 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70  stVirtualIndex(p
1c0f0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62  Parse, pWC, pTab
1c100 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a  Item, notReady,.
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c130 20 20 20 20 20 20 20 70 70 4f 72 64 65 72 42 79         ppOrderBy
1c140 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20   ? *ppOrderBy : 
1c150 30 2c 20 69 3d 3d 30 2c 0a 20 20 20 20 20 20 20  0, i==0,.       
1c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c180 70 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20  ppIdxInfo);.    
1c190 20 20 20 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 77      sCost.plan.w
1c1a0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56  sFlags = WHERE_V
1c1b0 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 20  IRTUALTABLE;.   
1c1c0 20 20 20 20 20 73 43 6f 73 74 2e 70 6c 61 6e 2e       sCost.plan.
1c1d0 75 2e 70 56 74 61 62 49 64 78 20 3d 20 70 56 74  u.pVtabIdx = pVt
1c1e0 61 62 49 64 78 20 3d 20 2a 70 70 49 64 78 49 6e  abIdx = *ppIdxIn
1c1f0 66 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  fo;.        if( 
1c200 70 56 74 61 62 49 64 78 20 26 26 20 70 56 74 61  pVtabIdx && pVta
1c210 62 49 64 78 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  bIdx->orderByCon
1c220 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 20 20 20  sumed ){.       
1c230 20 20 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73     sCost.plan.ws
1c240 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
1c250 52 54 55 41 4c 54 41 42 4c 45 20 7c 20 57 48 45  RTUALTABLE | WHE
1c260 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20  RE_ORDERBY;.    
1c270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43      }.        sC
1c280 6f 73 74 2e 70 6c 61 6e 2e 6e 45 71 20 3d 20 30  ost.plan.nEq = 0
1c290 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 53  ;.        if( (S
1c2a0 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e  QLITE_BIG_DBL/2.
1c2b0 30 29 3c 73 43 6f 73 74 2e 72 43 6f 73 74 20 29  0)<sCost.rCost )
1c2c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1c2d0 68 65 20 63 6f 73 74 20 69 73 20 6e 6f 74 20 61  he cost is not a
1c2e0 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 61 72  llowed to be lar
1c2f0 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ger than SQLITE_
1c300 42 49 47 5f 44 42 4c 20 28 74 68 65 0a 20 20 20  BIG_DBL (the.   
1c310 20 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 61 6c         ** inital
1c320 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74   value of lowest
1c330 43 6f 73 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f  Cost in this loo
1c340 70 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  p. If it is, the
1c350 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  n.          ** t
1c360 68 65 20 28 63 6f 73 74 3c 6c 6f 77 65 73 74 43  he (cost<lowestC
1c370 6f 73 74 29 20 74 65 73 74 20 62 65 6c 6f 77 20  ost) test below 
1c380 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72  will never be tr
1c390 75 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ue..          */
1c3a0 20 0a 20 20 20 20 20 20 20 20 20 20 73 43 6f 73   .          sCos
1c3b0 74 2e 72 43 6f 73 74 20 3d 20 28 53 51 4c 49 54  t.rCost = (SQLIT
1c3c0 45 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29 3b 0a  E_BIG_DBL/2.0);.
1c3d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c3e0 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20  }else .#endif.  
1c3f0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 62 65      {.        be
1c400 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
1c410 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e  pWC, pTabItem, n
1c420 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20  otReady,.       
1c430 20 20 20 20 20 20 20 20 20 20 20 28 69 3d 3d 30             (i==0
1c440 20 26 26 20 70 70 4f 72 64 65 72 42 79 29 20 3f   && ppOrderBy) ?
1c450 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20 30 2c   *ppOrderBy : 0,
1c460 20 26 73 43 6f 73 74 29 3b 0a 20 20 20 20 20 20   &sCost);.      
1c470 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  }.      if( once
1c480 3d 3d 30 20 7c 7c 20 73 43 6f 73 74 2e 72 43 6f  ==0 || sCost.rCo
1c490 73 74 3c 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73  st<bestPlan.rCos
1c4a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 6e 63  t ){.        onc
1c4b0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  e = 1;.        b
1c4c0 65 73 74 50 6c 61 6e 20 3d 20 73 43 6f 73 74 3b  estPlan = sCost;
1c4d0 0a 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d  .        bestJ =
1c4e0 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   j;.      }.    
1c4f0 20 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64    if( doNotReord
1c500 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  er ) break;.    
1c510 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e  }.    assert( on
1c520 63 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ce );.    assert
1c530 28 20 6e 6f 74 52 65 61 64 79 20 26 20 67 65 74  ( notReady & get
1c540 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
1c550 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a  TabList->a[bestJ
1c560 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ].iCursor) );.  
1c570 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
1c580 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c  ** Optimizer sel
1c590 65 63 74 73 20 74 61 62 6c 65 20 25 64 20 66 6f  ects table %d fo
1c5a0 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65  r loop %d\n", be
1c5b0 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  stJ,.           
1c5c0 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61  pLevel-pWInfo->a
1c5d0 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73  ));.    if( (bes
1c5e0 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
1c5f0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
1c600 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  BY)!=0 ){.      
1c610 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  *ppOrderBy = 0;.
1c620 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61      }.    andFla
1c630 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e 70  gs &= bestPlan.p
1c640 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20  lan.wsFlags;.   
1c650 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20   pLevel->plan = 
1c660 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20  bestPlan.plan;. 
1c670 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e 2e     if( bestPlan.
1c680 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1c690 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
1c6a0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49        pLevel->iI
1c6b0 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  dxCur = pParse->
1c6c0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  nTab++;.    }els
1c6d0 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
1c6e0 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20  >iIdxCur = -1;. 
1c6f0 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64     }.    notRead
1c700 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d  y &= ~getMask(pM
1c710 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
1c720 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73  ->a[bestJ].iCurs
1c730 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  or);.    pLevel-
1c740 3e 69 46 72 6f 6d 20 3d 20 62 65 73 74 4a 3b 0a  >iFrom = bestJ;.
1c750 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
1c760 61 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  at if the table 
1c770 73 63 61 6e 6e 65 64 20 62 79 20 74 68 69 73 20  scanned by this 
1c780 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 68  loop iteration h
1c790 61 64 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4e 44  ad an.    ** IND
1c7a0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 61  EXED BY clause a
1c7b0 74 74 61 63 68 65 64 20 74 6f 20 69 74 2c 20 74  ttached to it, t
1c7c0 68 61 74 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  hat the named in
1c7d0 64 65 78 20 69 73 20 62 65 69 6e 67 0a 20 20 20  dex is being.   
1c7e0 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 68 65   ** used for the
1c7f0 20 73 63 61 6e 2e 20 49 66 20 6e 6f 74 2c 20 74   scan. If not, t
1c800 68 65 6e 20 71 75 65 72 79 20 63 6f 6d 70 69 6c  hen query compil
1c810 61 74 69 6f 6e 20 68 61 73 20 66 61 69 6c 65 64  ation has failed
1c820 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20  ..    ** Return 
1c830 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  an error..    */
1c840 0a 20 20 20 20 70 49 64 78 20 3d 20 70 54 61 62  .    pIdx = pTab
1c850 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70  List->a[bestJ].p
1c860 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
1c870 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Idx ){.      if(
1c880 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e   (bestPlan.plan.
1c890 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1c8a0 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 7b 0a 20  INDEXED)==0 ){. 
1c8b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1c8c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1c8d0 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65 78  cannot use index
1c8e0 3a 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61  : %s", pIdx->zNa
1c8f0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
1c900 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
1c910 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
1c920 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
1c930 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1c940 73 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  se is used, the 
1c950 62 65 73 74 49 6e 64 65 78 28 29 20 66 75 6e 63  bestIndex() func
1c960 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20  tion is.        
1c970 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
1c980 20 66 69 6e 64 20 74 68 65 20 69 6e 64 65 78 20   find the index 
1c990 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
1c9a0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1c9b0 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  se.        ** if
1c9c0 20 69 74 20 66 69 6e 64 20 61 6e 20 69 6e 64 65   it find an inde
1c9d0 78 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20 20  x at all. */.   
1c9e0 20 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73       assert( bes
1c9f0 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64  tPlan.plan.u.pId
1ca00 78 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20 20 20  x==pIdx );.     
1ca10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57   }.    }.  }.  W
1ca20 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
1ca30 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68  Optimizer Finish
1ca40 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69  ed ***\n"));.  i
1ca50 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1ca60 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
1ca70 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
1ca80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1ca90 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e  e total query on
1caa0 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e  ly selects a sin
1cab0 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68  gle row, then th
1cac0 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20  e ORDER BY.  ** 
1cad0 63 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c 65  clause is irrele
1cae0 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  vant..  */.  if(
1caf0 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45   (andFlags & WHE
1cb00 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26  RE_UNIQUE)!=0 &&
1cb10 20 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20   ppOrderBy ){.  
1cb20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30    *ppOrderBy = 0
1cb30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1cb40 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
1cb50 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
1cb60 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
1cb70 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
1cb80 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
1cb90 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
1cba0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
1cbb0 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
1cbc0 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70  ..  ** The one-p
1cbd0 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e  ass algorithm on
1cbe0 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20  ly works if the 
1cbf0 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
1cc00 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68  straints.  ** th
1cc10 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
1cc20 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72  pdate a single r
1cc30 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ow..  */.  asser
1cc40 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
1cc50 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
1cc60 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
1cc70 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
1cc80 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46  );.  if( (wctrlF
1cc90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
1cca0 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
1ccb0 20 26 26 20 28 61 6e 64 46 6c 61 67 73 20 26 20   && (andFlags & 
1ccc0 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30  WHERE_UNIQUE)!=0
1ccd0 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   ){.    pWInfo->
1cce0 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20  okOnePass = 1;. 
1ccf0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
1cd00 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20  plan.wsFlags &= 
1cd10 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b  ~WHERE_IDX_ONLY;
1cd20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
1cd30 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
1cd40 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  e pTabList and a
1cd50 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63  ny indices selec
1cd60 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61  ted for.  ** sea
1cd70 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62  rching those tab
1cd80 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  les..  */.  sqli
1cd90 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1cda0 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b  ema(pParse, -1);
1cdb0 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63   /* Insert the c
1cdc0 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47  ookie verifier G
1cdd0 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  oto */.  for(i=0
1cde0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
1cdf0 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
1ce00 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  nSrc; i++, pLeve
1ce10 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  l++){.    Table 
1ce20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61  *pTab;     /* Ta
1ce30 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
1ce40 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20     int iDb;     
1ce50 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1ce60 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
1ce70 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  ing table/index 
1ce80 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
1ce90 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
1cea0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1ceb0 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
1cec0 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a      char *zMsg;.
1ced0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
1cee0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1cef0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1cf00 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1cf10 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1cf20 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1cf30 22 54 41 42 4c 45 20 25 73 22 2c 20 70 49 74 65  "TABLE %s", pIte
1cf40 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
1cf50 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
1cf60 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  as ){.        zM
1cf70 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
1cf80 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
1cf90 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c  %s AS %s", zMsg,
1cfa0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
1cfb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1cfc0 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
1cfd0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1cfe0 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a  _INDEXED)!=0 ){.
1cff0 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
1d000 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1d010 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 57 49 54  b, zMsg, "%s WIT
1d020 48 20 49 4e 44 45 58 20 25 73 22 2c 0a 20 20 20  H INDEX %s",.   
1d030 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 70 4c          zMsg, pL
1d040 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
1d050 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
1d060 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
1d070 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1d080 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
1d090 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
1d0a0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1d0b0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1d0c0 20 56 49 41 20 4d 55 4c 54 49 2d 49 4e 44 45 58   VIA MULTI-INDEX
1d0d0 20 55 4e 49 4f 4e 22 2c 20 7a 4d 73 67 29 3b 0a   UNION", zMsg);.
1d0e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d0f0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1d100 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f  lags & (WHERE_RO
1d110 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
1d120 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20  ID_RANGE) ){.   
1d130 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1d140 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1d150 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20  zMsg, "%s USING 
1d160 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d  PRIMARY KEY", zM
1d170 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  sg);.      }.#if
1d180 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d190 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1d1a0 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 70 4c      else if( (pL
1d1b0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1d1c0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
1d1d0 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
1d1e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
1d1f0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62  ndex_info *pVtab
1d200 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Idx = pLevel->pl
1d210 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20  an.u.pVtabIdx;. 
1d220 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
1d230 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1d240 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54  , zMsg, "%s VIRT
1d250 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
1d260 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20  %d:%s", zMsg,.  
1d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d280 20 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 4e    pVtabIdx->idxN
1d290 75 6d 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64  um, pVtabIdx->id
1d2a0 78 53 74 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  xStr);.      }.#
1d2b0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
1d2c0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1d2d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
1d2e0 45 52 42 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ERBY ){.        
1d2f0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1d300 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1d310 20 22 25 73 20 4f 52 44 45 52 20 42 59 22 2c 20   "%s ORDER BY", 
1d320 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zMsg);.      }. 
1d330 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d340 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
1d350 6c 61 69 6e 2c 20 69 2c 20 70 4c 65 76 65 6c 2d  lain, i, pLevel-
1d360 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a 4d 73 67 2c  >iFrom, 0, zMsg,
1d370 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
1d380 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1d390 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
1d3a0 4e 20 2a 2f 0a 20 20 20 20 70 54 61 62 49 74 65  N */.    pTabIte
1d3b0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
1d3c0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
1d3d0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
1d3e0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
1d3f0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1d400 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
1d410 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
1d420 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 28  hema);.    if( (
1d430 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
1d440 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
1d450 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  0 || pTab->pSele
1d460 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23  ct ) continue;.#
1d470 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d480 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1d490 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
1d4a0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
1d4b0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1d4c0 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
1d4d0 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
1d4e0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
1d4f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d500 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
1d510 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 0a 20  n, iCur, 0, 0,. 
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68         (const ch
1d540 61 72 2a 29 70 54 61 62 2d 3e 70 56 74 61 62 2c  ar*)pTab->pVtab,
1d550 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
1d560 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
1d570 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
1d580 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1d590 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
1d5a0 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72          && (wctr
1d5b0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
1d5c0 4d 49 54 5f 4f 50 45 4e 29 3d 3d 30 20 29 7b 0a  MIT_OPEN)==0 ){.
1d5d0 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70        int op = p
1d5e0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
1d5f0 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20   ? OP_OpenWrite 
1d600 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20  : OP_OpenRead;. 
1d610 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
1d620 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
1d630 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
1d640 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b   iDb, pTab, op);
1d650 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e  .      if( !pWIn
1d660 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
1d670 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20   pTab->nCol<BMS 
1d680 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
1d690 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
1d6a0 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
1d6b0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
1d6c0 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
1d6d0 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
1d6e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d6f0 43 68 61 6e 67 65 50 32 28 76 2c 20 73 71 6c 69  ChangeP2(v, sqli
1d700 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1d710 64 72 28 76 29 2d 32 2c 20 6e 29 3b 0a 20 20 20  dr(v)-2, n);.   
1d720 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
1d730 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
1d740 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1d750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
1d760 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
1d770 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
1d780 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
1d790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
1d7a0 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54  el->iTabCur = pT
1d7b0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
1d7c0 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
1d7d0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
1d7e0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
1d7f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  =0 ){.      Inde
1d800 78 20 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d  x *pIx = pLevel-
1d810 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20  >plan.u.pIdx;.  
1d820 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
1d830 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
1d840 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
1d850 70 49 78 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  pIx);.      int 
1d860 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
1d870 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
1d880 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53   assert( pIx->pS
1d890 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
1d8a0 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73  hema );.      as
1d8b0 73 65 72 74 28 20 69 49 64 78 43 75 72 3e 3d 30  sert( iIdxCur>=0
1d8c0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1d8d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d8e0 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
1d8f0 20 30 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e   0, pIx->nColumn
1d900 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
1d910 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1d920 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
1d930 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c  xCur, pIx->tnum,
1d940 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1d960 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  har*)pKey, P4_KE
1d970 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
1d980 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1d990 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d  t((v, "%s", pIx-
1d9a0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  >zName));.    }.
1d9b0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
1d9c0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
1d9d0 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  se, iDb);.  }.  
1d9e0 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
1d9f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1da00 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20  tAddr(v);..  /* 
1da10 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  Generate the cod
1da20 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72  e to do the sear
1da30 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74  ch.  Each iterat
1da40 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20  ion of the for. 
1da50 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67   ** loop below g
1da60 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f  enerates code fo
1da70 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65  r a single neste
1da80 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d  d loop of the VM
1da90 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20  .  ** program.. 
1daa0 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
1dab0 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
1dac0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
1dad0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
1dae0 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  .    notReady = 
1daf0 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  codeOneLoopStart
1db00 28 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63 74 72  (pWInfo, i, wctr
1db10 6c 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64 79  lFlags, notReady
1db20 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69  );.    pWInfo->i
1db30 43 6f 6e 74 69 6e 75 65 20 3d 20 70 57 49 6e 66  Continue = pWInf
1db40 6f 2d 3e 61 5b 69 5d 2e 61 64 64 72 43 6f 6e 74  o->a[i].addrCont
1db50 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
1db60 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f  LITE_TEST  /* Fo
1db70 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
1db80 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
1db90 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20   */.  /* Record 
1dba0 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  in the query pla
1dbb0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  n information ab
1dbc0 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  out the current 
1dbd0 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74  table.  ** and t
1dbe0 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  he index used to
1dbf0 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20 61   access it (if a
1dc00 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61 62  ny).  If the tab
1dc10 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  le itself.  ** i
1dc20 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20  s not used, its 
1dc30 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d  name is just '{}
1dc40 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20  '.  If no index 
1dc50 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65  is used.  ** the
1dc60 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64   index is listed
1dc70 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68   as "{}".  If th
1dc80 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
1dc90 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69   used the.  ** i
1dca0 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27  ndex name is '*'
1dcb0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1dcc0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
1dcd0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  rc; i++){.    ch
1dce0 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e  ar *z;.    int n
1dcf0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
1dd00 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
1dd10 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
1dd20 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
1dd30 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20  ->iFrom];.    z 
1dd40 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69  = pTabItem->zAli
1dd50 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  as;.    if( z==0
1dd60 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d   ) z = pTabItem-
1dd70 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  >pTab->zName;.  
1dd80 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
1dd90 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66  len30(z);.    if
1dda0 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a  ( n+nQPlan < siz
1ddb0 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72  eof(sqlite3_quer
1ddc0 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20  y_plan)-10 ){.  
1ddd0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
1dde0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1ddf0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b  HERE_IDX_ONLY ){
1de00 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1de10 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
1de20 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
1de30 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 6e  ", 2);.        n
1de40 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20  QPlan += 2;.    
1de50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1de60 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
1de70 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
1de80 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  an], z, n);.    
1de90 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b      nQPlan += n;
1dea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1deb0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
1dec0 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20  n[nQPlan++] = ' 
1ded0 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  ';.    }.    tes
1dee0 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70  tcase( pLevel->p
1def0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1df00 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a  ERE_ROWID_EQ );.
1df10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
1df20 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1df30 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
1df40 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20 69 66  _RANGE );.    if
1df50 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
1df60 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
1df70 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
1df80 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20  OWID_RANGE) ){. 
1df90 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
1dfa0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
1dfb0 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32  nQPlan], "* ", 2
1dfc0 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  );.      nQPlan 
1dfd0 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  += 2;.    }else 
1dfe0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
1dff0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1e000 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b  E_INDEXED)!=0 ){
1e010 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
1e020 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65 76 65  e3Strlen30(pLeve
1e030 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
1e040 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
1e050 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a  ( n+nQPlan < siz
1e060 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72  eof(sqlite3_quer
1e070 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20  y_plan)-2 ){.   
1e080 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
1e090 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
1e0a0 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d  nQPlan], pLevel-
1e0b0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e  >plan.u.pIdx->zN
1e0c0 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  ame, n);.       
1e0d0 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
1e0e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
1e0f0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
1e100 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
1e110 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1e120 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
1e130 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
1e140 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29  Plan], "{} ", 3)
1e150 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b  ;.      nQPlan +
1e160 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 3;.    }.  }. 
1e170 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30   while( nQPlan>0
1e180 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72   && sqlite3_quer
1e190 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d  y_plan[nQPlan-1]
1e1a0 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c  ==' ' ){.    sql
1e1b0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
1e1c0 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20  --nQPlan] = 0;. 
1e1d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65   }.  sqlite3_que
1e1e0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20  ry_plan[nQPlan] 
1e1f0 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20  = 0;.  nQPlan = 
1e200 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  0;.#endif /* SQL
1e210 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74  ITE_TEST // Test
1e220 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
1e230 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20  g use only */.. 
1e240 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63   /* Record the c
1e250 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72  ontinuation addr
1e260 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  ess in the Where
1e270 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
1e280 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e   Then.  ** clean
1e290 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a   up and return..
1e2a0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 57    */.  return pW
1e2b0 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  Info;..  /* Jump
1e2c0 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20   here if malloc 
1e2d0 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65  fails */.whereBe
1e2e0 67 69 6e 45 72 72 6f 72 3a 0a 20 20 77 68 65 72  ginError:.  wher
1e2f0 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
1e300 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  Info);.  return 
1e310 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
1e320 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  rate the end of 
1e330 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20  the WHERE loop. 
1e340 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e   See comments on
1e350 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72   .** sqlite3Wher
1e360 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64  eBegin() for add
1e370 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1e380 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
1e390 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65  ite3WhereEnd(Whe
1e3a0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
1e3b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1e3c0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1e3d0 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  e;.  Vdbe *v = p
1e3e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1e3f0 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65  int i;.  WhereLe
1e400 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53  vel *pLevel;.  S
1e410 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1e420 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
1e430 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
1e440 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1e450 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1e460 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
1e470 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71   code..  */.  sq
1e480 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f  lite3ExprClearCo
1e490 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
1e4a0 2c 20 2d 31 29 3b 0a 20 20 66 6f 72 28 69 3d 70  , -1);.  for(i=p
1e4b0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 3b  TabList->nSrc-1;
1e4c0 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
1e4d0 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
1e4e0 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c  o->a[i];.    sql
1e4f0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1e500 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
1e510 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69  addrCont);.    i
1e520 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f  f( pLevel->op!=O
1e530 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
1e540 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e550 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  2(v, pLevel->op,
1e560 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
1e570 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20  vel->p2);.      
1e580 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1e590 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
1e5a0 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  5);.    }.    if
1e5b0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
1e5c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1e5d0 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c  N_ABLE && pLevel
1e5e0 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a  ->u.in.nIn>0 ){.
1e5f0 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c        struct InL
1e600 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20  oop *pIn;.      
1e610 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c  int j;.      sql
1e620 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1e630 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
1e640 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
1e650 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e  for(j=pLevel->u.
1e660 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65  in.nIn, pIn=&pLe
1e670 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
1e680 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
1e690 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
1e6a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1e6b0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
1e6c0 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20  drInTop+1);.    
1e6d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e6e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
1e6f0 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
1e700 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20  ->addrInTop);.  
1e710 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e720 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
1e730 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a  ->addrInTop-1);.
1e740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1e750 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1e760 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
1e770 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Loop);.    }.   
1e780 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1e790 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
1e7a0 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
1e7b0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
1e7c0 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20  eftJoin ){.     
1e7d0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
1e7e0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1e7f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1e800 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69  IfPos, pLevel->i
1e810 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20  LeftJoin);.     
1e820 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e830 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
1e840 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
1e850 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
1e860 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64   if( pLevel->iId
1e870 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  xCur>=0 ){.     
1e880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e890 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
1e8a0 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ow, pLevel->iIdx
1e8b0 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
1e8c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e8d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1e8e0 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
1e8f0 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 73  rFirst);.      s
1e900 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1e910 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
1e920 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
1e930 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
1e940 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
1e950 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1e960 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
1e970 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
1e980 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1e990 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
1e9a0 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
1e9b0 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
1e9c0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
1e9d0 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
1e9e0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1e9f0 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  n..  */.  for(i=
1ea00 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
1ea10 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
1ea20 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76  >nSrc; i++, pLev
1ea30 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63  el++){.    struc
1ea40 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1ea50 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
1ea60 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
1ea70 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
1ea80 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
1ea90 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
1eaa0 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
1eab0 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
1eac0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
1ead0 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
1eae0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63  Tab->pSelect ) c
1eaf0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
1eb00 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
1eb10 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
1eb20 54 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20  T_CLOSE)==0 ){. 
1eb30 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
1eb40 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28  ->okOnePass && (
1eb50 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1eb60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
1eb70 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
1eb80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1eb90 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
1eba0 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
1ebb0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
1ebc0 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 76 65        if( (pLeve
1ebd0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1ebe0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
1ebf0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
1ec00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1ec10 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c  (v, OP_Close, pL
1ec20 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
1ec30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ec40 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63     /* If this sc
1ec50 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  an uses an index
1ec60 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75 62 73  , make code subs
1ec70 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61  titutions to rea
1ec80 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72  d data.    ** fr
1ec90 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  om the index in 
1eca0 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68  preference to th
1ecb0 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d  e table. Sometim
1ecc0 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a 20  es, this means. 
1ecd0 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
1ece0 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20 72 65  need never be re
1ecf0 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20 69 73  ad from. This is
1ed00 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62   a performance b
1ed10 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20  oost,.    ** as 
1ed20 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c 20 77  the vdbe level w
1ed30 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65 20 74  aits until the t
1ed40 61 62 6c 65 20 69 73 20 72 65 61 64 20 62 65 66  able is read bef
1ed50 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  ore actually.   
1ed60 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68 65 20   ** seeking the 
1ed70 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20  table cursor to 
1ed80 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72 72 65  the record corre
1ed90 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
1eda0 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70  current.    ** p
1edb0 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 69  osition in the i
1edc0 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  ndex..    ** .  
1edd0 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68    ** Calls to th
1ede0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
1edf0 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69   in between sqli
1ee00 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e  te3WhereBegin an
1ee10 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  d.    ** sqlite3
1ee20 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61  WhereEnd will ha
1ee30 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20  ve created code 
1ee40 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
1ee50 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
1ee60 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
1ee70 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20   loop scans all 
1ee80 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e  that code lookin
1ee90 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20  g for opcodes.  
1eea0 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65    ** that refere
1eeb0 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e  nce the table an
1eec0 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20  d converts them 
1eed0 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61  into opcodes tha
1eee0 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  t.    ** referen
1eef0 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ce the index..  
1ef00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 4c    */.    if( (pL
1ef10 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1ef20 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
1ef30 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ED)!=0 ){.      
1ef40 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a  int k, j, last;.
1ef50 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
1ef60 70 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  p;.      Index *
1ef70 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
1ef80 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20  lan.u.pIdx;.    
1ef90 20 20 69 6e 74 20 75 73 65 49 6e 64 65 78 4f 6e    int useIndexOn
1efa0 6c 79 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ly = pLevel->pla
1efb0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1efc0 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 20  E_IDX_ONLY;..   
1efd0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21     assert( pIdx!
1efe0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20  =0 );.      pOp 
1eff0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
1f000 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54  Op(v, pWInfo->iT
1f010 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20  op);.      last 
1f020 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1f030 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1f040 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d     for(k=pWInfo-
1f050 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b  >iTop; k<last; k
1f060 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
1f070 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21      if( pOp->p1!
1f080 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
1f090 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1f0a0 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70       if( pOp->op
1f0b0 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
1f0c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
1f0d0 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43  (j=0; j<pIdx->nC
1f0e0 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
1f0f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
1f100 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  ->p2==pIdx->aiCo
1f110 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  lumn[j] ){.     
1f120 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32           pOp->p2
1f130 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
1f140 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
1f150 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1f170 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1f180 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1f190 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
1f1a0 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 7c 7c 20  useIndexOnly || 
1f1b0 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  j<pIdx->nColumn)
1f1c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1f1d0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
1f1e0 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
1f1f0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
1f200 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
1f210 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
1f220 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
1f230 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
1f240 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
1f250 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77  code==OP_NullRow
1f260 20 26 26 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79   && useIndexOnly
1f270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
1f280 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
1f290 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oop;.        }. 
1f2a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1f2b0 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65  ..  /* Final cle
1f2c0 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 77 68 65 72  anup.  */.  wher
1f2d0 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
1f2e0 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Info);.  return;
1f2f0 0a 7d 0a                                         .}.